std::shared_ptr<Node> FlowScene:: restoreNode(Properties const &p) { QString modelName; p.get("model_name", &modelName); auto const &models = DataModelRegistry::registeredModels(); auto it = models.find(modelName); if (it == models.end()) throw std::logic_error(std::string("No registered model with name ") + modelName.toLocal8Bit().data()); auto dataModel = it->second->create(); auto node = std::make_shared<Node>(std::move(dataModel)); auto ngo = std::make_unique<NodeGraphicsObject>(*this, node); node->setGraphicsObject(std::move(ngo)); node->restore(p); _nodes[node->id()] = node; return node; }
QtNodes::Node& GraphScene::load(const rcc::shared_ptr<aq::nodes::Node>& node, std::map<std::string, QtNodes::Node*>& nodemap){ auto itr = nodemap.find(node->getTreeName()); if(itr != nodemap.end()){ return *itr->second; } rcc::shared_ptr<aq::nodes::Node> node_ = node; std::unique_ptr<aq::NodeProxy> datamodel; if(node_->GetInterface(aq::nodes::IFrameGrabber::s_interfaceID)){ datamodel = std::make_unique<aq::FrameGrabberProxy>(node_); }else{ datamodel = std::make_unique<aq::NodeProxy>(node_); } auto node_obj = std::make_unique<QtNodes::Node>(std::move(datamodel)); auto ngo = std::make_unique<QtNodes::NodeGraphicsObject>(*this, *node_obj); node_obj->setGraphicsObject(std::move(ngo)); auto nodePtr = node_obj.get(); this->_nodes[node_obj->id()] = std::move(node_obj); nodeCreated(*nodePtr); auto nodes = node_->getChildren(); for (const auto& node : nodes) { QtNodes::Node& created = load(node,nodemap); createConnection(created, 0, *nodePtr, 0); } nodemap[node->getTreeName()] = nodePtr; return *nodePtr; }
std::shared_ptr<Node> FlowScene:: createNode(std::unique_ptr<NodeDataModel> && dataModel) { auto node = std::make_shared<Node>(std::move(dataModel)); auto ngo = std::make_unique<NodeGraphicsObject>(*this, node); node->setGraphicsObject(std::move(ngo)); _nodes[node->id()] = node; return node; }
std::shared_ptr<Connection> FlowScene:: createConnection(PortType connectedPort, std::shared_ptr<Node> node, PortIndex portIndex) { auto connection = std::make_shared<Connection>(connectedPort, node, portIndex); auto cgo = std::make_unique<ConnectionGraphicsObject>(*this, connection); // after this function connection points are set to node port connection->setGraphicsObject(std::move(cgo)); _connections[connection->id()] = connection; return connection; }
std::shared_ptr<Connection> FlowScene:: restoreConnection(Properties const &p) { QUuid nodeInId; QUuid nodeOutId; p.get("in_id", &nodeInId); p.get("out_id", &nodeOutId); PortIndex portIndexIn; PortIndex portIndexOut; p.get("in_index", &portIndexIn); p.get("out_index", &portIndexOut); auto nodeIn = _nodes[nodeInId]; auto nodeOut = _nodes[nodeOutId]; auto connection = std::make_shared<Connection>(nodeIn, portIndexIn, nodeOut, portIndexOut); auto cgo = std::make_unique<ConnectionGraphicsObject>(*this, connection); nodeIn->nodeState().setConnection(PortType::In, portIndexIn, connection); nodeOut->nodeState().setConnection(PortType::Out, portIndexOut, connection); // trigger data propagation nodeOut->onDataUpdated(portIndexOut); // after this function connection points are set to node port connection->setGraphicsObject(std::move(cgo)); _connections[connection->id()] = connection; return connection; }
QtNodes::Node& GraphScene::load(const rcc::shared_ptr<aq::IDataStream>& ds){ rcc::shared_ptr<aq::IDataStream> ds_ = ds; std::unique_ptr<aq::DataStreamProxy> datamodel(new aq::DataStreamProxy(ds)); auto node = std::make_unique<QtNodes::Node>(std::move(datamodel)); auto ngo = std::make_unique<QtNodes::NodeGraphicsObject>(*this, *node); node->setGraphicsObject(std::move(ngo)); auto nodePtr = node.get(); this->_nodes[node->id()] = std::move(node); nodeCreated(*nodePtr); std::map<std::string, QtNodes::Node*> nodemap; auto nodes = ds_->getTopLevelNodes(); for(const auto& node : nodes){ QtNodes::Node& created = load(node, nodemap); createConnection(created, 0, *nodePtr, 0); } // Make a pass through all the nodes and reconstruct input / output connections for(const auto& node : nodes){ reconnectInputs(node, nodemap); } return *nodePtr; }