From 1f1250c076063f4d2e1226f836ca2a0a0b298845 Mon Sep 17 00:00:00 2001 From: parker Date: Sun, 22 Jun 2025 15:11:55 +0100 Subject: [PATCH] fix: edge bounding issues --- src/gui/network/Network.cpp | 26 +++++++++++------ src/gui/network/Network.h | 7 ++++- src/gui/network/NodeEdgeGraphic.cpp | 44 +++++++++++++++++++++++------ src/gui/network/NodeEdgeGraphic.h | 9 ++++++ src/gui/network/SocketGraphic.cpp | 13 +++++---- 5 files changed, 76 insertions(+), 23 deletions(-) diff --git a/src/gui/network/Network.cpp b/src/gui/network/Network.cpp index 909bf0a..1358a20 100644 --- a/src/gui/network/Network.cpp +++ b/src/gui/network/Network.cpp @@ -54,8 +54,7 @@ Network::Network(QWidget* parent) node4->setPos(50, -200); scene_->addItem(node4); - NodeEdgeGraphic* edge1 = new NodeEdgeGraphic(node1->getOutput(0), node2->getInput(0)); - scene_->addItem(edge1); + // scene_->addItem(new NodeEdgeGraphic(node1->getOutput(0), node2->getInput(0))); // node1->addEdge(edge1); // node2->addEdge(edge1); @@ -74,6 +73,16 @@ void Network::resizeEvent(QResizeEvent *event) this->setMask(region); } +void Network::deleteEdge(QGraphicsItem* edge) +{ + if(prevHoverItem_==edge) + { + prevHoverItem_=nullptr; + } + scene_->removeItem(edge); + delete edge; +} + void Network::leftMousePress(QMouseEvent *event) { Qt::KeyboardModifiers mods = event->modifiers(); @@ -87,12 +96,7 @@ void Network::leftMousePress(QMouseEvent *event) // delete edges if(mods & Qt::ControlModifier && clickedEdge) { - scene_->removeItem(clickedEdge); - if(prevHoverItem_==clickedEdge) - { - prevHoverItem_=nullptr; - } - delete clickedEdge; + deleteEdge(clickedEdge); } else if(clickedSocket) { @@ -125,6 +129,7 @@ void Network::socketClicked(SocketGraphic* socket, QMouseEvent *event) else if (socket->getIO()!=startSocket_->getIO()) { NodeEdgeGraphic* newEdge = new NodeEdgeGraphic(startSocket_, socket); + newEdge->setPos(startSocket_->scenePos(), socket->scenePos()); scene_->addItem(newEdge); destroyFloatingEdge(); } @@ -219,10 +224,14 @@ void Network::highlightEdge(QGraphicsItem* edge, bool state) { static_cast(edge)->setColor(QColor("red")); prevHoverItem_=edge; + // NOTE: sloppy fix for color not updating + view_->update(); } else { static_cast(edge)->useDefaultColor(); + // NOTE: sloppy fix for color not updating + view_->update(); } } @@ -230,6 +239,7 @@ void Network::highlightEdge(QGraphicsItem* edge, bool state) void Network::keyReleaseEvent(QKeyEvent *event) { + std::cout << "released\n"; // modifiers Qt::KeyboardModifiers mods = event->modifiers(); bool ctrlMod = mods & Qt::ControlModifier; diff --git a/src/gui/network/Network.h b/src/gui/network/Network.h index cebec74..12bb403 100644 --- a/src/gui/network/Network.h +++ b/src/gui/network/Network.h @@ -1,5 +1,6 @@ #pragma once #include +#include #include #include #include "gui/network/NetworkGraphicsView.h" @@ -8,6 +9,7 @@ #include "gui/network/SocketGraphic.h" #include "gui/network/FloatingEdgeGraphic.h" #include +#include class Network : public QWidget @@ -26,11 +28,14 @@ private: SocketGraphic* startSocket_=nullptr; QGraphicsItem* prevHoverItem_=nullptr; - QList prevHoverItems_; + // QPointer prevHoverItem_=nullptr; + // std::shared_ptr prevHoverItem_=nullptr; + // QList prevHoverItems_; void keyPressEvent(QKeyEvent *event) override; void keyReleaseEvent(QKeyEvent *event) override; void destroyFloatingEdge(); + void deleteEdge(QGraphicsItem* edge); void highlightEdge(QGraphicsItem* edge, bool state); diff --git a/src/gui/network/NodeEdgeGraphic.cpp b/src/gui/network/NodeEdgeGraphic.cpp index a012670..2949fe8 100644 --- a/src/gui/network/NodeEdgeGraphic.cpp +++ b/src/gui/network/NodeEdgeGraphic.cpp @@ -21,24 +21,50 @@ NodeEdgeGraphic::~NodeEdgeGraphic() socket2_->removeEdge(this); } +void NodeEdgeGraphic::updatePath() +{ + path_.clear(); + path_.moveTo(pos1_); + path_.lineTo(pos2_); + +} + +void NodeEdgeGraphic::setPos(QPointF pos1, QPointF pos2) +{ + pos1_ = pos1; + pos2_ = pos2; + updatePath(); + // prepareGeometryChange(); +} + +void NodeEdgeGraphic::setStartPos(QPointF pos) +{ + pos1_ = pos; + updatePath(); + // prepareGeometryChange(); +} + +void NodeEdgeGraphic::setEndPos(QPointF pos) +{ + pos2_ = pos; + updatePath(); + // prepareGeometryChange(); +} QRectF NodeEdgeGraphic::boundingRect() const { // std::cout << "bounds set" << socket1_->scenePos().x() << " " << socket1_->scenePos().y() << " " << socket2_->scenePos().x() << " " << socket2_->scenePos().y() << "\n"; - auto boundRect = QRectF(socket1_->scenePos(), socket2_->scenePos()); - return boundRect; + QRectF boundRect_ = QRectF(pos1_, pos2_).normalized(); + return boundRect_; } QPainterPath NodeEdgeGraphic::shape() const{ // FIX: shape not changing with node position - QPainterPath path; - // std::cout << "setting shape to: " << socket1_->scenePos().x() << " " << socket2_->scenePos().x() <<"\n"; - path.moveTo(socket1_->scenePos()); - path.lineTo(socket2_->scenePos()); + std::cout << "setting shape to: " << socket1_->scenePos().x() << " " << socket2_->scenePos().x() <<"\n"; QPainterPathStroker stroker; - stroker.setWidth(10); - return stroker.createStroke(path); + stroker.setWidth(40); + return stroker.createStroke(path_); } void NodeEdgeGraphic::setColor(QColor color) @@ -59,7 +85,7 @@ void NodeEdgeGraphic::paint(QPainter *painter, const QStyleOptionGraphicsItem *o std::cout << "painting\n"; pen_.setCapStyle(Qt::RoundCap); painter->setPen(pen_); - painter->drawLine(socket1_->scenePos(),socket2_->scenePos()); + painter->drawPath(path_); } diff --git a/src/gui/network/NodeEdgeGraphic.h b/src/gui/network/NodeEdgeGraphic.h index 2611242..84fd34c 100644 --- a/src/gui/network/NodeEdgeGraphic.h +++ b/src/gui/network/NodeEdgeGraphic.h @@ -16,6 +16,9 @@ public: QPainterPath shape() const override; void setColor(QColor color); void useDefaultColor(); + void setPos(QPointF pos1, QPointF pos2); + void setStartPos(QPointF pos); + void setEndPos(QPointF pos); private: SocketGraphic* socket1_; @@ -23,5 +26,11 @@ private: QColor color_; QColor defaultColor_; QPen pen_; + QPointF pos1_; + QPointF pos2_; + QPainterPath path_; + QRectF boundRect_; + + void updatePath(); }; diff --git a/src/gui/network/SocketGraphic.cpp b/src/gui/network/SocketGraphic.cpp index a680c65..c50e55c 100644 --- a/src/gui/network/SocketGraphic.cpp +++ b/src/gui/network/SocketGraphic.cpp @@ -21,8 +21,10 @@ void SocketGraphic::addEdge(NodeEdgeGraphic* edge) void SocketGraphic::removeEdge(NodeEdgeGraphic* edge) { - edges_.erase(edge); std::cout << "removing edge\n"; + std::cout << "before size: " << edges_.size() << "\n"; + edges_.erase(edge); + std::cout << "after size: " << edges_.size() << "\n"; // auto it = find(edges_.begin(), edges_.end(), edge); // if(it!=edges_.end()) // { @@ -35,10 +37,11 @@ void SocketGraphic::posChanged(QPointF pos) { std::cout << "socket pos changed\n"; // - // for(auto* edge : edges_) - // { - // edge->prepareGeometryChange(); - // } + for(auto* edge : edges_) + { + // edge->setPos(startSocket_->scenePos(), socket->scenePos()); + edge->setStartPos(this->scenePos()); + } }