feat: connect selected node
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);});
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user