feat: fix socket connections
This commit is contained in:
@@ -35,7 +35,6 @@ void FloatingEdgeGraphic::paint(QPainter *painter, const QStyleOptionGraphicsIte
|
|||||||
QPointF pos1 = socket1_->getIO()==enzo::nt::SocketIOType::Input ? socket1_->scenePos() : floatPos_;
|
QPointF pos1 = socket1_->getIO()==enzo::nt::SocketIOType::Input ? socket1_->scenePos() : floatPos_;
|
||||||
QPointF pos2 = socket1_->getIO()==enzo::nt::SocketIOType::Input ? floatPos_ : socket1_->scenePos();
|
QPointF pos2 = socket1_->getIO()==enzo::nt::SocketIOType::Input ? floatPos_ : socket1_->scenePos();
|
||||||
float dist = std::sqrt(std::pow(pos1.x()-pos2.x(),2)+std::pow(pos1.y()-pos2.y(),2));
|
float dist = std::sqrt(std::pow(pos1.x()-pos2.x(),2)+std::pow(pos1.y()-pos2.y(),2));
|
||||||
std::cout << "dist: " << dist << "\n";
|
|
||||||
float cubicStrength = dist*0.5;
|
float cubicStrength = dist*0.5;
|
||||||
cubicStrength = std::clamp(cubicStrength, 0.0f, 40.0f);
|
cubicStrength = std::clamp(cubicStrength, 0.0f, 40.0f);
|
||||||
QPainterPath path;
|
QPainterPath path;
|
||||||
|
|||||||
@@ -97,7 +97,12 @@ void Network::leftMousePressed(QMouseEvent *event)
|
|||||||
// socket logic
|
// socket logic
|
||||||
else if(clickedSocket)
|
else if(clickedSocket)
|
||||||
{
|
{
|
||||||
socketClicked(static_cast<SocketGraphic*>(clickedSocket), event);
|
// find closest socket
|
||||||
|
clickedSocket = closestItemOfType<SocketGraphic>(clickedItems, view_->mapToScene(event->pos()));
|
||||||
|
if(clickedSocket)
|
||||||
|
{
|
||||||
|
socketClicked(static_cast<SocketGraphic*>(clickedSocket), event);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// floating edge
|
// floating edge
|
||||||
else if(floatingEdge_)
|
else if(floatingEdge_)
|
||||||
@@ -202,7 +207,14 @@ void Network::mouseMoved(QMouseEvent *event)
|
|||||||
|
|
||||||
if(floatingEdge_)
|
if(floatingEdge_)
|
||||||
{
|
{
|
||||||
if(QGraphicsItem* hoverSocket = itemOfType<SocketGraphic>(hoverItems); hoverSocket && hoverSocket!=startSocket_)
|
if(
|
||||||
|
SocketGraphic* hoverSocket = static_cast<SocketGraphic*>(closestItemOfType<SocketGraphic>(hoverItems, view_->mapToScene(event->pos())));
|
||||||
|
hoverSocket &&
|
||||||
|
hoverSocket!=startSocket_ &&
|
||||||
|
hoverSocket->getIO()!=startSocket_->getIO() &&
|
||||||
|
hoverSocket->getOpId()!=startSocket_->getOpId()
|
||||||
|
|
||||||
|
)
|
||||||
{
|
{
|
||||||
floatingEdge_->setFloatPos(hoverSocket->scenePos());
|
floatingEdge_->setFloatPos(hoverSocket->scenePos());
|
||||||
}
|
}
|
||||||
@@ -363,7 +375,11 @@ void Network::mouseReleaseEvent(QMouseEvent *event)
|
|||||||
}
|
}
|
||||||
else if(floatingEdge_ && hoverSocket)
|
else if(floatingEdge_ && hoverSocket)
|
||||||
{
|
{
|
||||||
socketClicked(static_cast<SocketGraphic*>(hoverSocket), event);
|
hoverSocket = closestItemOfType<SocketGraphic>(hoverItems, view_->mapToScene(event->pos()));
|
||||||
|
if(hoverSocket)
|
||||||
|
{
|
||||||
|
socketClicked(static_cast<SocketGraphic*>(hoverSocket), event);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
|
#include <iterator>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <qgraphicsitem.h>
|
#include <qgraphicsitem.h>
|
||||||
|
#include <qpoint.h>
|
||||||
#include <typeinfo>
|
#include <typeinfo>
|
||||||
#include "Engine/Network/NetworkManager.h"
|
#include "Engine/Network/NetworkManager.h"
|
||||||
#include "Engine/Types.h"
|
#include "Engine/Types.h"
|
||||||
@@ -82,6 +84,39 @@ private:
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
QGraphicsItem* closestItemOfType(QList<QGraphicsItem*> items, QPointF centerPos)
|
||||||
|
{
|
||||||
|
std::vector <QGraphicsItem*> filteredItems;
|
||||||
|
for(QGraphicsItem* item : items)
|
||||||
|
{
|
||||||
|
if(item && typeid(*item)==typeid(T))
|
||||||
|
{
|
||||||
|
filteredItems.push_back(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(filteredItems.size()==0) return nullptr;
|
||||||
|
if(filteredItems.size()==1) return filteredItems.at(0);
|
||||||
|
|
||||||
|
QGraphicsItem* closestItem=filteredItems.at(0);
|
||||||
|
float closestDist=QLineF(closestItem->scenePos(), centerPos).length();
|
||||||
|
|
||||||
|
for(size_t i=1; i<filteredItems.size(); ++i)
|
||||||
|
{
|
||||||
|
QGraphicsItem* item = filteredItems.at(i);
|
||||||
|
auto currentDist = QLineF(item->scenePos(), centerPos).length();
|
||||||
|
if(currentDist < closestDist)
|
||||||
|
{
|
||||||
|
closestItem = item;
|
||||||
|
closestDist = currentDist;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return closestItem;
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void resizeEvent(QResizeEvent *event) override;
|
void resizeEvent(QResizeEvent *event) override;
|
||||||
void mouseReleaseEvent(QMouseEvent *event) override;
|
void mouseReleaseEvent(QMouseEvent *event) override;
|
||||||
|
|||||||
Reference in New Issue
Block a user