From e1b88b5fdcea7ff9f36101bbcbb9adc6255913de Mon Sep 17 00:00:00 2001 From: parker Date: Sat, 21 Jun 2025 01:11:15 +0100 Subject: [PATCH] feat: add floating edge --- CMakeLists.txt | 1 + build.sh | 2 +- src/gui/network/FloatingEdgeGraphic.cpp | 29 +++++++++++++++ src/gui/network/FloatingEdgeGraphic.h | 21 +++++++++++ src/gui/network/Network.cpp | 48 +++++++++++++++++++------ src/gui/network/Network.h | 12 +++++++ src/gui/network/NetworkGraphicsView.cpp | 44 ++++++++++++++++++----- src/gui/network/NetworkGraphicsView.h | 9 ++++- src/gui/network/NodeEdgeGraphic.cpp | 1 - 9 files changed, 145 insertions(+), 22 deletions(-) create mode 100644 src/gui/network/FloatingEdgeGraphic.cpp create mode 100644 src/gui/network/FloatingEdgeGraphic.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 8782d5c..de34fb8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,6 +25,7 @@ qt_add_executable(${AppExec} src/gui/network/NodeGraphic.cpp src/gui/network/SocketGraphic.cpp src/gui/network/NodeEdgeGraphic.cpp + src/gui/network/FloatingEdgeGraphic.cpp ) target_link_libraries(${AppExec} PRIVATE Qt6::Core Qt6::Widgets) diff --git a/build.sh b/build.sh index 2c43756..6c53ec8 100755 --- a/build.sh +++ b/build.sh @@ -2,5 +2,5 @@ mkdir -p build cd build -cmake -G Ninja .. +cmake -DCMAKE_BUILD_TYPE=Debug -G Ninja .. ninja diff --git a/src/gui/network/FloatingEdgeGraphic.cpp b/src/gui/network/FloatingEdgeGraphic.cpp new file mode 100644 index 0000000..76c2e84 --- /dev/null +++ b/src/gui/network/FloatingEdgeGraphic.cpp @@ -0,0 +1,29 @@ +#include "gui/network/FloatingEdgeGraphic.h" +#include +#include "gui/network/SocketGraphic.h" +#include +#include + +FloatingEdgeGraphic::FloatingEdgeGraphic(SocketGraphic* socket1, QGraphicsItem *parent) +: QGraphicsItem(parent), socket1_{socket1} +{ + floatPos_ = socket1_->scenePos(); + setZValue(-1); +} + +QRectF FloatingEdgeGraphic::boundingRect() const +{ + // TODO: fix + auto boundRect = QRect(10,10,10,10); + return boundRect; +} + +void FloatingEdgeGraphic::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + painter->setPen(QPen("white")); + painter->drawLine(socket1_->scenePos(),floatPos_); + +} + +void FloatingEdgeGraphic::setFloatPos(QPointF floatPos) { floatPos_ = floatPos; } + diff --git a/src/gui/network/FloatingEdgeGraphic.h b/src/gui/network/FloatingEdgeGraphic.h new file mode 100644 index 0000000..ead9399 --- /dev/null +++ b/src/gui/network/FloatingEdgeGraphic.h @@ -0,0 +1,21 @@ +#pragma once +#include +#include "gui/network/SocketGraphic.h" + +#include + +class FloatingEdgeGraphic +: public QGraphicsItem +{ +public: + FloatingEdgeGraphic(SocketGraphic* socket1, QGraphicsItem *parent = nullptr); + QRectF boundingRect() const override; + + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; + void setFloatPos(QPointF floatPos); + +private: + SocketGraphic* socket1_; + QPointF floatPos_; +}; + diff --git a/src/gui/network/Network.cpp b/src/gui/network/Network.cpp index 7717ef9..3752170 100644 --- a/src/gui/network/Network.cpp +++ b/src/gui/network/Network.cpp @@ -1,13 +1,16 @@ #include "gui/network/Network.h" -#include "gui/network/NetworkGraphicsView.h" #include "gui/network/NodeEdgeGraphic.h" +#include "gui/network/NetworkGraphicsView.h" #include "gui/network/NetworkGraphicsScene.h" #include "gui/network/NodeGraphic.h" +#include "gui/network/FloatingEdgeGraphic.h" #include #include #include +#include Network::Network(QWidget* parent) +: QWidget(parent) { mainLayout_ = new QVBoxLayout(parent); @@ -16,33 +19,58 @@ Network::Network(QWidget* parent) this->setLayout(mainLayout_); - NetworkGraphicsScene* scene = new NetworkGraphicsScene(); - NetworkGraphicsView* view = new NetworkGraphicsView(parent, scene); + scene_ = new NetworkGraphicsScene(); + view_ = new NetworkGraphicsView(this, this, scene_); QPen greenPen = QPen(Qt::green); greenPen.setWidth(6); - auto* rect1 = scene->addRect(50, 50, 100, 100, greenPen); + auto* rect1 = scene_->addRect(50, 50, 100, 100, greenPen); rect1->setFlag(QGraphicsItem::ItemIsMovable); - auto* rect2 = scene->addRect(80, 120, 100, 100, greenPen); + auto* rect2 = scene_->addRect(80, 120, 100, 100, greenPen); rect2->setFlag(QGraphicsItem::ItemIsMovable); - auto* rect3 = scene->addRect(80, -120, 100, 100, greenPen); + auto* rect3 = scene_->addRect(80, -120, 100, 100, greenPen); rect3->setFlag(QGraphicsItem::ItemIsMovable); NodeGraphic* node1 = new NodeGraphic(); - scene->addItem(node1); + node1->setPos(-50, -50); + scene_->addItem(node1); NodeGraphic* node2 = new NodeGraphic(); - scene->addItem(node2); + node2->setPos(50, 50); + scene_->addItem(node2); NodeEdgeGraphic* edge1 = new NodeEdgeGraphic(node1->getOutput(0), node2->getInput(0)); - scene->addItem(edge1); + scene_->addItem(edge1); node1->addEdge(edge1); node2->addEdge(edge1); - mainLayout_->addWidget(view); + + mainLayout_->addWidget(view_); } + +void Network::socketClicked(SocketGraphic* socket) +{ + std::cout << "socket clicked\n"; + if(!floatingEdge_) + { + std::cout << "creating floating edge\n"; + floatingEdge_ = new FloatingEdgeGraphic(socket); + scene_->addItem(floatingEdge_); + } +} + + +void Network::mouseMoved(QMouseEvent *event) +{ + if(floatingEdge_) + { + floatingEdge_->setFloatPos(view_->mapToScene(event->pos())); + floatingEdge_->update(); + } +} + diff --git a/src/gui/network/Network.h b/src/gui/network/Network.h index b169e99..73ffbe1 100644 --- a/src/gui/network/Network.h +++ b/src/gui/network/Network.h @@ -1,11 +1,23 @@ #pragma once #include +#include "gui/network/NetworkGraphicsView.h" +#include "gui/network/NetworkGraphicsScene.h" +#include "gui/network/SocketGraphic.h" +#include "gui/network/FloatingEdgeGraphic.h" class Network : public QWidget { public: Network(QWidget* parent = nullptr); + void socketClicked(SocketGraphic* socket); + void mouseMoved(QMouseEvent *event); private: QLayout* mainLayout_; + NetworkGraphicsScene* scene_; + NetworkGraphicsView* view_; + FloatingEdgeGraphic* floatingEdge_=nullptr; + + +protected: }; diff --git a/src/gui/network/NetworkGraphicsView.cpp b/src/gui/network/NetworkGraphicsView.cpp index 6ff879a..95fce00 100644 --- a/src/gui/network/NetworkGraphicsView.cpp +++ b/src/gui/network/NetworkGraphicsView.cpp @@ -1,14 +1,20 @@ #include "gui/network/NetworkGraphicsView.h" #include +#include "gui/network/Network.h" #include "gui/network/NetworkGraphicsScene.h" +#include "gui/network/SocketGraphic.h" #include #include #include +#include +#include +#include -NetworkGraphicsView::NetworkGraphicsView(QWidget *parent, QGraphicsScene* scene) -: QGraphicsView(parent) +NetworkGraphicsView::NetworkGraphicsView(QWidget *parent, Network* network, QGraphicsScene* scene) +: QGraphicsView(parent), scene_{scene}, network_{network} { - setScene(scene); + setScene(scene_); + setMouseTracking(true); initUI(); @@ -31,6 +37,10 @@ void NetworkGraphicsView::initUI() void NetworkGraphicsView::mousePressEvent(QMouseEvent *event) { + if( event->buttons() & Qt::LeftButton) + { + leftMousePress(event); + } if( event->button() == Qt::MiddleButton ) @@ -43,6 +53,19 @@ void NetworkGraphicsView::mousePressEvent(QMouseEvent *event) QGraphicsView::mousePressEvent(event); } + +void NetworkGraphicsView::leftMousePress(QMouseEvent *event) +{ + QGraphicsItem* itemClicked = itemAt(event->pos()); + bool isSocket = itemClicked && typeid(*itemClicked)==typeid(SocketGraphic); + if(isSocket) + { + std::cout << "SOCKET!\n"; + network_->socketClicked(static_cast(itemClicked)); + } + +} + // void NetworkView::mouseReleaseEvent(QMouseEvent *event) // { // if( @@ -53,26 +76,29 @@ void NetworkGraphicsView::mousePressEvent(QMouseEvent *event) // } // } -void NetworkGraphicsView::mouseMoveEvent(QMouseEvent *mouseEvent) +void NetworkGraphicsView::mouseMoveEvent(QMouseEvent *event) { + network_->mouseMoved(event); - if( mouseEvent->buttons() & Qt::MiddleButton) + // pan view + if( event->buttons() & Qt::MiddleButton) { - QPointF pos = mouseEvent->pos(); + QPointF pos = event->pos(); QPointF delta = pos-panStartPos; float speed = 1.0f; horizontalScrollBar()->setValue(horizontalScrollBar()->value() - delta.x()); verticalScrollBar()->setValue(verticalScrollBar()->value() - delta.y()); - panStartPos = mouseEvent->pos(); - mouseEvent->accept(); + panStartPos = event->pos(); + event->accept(); return; } - QGraphicsView::mouseMoveEvent(mouseEvent); + QGraphicsView::mouseMoveEvent(event); } + void NetworkGraphicsView::wheelEvent(QWheelEvent *event) { int delta = event->angleDelta().y(); diff --git a/src/gui/network/NetworkGraphicsView.h b/src/gui/network/NetworkGraphicsView.h index 119a066..a392ca5 100644 --- a/src/gui/network/NetworkGraphicsView.h +++ b/src/gui/network/NetworkGraphicsView.h @@ -1,20 +1,27 @@ #pragma once +#include #include #include #include +class Network; + class NetworkGraphicsView : public QGraphicsView { public: - NetworkGraphicsView(QWidget *parent = nullptr, QGraphicsScene* scene = nullptr); + NetworkGraphicsView(QWidget *parent = nullptr, Network* network=nullptr, QGraphicsScene* scene = nullptr); private: QPointF panStartPos; void initUI(); + QGraphicsScene* scene_; + Network* network_; protected: void mouseMoveEvent(QMouseEvent *mouseEvent) override; void mousePressEvent(QMouseEvent *event) override; + void leftMousePress(QMouseEvent *event); + QGraphicsItem* getItemAtClick(QMouseEvent *event); void wheelEvent(QWheelEvent *event) override; // void mouseReleaseEvent(QMouseEvent *event) override; diff --git a/src/gui/network/NodeEdgeGraphic.cpp b/src/gui/network/NodeEdgeGraphic.cpp index 3d6fefe..71dda0f 100644 --- a/src/gui/network/NodeEdgeGraphic.cpp +++ b/src/gui/network/NodeEdgeGraphic.cpp @@ -19,7 +19,6 @@ QRectF NodeEdgeGraphic::boundingRect() const void NodeEdgeGraphic::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { painter->setPen(QPen("white")); - std::cout << "drawing " << socket1_->scenePos().x() << " " << socket1_->scenePos().y() << "\n"; painter->drawLine(socket1_->scenePos(),socket2_->scenePos()); }