From 3e99eb3864abb33f213857052cd012741981844b Mon Sep 17 00:00:00 2001 From: Finn Rayment Date: Sat, 28 Jan 2023 19:19:41 +1100 Subject: [PATCH 1/6] Added propagation control functions. Added the ability to explicitly control propagation of data in DataFlowGraphModel through the use of a new virtual function canPropagate(ConnectionId), and another function propagate(NodeId) to request a propagation without having to update input/output data. These functions are both virtual so that deriviative dataflow models can specify their own control model. Signed-off-by: Finn Rayment --- .../QtNodes/internal/DataFlowGraphModel.hpp | 9 +++++++ src/DataFlowGraphModel.cpp | 25 +++++++++++++------ 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/include/QtNodes/internal/DataFlowGraphModel.hpp b/include/QtNodes/internal/DataFlowGraphModel.hpp index f01e583d9..5a2fb3089 100644 --- a/include/QtNodes/internal/DataFlowGraphModel.hpp +++ b/include/QtNodes/internal/DataFlowGraphModel.hpp @@ -94,6 +94,15 @@ 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 connectionId) + { + return true; + } + Q_SIGNALS: void inPortDataWasSet(NodeId const, PortType const, PortIndex const); diff --git a/src/DataFlowGraphModel.cpp b/src/DataFlowGraphModel.cpp index 863bd001c..a253c9139 100644 --- a/src/DataFlowGraphModel.cpp +++ b/src/DataFlowGraphModel.cpp @@ -140,12 +140,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); + } } bool DataFlowGraphModel::nodeExists(NodeId const nodeId) const @@ -492,7 +493,17 @@ 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); } } From 41957ea2b04101d98a9485174913e1b40708e9ee Mon Sep 17 00:00:00 2001 From: Finn Rayment Date: Sat, 28 Jan 2023 22:24:35 +1100 Subject: [PATCH 2/6] Fixed unused variable. --- include/QtNodes/internal/DataFlowGraphModel.hpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/include/QtNodes/internal/DataFlowGraphModel.hpp b/include/QtNodes/internal/DataFlowGraphModel.hpp index 5a2fb3089..7a542cdc2 100644 --- a/include/QtNodes/internal/DataFlowGraphModel.hpp +++ b/include/QtNodes/internal/DataFlowGraphModel.hpp @@ -98,10 +98,7 @@ public Q_SLOTS: virtual void propagate(NodeId const nodeId); protected: - virtual bool canPropagate(ConnectionId const connectionId) - { - return true; - } + virtual bool canPropagate(ConnectionId const) { return true; } Q_SIGNALS: void inPortDataWasSet(NodeId const, PortType const, PortIndex const); From 7f9d7ab10407d9ae82f00e707fd31d9ea9063cc6 Mon Sep 17 00:00:00 2001 From: Finn Rayment Date: Sun, 29 Jan 2023 15:23:48 +1100 Subject: [PATCH 3/6] Wrapped header string constants in QLatin1String(...). The library will fail to compile if QT_NO_CAST_FROM_ASCII is set in any project that uses it due to implicit conversion of const char * to QString. Wrapping the constants moves string initialisation to compile-time and succeeds build. Signed-off-by: Finn Rayment --- include/QtNodes/internal/ConnectionIdUtils.hpp | 16 ++++++++-------- .../internal/NodeDelegateModelRegistry.hpp | 8 ++++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/include/QtNodes/internal/ConnectionIdUtils.hpp b/include/QtNodes/internal/ConnectionIdUtils.hpp index 7f70a1b4b..ab1d0391d 100644 --- a/include/QtNodes/internal/ConnectionIdUtils.hpp +++ b/include/QtNodes/internal/ConnectionIdUtils.hpp @@ -130,20 +130,20 @@ 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/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); From bb42e8f488fa261b1ad0ed997866135e072d0e82 Mon Sep 17 00:00:00 2001 From: Finn Rayment Date: Sun, 29 Jan 2023 19:29:49 +1100 Subject: [PATCH 4/6] Changed propagation functions to protected virtual. Signed-off-by: Finn Rayment --- include/QtNodes/internal/DataFlowGraphModel.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/QtNodes/internal/DataFlowGraphModel.hpp b/include/QtNodes/internal/DataFlowGraphModel.hpp index 7a542cdc2..79a9fc56f 100644 --- a/include/QtNodes/internal/DataFlowGraphModel.hpp +++ b/include/QtNodes/internal/DataFlowGraphModel.hpp @@ -106,7 +106,7 @@ public Q_SLOTS: private: NodeId newNodeId() override { return _nextNodeId++; } -private Q_SLOTS: +protected Q_SLOTS: /** * Fuction is called in three cases: * @@ -117,10 +117,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; From 1531218ce10a515fa949401636cdae60b6665aef Mon Sep 17 00:00:00 2001 From: Finn Rayment Date: Tue, 31 Jan 2023 23:30:33 +1100 Subject: [PATCH 5/6] Formatted changes with clang-format. Signed-off-by: Finn Rayment --- include/QtNodes/internal/ConnectionIdUtils.hpp | 9 +++++---- src/DataFlowGraphModel.cpp | 10 ++++++---- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/include/QtNodes/internal/ConnectionIdUtils.hpp b/include/QtNodes/internal/ConnectionIdUtils.hpp index ab1d0391d..a77272195 100644 --- a/include/QtNodes/internal/ConnectionIdUtils.hpp +++ b/include/QtNodes/internal/ConnectionIdUtils.hpp @@ -140,10 +140,11 @@ inline QJsonObject toJson(ConnectionId const &connId) inline ConnectionId fromJson(QJsonObject const &connJson) { - 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))}; + 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/src/DataFlowGraphModel.cpp b/src/DataFlowGraphModel.cpp index a253c9139..c1ba56be6 100644 --- a/src/DataFlowGraphModel.cpp +++ b/src/DataFlowGraphModel.cpp @@ -15,9 +15,7 @@ DataFlowGraphModel::DataFlowGraphModel(std::shared_ptr DataFlowGraphModel::allNodeIds() const { std::unordered_set nodeIds; - for_each(_models.begin(), _models.end(), [&nodeIds](auto const &p) { - nodeIds.insert(p.first); - }); + for_each(_models.begin(), _models.end(), [&nodeIds](auto const &p) { nodeIds.insert(p.first); }); return nodeIds; } @@ -494,7 +492,11 @@ void DataFlowGraphModel::onOutPortDataUpdated(NodeId const nodeId, PortIndex con for (auto const &cn : connected) { if (canPropagate(cn)) { - setPortData(cn.inNodeId, PortType::In, cn.inPortIndex, portDataToPropagate, PortRole::Data); + setPortData(cn.inNodeId, + PortType::In, + cn.inPortIndex, + portDataToPropagate, + PortRole::Data); } } } From 0bdbd77b257ed9cd12c20367d43cd0d5c28f76c0 Mon Sep 17 00:00:00 2001 From: Finn Rayment Date: Sat, 29 Jul 2023 18:19:31 +1000 Subject: [PATCH 6/6] Made canPropagate a const method. Signed-off-by: Finn Rayment --- include/QtNodes/internal/DataFlowGraphModel.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/QtNodes/internal/DataFlowGraphModel.hpp b/include/QtNodes/internal/DataFlowGraphModel.hpp index 9e31f5c16..cc8277a59 100644 --- a/include/QtNodes/internal/DataFlowGraphModel.hpp +++ b/include/QtNodes/internal/DataFlowGraphModel.hpp @@ -98,7 +98,7 @@ public Q_SLOTS: virtual void propagate(NodeId const nodeId); protected: - virtual bool canPropagate(ConnectionId const) { return true; } + virtual bool canPropagate(ConnectionId const) const { return true; }; Q_SIGNALS: void inPortDataWasSet(NodeId const, PortType const, PortIndex const);