From 58ac608f8437f372955024fb8c2b2aa19f32b848 Mon Sep 17 00:00:00 2001 From: parker Date: Sat, 5 Jul 2025 20:20:56 +0100 Subject: [PATCH] feat: fix socket connections --- src/gui/network/FloatingEdgeGraphic.cpp | 1 - src/gui/network/Network.cpp | 22 +++++++++++++--- src/gui/network/Network.h | 35 +++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 4 deletions(-) diff --git a/src/gui/network/FloatingEdgeGraphic.cpp b/src/gui/network/FloatingEdgeGraphic.cpp index 3f85983..1cf7718 100644 --- a/src/gui/network/FloatingEdgeGraphic.cpp +++ b/src/gui/network/FloatingEdgeGraphic.cpp @@ -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; diff --git a/src/gui/network/Network.cpp b/src/gui/network/Network.cpp index d0a73dc..dbe15bb 100644 --- a/src/gui/network/Network.cpp +++ b/src/gui/network/Network.cpp @@ -97,7 +97,12 @@ void Network::leftMousePressed(QMouseEvent *event) // socket logic else if(clickedSocket) { - socketClicked(static_cast(clickedSocket), event); + // find closest socket + clickedSocket = closestItemOfType(clickedItems, view_->mapToScene(event->pos())); + if(clickedSocket) + { + socketClicked(static_cast(clickedSocket), event); + } } // floating edge else if(floatingEdge_) @@ -202,7 +207,14 @@ void Network::mouseMoved(QMouseEvent *event) if(floatingEdge_) { - if(QGraphicsItem* hoverSocket = itemOfType(hoverItems); hoverSocket && hoverSocket!=startSocket_) + if( + SocketGraphic* hoverSocket = static_cast(closestItemOfType(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(hoverSocket), event); + hoverSocket = closestItemOfType(hoverItems, view_->mapToScene(event->pos())); + if(hoverSocket) + { + socketClicked(static_cast(hoverSocket), event); + } } } } diff --git a/src/gui/network/Network.h b/src/gui/network/Network.h index 50b6a0d..704adc1 100644 --- a/src/gui/network/Network.h +++ b/src/gui/network/Network.h @@ -1,7 +1,9 @@ #pragma once #include +#include #include #include +#include #include #include "Engine/Network/NetworkManager.h" #include "Engine/Types.h" @@ -82,6 +84,39 @@ private: return nullptr; } + template + QGraphicsItem* closestItemOfType(QList items, QPointF centerPos) + { + std::vector 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; iscenePos(), centerPos).length(); + if(currentDist < closestDist) + { + closestItem = item; + closestDist = currentDist; + } + + } + + return closestItem; + } + protected: void resizeEvent(QResizeEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override;