diff --git a/include/QtNodes/internal/ConnectionIdUtils.hpp b/include/QtNodes/internal/ConnectionIdUtils.hpp index 7f70a1b4b..a77272195 100644 --- a/include/QtNodes/internal/ConnectionIdUtils.hpp +++ b/include/QtNodes/internal/ConnectionIdUtils.hpp @@ -130,20 +130,21 @@ inline QJsonObject toJson(ConnectionId const &connId) { QJsonObject connJson; - connJson["outNodeId"] = static_cast(connId.outNodeId); - connJson["outPortIndex"] = static_cast(connId.outPortIndex); - connJson["intNodeId"] = static_cast(connId.inNodeId); - connJson["inPortIndex"] = static_cast(connId.inPortIndex); + connJson[QLatin1String("outNodeId")] = static_cast(connId.outNodeId); + connJson[QLatin1String("outPortIndex")] = static_cast(connId.outPortIndex); + connJson[QLatin1String("intNodeId")] = static_cast(connId.inNodeId); + connJson[QLatin1String("inPortIndex")] = static_cast(connId.inPortIndex); return connJson; } inline ConnectionId fromJson(QJsonObject const &connJson) { - ConnectionId connId{static_cast(connJson["outNodeId"].toInt(InvalidNodeId)), - static_cast(connJson["outPortIndex"].toInt(InvalidPortIndex)), - static_cast(connJson["intNodeId"].toInt(InvalidNodeId)), - static_cast(connJson["inPortIndex"].toInt(InvalidPortIndex))}; + ConnectionId connId{ + static_cast(connJson[QLatin1String("outNodeId")].toInt(InvalidNodeId)), + static_cast(connJson[QLatin1String("outPortIndex")].toInt(InvalidPortIndex)), + static_cast(connJson[QLatin1String("intNodeId")].toInt(InvalidNodeId)), + static_cast(connJson[QLatin1String("inPortIndex")].toInt(InvalidPortIndex))}; return connId; } diff --git a/include/QtNodes/internal/DataFlowGraphModel.hpp b/include/QtNodes/internal/DataFlowGraphModel.hpp index 268800202..cc8277a59 100644 --- a/include/QtNodes/internal/DataFlowGraphModel.hpp +++ b/include/QtNodes/internal/DataFlowGraphModel.hpp @@ -94,17 +94,23 @@ class NODE_EDITOR_PUBLIC DataFlowGraphModel : public AbstractGraphModel, public return model; } +public Q_SLOTS: + virtual void propagate(NodeId const nodeId); + +protected: + virtual bool canPropagate(ConnectionId const) const { return true; }; + Q_SIGNALS: void inPortDataWasSet(NodeId const, PortType const, PortIndex const); private: NodeId newNodeId() override { return _nextNodeId++; } +protected Q_SLOTS: void sendConnectionCreation(ConnectionId const connectionId); void sendConnectionDeletion(ConnectionId const connectionId); -private Q_SLOTS: /** * Fuction is called in three cases: * @@ -115,10 +121,10 @@ private Q_SLOTS: * - When a node restored from JSON an needs to send data downstream. * @see DataFlowGraphModel::loadNode */ - void onOutPortDataUpdated(NodeId const nodeId, PortIndex const portIndex); + virtual void onOutPortDataUpdated(NodeId const nodeId, PortIndex const portIndex); /// Function is called after detaching a connection. - void propagateEmptyDataTo(NodeId const nodeId, PortIndex const portIndex); + virtual void propagateEmptyDataTo(NodeId const nodeId, PortIndex const portIndex); private: std::shared_ptr _registry; diff --git a/include/QtNodes/internal/NodeDelegateModelRegistry.hpp b/include/QtNodes/internal/NodeDelegateModelRegistry.hpp index 4f230a4f4..a2060160d 100644 --- a/include/QtNodes/internal/NodeDelegateModelRegistry.hpp +++ b/include/QtNodes/internal/NodeDelegateModelRegistry.hpp @@ -41,7 +41,7 @@ class NODE_EDITOR_PUBLIC NodeDelegateModelRegistry public: template - void registerModel(RegistryItemCreator creator, QString const &category = "Nodes") + void registerModel(RegistryItemCreator creator, QString const &category = QLatin1String("Nodes")) { QString const name = computeName(HasStaticMethodName{}, creator); if (!_registeredItemCreators.count(name)) { @@ -52,7 +52,7 @@ class NODE_EDITOR_PUBLIC NodeDelegateModelRegistry } template - void registerModel(QString const &category = "Nodes") + void registerModel(QString const &category = QLatin1String("Nodes")) { RegistryItemCreator creator = []() { return std::make_unique(); }; registerModel(std::move(creator), category); @@ -62,7 +62,7 @@ class NODE_EDITOR_PUBLIC NodeDelegateModelRegistry template void registerModel(RegistryItemCreator creator, - QString const& category = "Nodes") + QString const& category = QLatin1String("Nodes")) { registerModel(std::move(creator), category); } @@ -70,7 +70,7 @@ class NODE_EDITOR_PUBLIC NodeDelegateModelRegistry template void - registerModel(ModelCreator&& creator, QString const& category = "Nodes") + registerModel(ModelCreator&& creator, QString const& category = QLatin1String("Nodes")) { using ModelType = compute_model_type_t; registerModel(std::forward(creator), category); diff --git a/src/DataFlowGraphModel.cpp b/src/DataFlowGraphModel.cpp index a5ba8734f..f75803218 100644 --- a/src/DataFlowGraphModel.cpp +++ b/src/DataFlowGraphModel.cpp @@ -138,12 +138,13 @@ void DataFlowGraphModel::addConnection(ConnectionId const connectionId) PortType::Out, connectionId.outPortIndex, PortRole::Data); - - setPortData(connectionId.inNodeId, - PortType::In, - connectionId.inPortIndex, - portDataToPropagate, - PortRole::Data); + if (canPropagate(connectionId)) { + setPortData(connectionId.inNodeId, + PortType::In, + connectionId.inPortIndex, + portDataToPropagate, + PortRole::Data); + } } void DataFlowGraphModel::sendConnectionCreation(ConnectionId const connectionId) @@ -518,7 +519,21 @@ void DataFlowGraphModel::onOutPortDataUpdated(NodeId const nodeId, PortIndex con QVariant const portDataToPropagate = portData(nodeId, PortType::Out, portIndex, PortRole::Data); for (auto const &cn : connected) { - setPortData(cn.inNodeId, PortType::In, cn.inPortIndex, portDataToPropagate, PortRole::Data); + if (canPropagate(cn)) { + setPortData(cn.inNodeId, + PortType::In, + cn.inPortIndex, + portDataToPropagate, + PortRole::Data); + } + } +} + +void DataFlowGraphModel::propagate(NodeId const nodeId) +{ + unsigned int nPorts = nodeData(nodeId, NodeRole::OutPortCount).toUInt(); + for (PortIndex idx = 0; idx < nPorts; ++idx) { + onOutPortDataUpdated(nodeId, idx); } }