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 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));
|
||||
std::cout << "dist: " << dist << "\n";
|
||||
float cubicStrength = dist*0.5;
|
||||
cubicStrength = std::clamp(cubicStrength, 0.0f, 40.0f);
|
||||
QPainterPath path;
|
||||
|
||||
@@ -97,7 +97,12 @@ void Network::leftMousePressed(QMouseEvent *event)
|
||||
// socket logic
|
||||
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
|
||||
else if(floatingEdge_)
|
||||
@@ -202,7 +207,14 @@ void Network::mouseMoved(QMouseEvent *event)
|
||||
|
||||
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());
|
||||
}
|
||||
@@ -363,7 +375,11 @@ void Network::mouseReleaseEvent(QMouseEvent *event)
|
||||
}
|
||||
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
|
||||
#include <QWidget>
|
||||
#include <iterator>
|
||||
#include <memory>
|
||||
#include <qgraphicsitem.h>
|
||||
#include <qpoint.h>
|
||||
#include <typeinfo>
|
||||
#include "Engine/Network/NetworkManager.h"
|
||||
#include "Engine/Types.h"
|
||||
@@ -82,6 +84,39 @@ private:
|
||||
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:
|
||||
void resizeEvent(QResizeEvent *event) override;
|
||||
void mouseReleaseEvent(QMouseEvent *event) override;
|
||||
|
||||
Reference in New Issue
Block a user