feat: connect selected node

This commit is contained in:
parker
2025-08-12 04:28:56 +01:00
parent 675e08928b
commit 391e96e830
4 changed files with 71 additions and 4 deletions

View File

@@ -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::OpId>& enzo::nt::NetworkManager::getSelectedNodes()
{
return selectedNodes_;
}
void enzo::nt::NetworkManager::cookOp(enzo::nt::OpId opId)
{
std::vector<enzo::nt::OpId> dependencyGraph = getDependencyGraph(opId);

View File

@@ -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<enzo::nt::OpId>& getSelectedNodes();
boost::signals2::signal<void (nt::OpId)> displayNodeChanged;
boost::signals2::signal<void (std::vector<nt::OpId> selectedNodeIds)> selectedNodesChanged;
boost::signals2::signal<void (enzo::geo::Geometry& geometry)> displayGeoChanged;
#ifdef UNIT_TEST
@@ -41,6 +44,7 @@ private:
// variables
// store for geometry operators
std::vector<enzo::nt::OpId> selectedNodes_;
std::unordered_map<enzo::nt::OpId, std::unique_ptr<enzo::nt::GeometryOperator>> gopStore_;
// the highest operator id currently stored
enzo::nt::OpId maxOpId_=0;

View File

@@ -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<enzo::nt::OpId> selectedNodeIds){
if(selectedNodeIds.size()<=0) return;
parametersPanel->selectionChanged(selectedNodeIds.back());
});
enzo::nt::nm().selectedNodesChanged.connect([geometrySpreadsheetPanel](std::vector<enzo::nt::OpId> selectedNodeIds){
if(selectedNodeIds.size()<=0) return;
geometrySpreadsheetPanel->setNode(selectedNodeIds.back());
});
enzo::nt::nm().selectedNodesChanged.connect([geometrySpreadsheetPanel](std::vector<enzo::nt::OpId> 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);});
}

View File

@@ -21,6 +21,7 @@
#include <QLine>
#include <stdexcept>
#include "Gui/Network/TabMenu.h"
#include <icecream.hpp>
using namespace enzo;
@@ -408,13 +409,24 @@ void Network::mouseReleaseEvent(QMouseEvent *event)
{
moveNodeBuffer.clear();
state_=State::DEFAULT;
// select node
if(
QGraphicsItem* clickedNode = itemOfType<NodeGraphic>(hoverItems);
clickedNode &&
QLineF(event->pos(), leftMouseStart).length()<5.0f)
{
NodeGraphic* node = static_cast<NodeGraphic*>(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);
}
}