From 391e96e830c50a590cd80edcc2f604bb2727701f Mon Sep 17 00:00:00 2001 From: parker Date: Tue, 12 Aug 2025 04:28:56 +0100 Subject: [PATCH] feat: connect selected node --- src/Engine/Network/NetworkManager.cpp | 41 +++++++++++++++++++++++++++ src/Engine/Network/NetworkManager.h | 4 +++ src/Gui/Interface.cpp | 16 +++++++++-- src/Gui/Network/Network.cpp | 14 ++++++++- 4 files changed, 71 insertions(+), 4 deletions(-) diff --git a/src/Engine/Network/NetworkManager.cpp b/src/Engine/Network/NetworkManager.cpp index 9bd3824..d1925ac 100644 --- a/src/Engine/Network/NetworkManager.cpp +++ b/src/Engine/Network/NetworkManager.cpp @@ -84,6 +84,47 @@ void enzo::nt::NetworkManager::setDisplayOp(OpId opId) displayNodeChanged(opId); } +void enzo::nt::NetworkManager::setSelectedNode(OpId opId, bool selected, bool add) +{ + if(add) + { + auto idIter = std::find(selectedNodes_.begin(), selectedNodes_.end(), opId); + if(selected) + { + // skip if value is already in selected nodes + if(idIter!=selectedNodes_.end()) return; + selectedNodes_.push_back(opId); + cookOp(opId); + } + else + { + // skip if value is not in selected nodes + if(idIter==selectedNodes_.end()) return; + selectedNodes_.erase(idIter); + } + } + else + { + if(selected) + { + selectedNodes_.clear(); + selectedNodes_.push_back(opId); + cookOp(opId); + } + else + { + selectedNodes_.clear(); + } + } + selectedNodesChanged(selectedNodes_); + +} + +const std::vector& enzo::nt::NetworkManager::getSelectedNodes() +{ + return selectedNodes_; +} + void enzo::nt::NetworkManager::cookOp(enzo::nt::OpId opId) { std::vector dependencyGraph = getDependencyGraph(opId); diff --git a/src/Engine/Network/NetworkManager.h b/src/Engine/Network/NetworkManager.h index f90b935..6532197 100644 --- a/src/Engine/Network/NetworkManager.h +++ b/src/Engine/Network/NetworkManager.h @@ -23,8 +23,11 @@ public: bool isValidOp(nt::OpId opId); GeometryOperator& getGeoOperator(nt::OpId opId); void setDisplayOp(OpId opId); + void setSelectedNode(OpId opId, bool selected, bool add=false); + const std::vector& getSelectedNodes(); boost::signals2::signal displayNodeChanged; + boost::signals2::signal selectedNodeIds)> selectedNodesChanged; boost::signals2::signal displayGeoChanged; #ifdef UNIT_TEST @@ -41,6 +44,7 @@ private: // variables // store for geometry operators + std::vector selectedNodes_; std::unordered_map> gopStore_; // the highest operator id currently stored enzo::nt::OpId maxOpId_=0; diff --git a/src/Gui/Interface.cpp b/src/Gui/Interface.cpp index 16381ad..289779c 100644 --- a/src/Gui/Interface.cpp +++ b/src/Gui/Interface.cpp @@ -62,8 +62,18 @@ EnzoUI::EnzoUI() mainLayout_->addWidget(viewportSplitter_); // connect signals - enzo::nt::nm().displayNodeChanged.connect([parametersPanel](enzo::nt::OpId opId){parametersPanel->selectionChanged(opId);}); - enzo::nt::nm().displayNodeChanged.connect([geometrySpreadsheetPanel](enzo::nt::OpId opId){geometrySpreadsheetPanel->setNode(opId);}); - enzo::nt::nm().displayGeoChanged.connect([geometrySpreadsheetPanel](enzo::geo::Geometry& geometry){geometrySpreadsheetPanel->geometryChanged(geometry);}); + enzo::nt::nm().selectedNodesChanged.connect([parametersPanel](std::vector selectedNodeIds){ + if(selectedNodeIds.size()<=0) return; + parametersPanel->selectionChanged(selectedNodeIds.back()); + }); + enzo::nt::nm().selectedNodesChanged.connect([geometrySpreadsheetPanel](std::vector selectedNodeIds){ + if(selectedNodeIds.size()<=0) return; + geometrySpreadsheetPanel->setNode(selectedNodeIds.back()); + }); + enzo::nt::nm().selectedNodesChanged.connect([geometrySpreadsheetPanel](std::vector selectedNodeIds){ + if(selectedNodeIds.size()<=0) return; + auto& geometry = enzo::nt::nm().getGeoOperator(selectedNodeIds.back()).getOutputGeo(0); + geometrySpreadsheetPanel->geometryChanged(geometry); + }); enzo::nt::nm().displayGeoChanged.connect([viewport](enzo::geo::Geometry& geometry){viewport->setGeometry(geometry);}); } diff --git a/src/Gui/Network/Network.cpp b/src/Gui/Network/Network.cpp index 24eafee..b0892e5 100644 --- a/src/Gui/Network/Network.cpp +++ b/src/Gui/Network/Network.cpp @@ -21,6 +21,7 @@ #include #include #include "Gui/Network/TabMenu.h" +#include using namespace enzo; @@ -408,13 +409,24 @@ void Network::mouseReleaseEvent(QMouseEvent *event) { moveNodeBuffer.clear(); state_=State::DEFAULT; + + // select node if( QGraphicsItem* clickedNode = itemOfType(hoverItems); clickedNode && QLineF(event->pos(), leftMouseStart).length()<5.0f) { NodeGraphic* node = static_cast(clickedNode); - node->toggleSelected(); + // deselect previous + auto selectedNodeIds = enzo::nt::nm().getSelectedNodes(); + for(auto nodeId : selectedNodeIds) + { + NodeGraphic* nodeGraphic = nodeStore_.at(nodeId); + nodeGraphic->setSelected(false); + } + + bool selected = node->toggleSelected(); + enzo::nt::nm().setSelectedNode(node->getOpId(), selected); } }