From c34e6e374b13da5d3301ca622dbea52ed986248d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Taiguara=20Tupinamb=C3=A1s?= Date: Wed, 6 Aug 2025 13:32:36 -0300 Subject: [PATCH 1/9] adds version to Catch2 due to compatibility issues --- external/CMakeLists.txt | 2 +- test/CMakeLists.txt | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt index d7fbfcca7..0d39af5c9 100644 --- a/external/CMakeLists.txt +++ b/external/CMakeLists.txt @@ -1,5 +1,5 @@ if(BUILD_TESTING) - find_package(Catch2 QUIET) + find_package(Catch2 2.13.7 QUIET) if(NOT Catch2_FOUND) add_subdirectory(Catch2) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 681251330..98a8c306a 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -4,6 +4,8 @@ else() find_package(Qt5 COMPONENTS Test) endif() +find_package(Catch2) + add_executable(test_nodes test_main.cpp src/TestAbstractGraphModel.cpp From 71d95585406b8efd65de89ee9294060932667276 Mon Sep 17 00:00:00 2001 From: Gabrielnmds Date: Wed, 10 Dec 2025 15:23:08 -0300 Subject: [PATCH 2/9] Updates from upstream --- external/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt index 0d39af5c9..d7fbfcca7 100644 --- a/external/CMakeLists.txt +++ b/external/CMakeLists.txt @@ -1,5 +1,5 @@ if(BUILD_TESTING) - find_package(Catch2 2.13.7 QUIET) + find_package(Catch2 QUIET) if(NOT Catch2_FOUND) add_subdirectory(Catch2) From 5ea0a5f41a32f14df64d8f0730539acc65d2c671 Mon Sep 17 00:00:00 2001 From: Gabrielnmds Date: Wed, 20 Aug 2025 17:30:36 -0300 Subject: [PATCH 3/9] Solve conflicts --- .../QtNodes/internal/DefaultNodePainter.hpp | 2 ++ include/QtNodes/internal/Definitions.hpp | 31 ++++++++++--------- .../QtNodes/internal/NodeDelegateModel.hpp | 4 +++ src/DataFlowGraphModel.cpp | 4 +++ src/DefaultNodePainter.cpp | 28 +++++++++++++++++ 5 files changed, 54 insertions(+), 15 deletions(-) diff --git a/include/QtNodes/internal/DefaultNodePainter.hpp b/include/QtNodes/internal/DefaultNodePainter.hpp index 953faa065..4ba13e43d 100644 --- a/include/QtNodes/internal/DefaultNodePainter.hpp +++ b/include/QtNodes/internal/DefaultNodePainter.hpp @@ -36,6 +36,8 @@ class NODE_EDITOR_PUBLIC DefaultNodePainter : public AbstractNodePainter void drawValidationIcon(QPainter *painter, NodeGraphicsObject &ngo) const; + void drawProgressValue(QPainter *painter, NodeGraphicsObject &ngo) const; + private: QIcon _toolTipIcon{"://info-tooltip.svg"}; }; diff --git a/include/QtNodes/internal/Definitions.hpp b/include/QtNodes/internal/Definitions.hpp index 8c01475f9..de07bf209 100644 --- a/include/QtNodes/internal/Definitions.hpp +++ b/include/QtNodes/internal/Definitions.hpp @@ -18,23 +18,24 @@ NODE_EDITOR_PUBLIC Q_NAMESPACE Q_NAMESPACE_EXPORT(NODE_EDITOR_PUBLIC) #endif -/** + /** * Constants used for fetching QVariant data from GraphModel. */ -enum class NodeRole { - Type = 0, ///< Type of the current node, usually a string. - Position = 1, ///< `QPointF` positon of the node on the scene. - Size = 2, ///< `QSize` for resizable nodes. - CaptionVisible = 3, ///< `bool` for caption visibility. - Caption = 4, ///< `QString` for node caption. - Style = 5, ///< Custom NodeStyle as QJsonDocument - InternalData = 6, ///< Node-stecific user data as QJsonObject - InPortCount = 7, ///< `unsigned int` - OutPortCount = 9, ///< `unsigned int` - Widget = 10, ///< Optional `QWidget*` or `nullptr` - ValidationState = 11, ///< Enum NodeValidationState of the node - ProcessingStatus = 12 ///< Enum NodeProcessingStatus of the node -}; + enum class NodeRole { + Type = 0, ///< Type of the current node, usually a string. + Position = 1, ///< `QPointF` positon of the node on the scene. + Size = 2, ///< `QSize` for resizable nodes. + CaptionVisible = 3, ///< `bool` for caption visibility. + Caption = 4, ///< `QString` for node caption. + Style = 5, ///< Custom NodeStyle as QJsonDocument + InternalData = 6, ///< Node-stecific user data as QJsonObject + InPortCount = 7, ///< `unsigned int` + OutPortCount = 9, ///< `unsigned int` + Widget = 10, ///< Optional `QWidget*` or `nullptr` + ValidationState = 11, ///< Enum NodeValidationState of the node + ProcessingStatus = 12, ///< Enum NodeProcessingStatus of the node + ProgressValue = 13, ///< 'QString' for the progress value + }; Q_ENUM_NS(NodeRole) /** diff --git a/include/QtNodes/internal/NodeDelegateModel.hpp b/include/QtNodes/internal/NodeDelegateModel.hpp index 8730805ca..5f5d9e63c 100644 --- a/include/QtNodes/internal/NodeDelegateModel.hpp +++ b/include/QtNodes/internal/NodeDelegateModel.hpp @@ -85,6 +85,10 @@ class NODE_EDITOR_PUBLIC NodeDelegateModel /// Returns the curent processing status virtual NodeProcessingStatus processingStatus() const { return _processingStatus; } + /// Progress is used in GUI + virtual QString progressValue() const = 0; + +public: QJsonObject save() const override; void load(QJsonObject const &) override; diff --git a/src/DataFlowGraphModel.cpp b/src/DataFlowGraphModel.cpp index fa5655cde..db54baf1a 100644 --- a/src/DataFlowGraphModel.cpp +++ b/src/DataFlowGraphModel.cpp @@ -303,6 +303,10 @@ QVariant DataFlowGraphModel::nodeData(NodeId nodeId, NodeRole role) const auto processingStatus = model->processingStatus(); result = QVariant::fromValue(processingStatus); } break; + + case NodeRole::ProgressValue: + result = model->progressValue(); + break; } return result; diff --git a/src/DefaultNodePainter.cpp b/src/DefaultNodePainter.cpp index d313d3a82..7eae3eaa1 100644 --- a/src/DefaultNodePainter.cpp +++ b/src/DefaultNodePainter.cpp @@ -38,6 +38,8 @@ void DefaultNodePainter::paint(QPainter *painter, NodeGraphicsObject &ngo) const drawResizeRect(painter, ngo); drawValidationIcon(painter, ngo); + + drawProgressValue(painter, ngo); } void DefaultNodePainter::drawNodeRect(QPainter *painter, NodeGraphicsObject &ngo) const @@ -375,4 +377,30 @@ void DefaultNodePainter::drawValidationIcon(QPainter *painter, NodeGraphicsObjec painter->restore(); } +void DefaultNodePainter::drawProgressValue(QPainter *painter, NodeGraphicsObject &ngo) const +{ + AbstractGraphModel &model = ngo.graphModel(); + NodeId const nodeId = ngo.nodeId(); + AbstractNodeGeometry &geometry = ngo.nodeScene()->nodeGeometry(); + + QString const nodeProgress = model.nodeData(nodeId, NodeRole::ProgressValue).toString(); + + QFont font = painter->font(); + font.setBold(true); + auto rect = QFontMetrics(font).boundingRect(nodeProgress); + + QSize size = geometry.size(nodeId); + QPointF position(rect.width() / 2.0, size.height() - rect.height()); + + QJsonDocument json = QJsonDocument::fromVariant(model.nodeData(nodeId, NodeRole::Style)); + NodeStyle nodeStyle(json.object()); + + painter->setFont(font); + painter->setPen(nodeStyle.FontColor); + painter->drawText(position, nodeProgress); + + font.setBold(false); + painter->setFont(font); +} + } // namespace QtNodes From 3f73897beb012e6fdc830899c2f446d896a81281 Mon Sep 17 00:00:00 2001 From: Gabrielnmds Date: Fri, 22 Aug 2025 10:36:19 -0300 Subject: [PATCH 4/9] Improve progress value size and alignment --- src/DefaultNodePainter.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/DefaultNodePainter.cpp b/src/DefaultNodePainter.cpp index 7eae3eaa1..33260ede9 100644 --- a/src/DefaultNodePainter.cpp +++ b/src/DefaultNodePainter.cpp @@ -387,10 +387,11 @@ void DefaultNodePainter::drawProgressValue(QPainter *painter, NodeGraphicsObject QFont font = painter->font(); font.setBold(true); + font.setPointSize(5); auto rect = QFontMetrics(font).boundingRect(nodeProgress); QSize size = geometry.size(nodeId); - QPointF position(rect.width() / 2.0, size.height() - rect.height()); + QPointF position(rect.width() / 4.0, size.height() - 0.5 * rect.height()); QJsonDocument json = QJsonDocument::fromVariant(model.nodeData(nodeId, NodeRole::Style)); NodeStyle nodeStyle(json.object()); From e8a674f28830efff9d56b3c1d2aeee56a98ff813 Mon Sep 17 00:00:00 2001 From: g-abilio Date: Mon, 22 Sep 2025 14:58:49 -0300 Subject: [PATCH 5/9] solve conflicts --- .../calculator/LongProcessingRandomNumber.hpp | 1 - .../calculator/NumberDisplayDataModel.cpp | 4 +- examples/calculator/NumberSourceDataModel.cpp | 4 +- .../QtNodes/internal/NodeDelegateModel.hpp | 4 +- src/DefaultHorizontalNodeGeometry.cpp | 6 +- src/NodeGraphicsObject.cpp | 62 +++++++++++++++++++ 6 files changed, 74 insertions(+), 7 deletions(-) diff --git a/examples/calculator/LongProcessingRandomNumber.hpp b/examples/calculator/LongProcessingRandomNumber.hpp index d64f4ba7b..8be2882ca 100644 --- a/examples/calculator/LongProcessingRandomNumber.hpp +++ b/examples/calculator/LongProcessingRandomNumber.hpp @@ -18,7 +18,6 @@ class RandomNumberModel : public MathOperationDataModel RandomNumberModel() { this->setNodeProcessingStatus(QtNodes::NodeProcessingStatus::Empty); - QObject::connect(this, &NodeDelegateModel::computingStarted, this, [this]() { if (_number1.lock() && _number2.lock()) { this->setNodeProcessingStatus( diff --git a/examples/calculator/NumberDisplayDataModel.cpp b/examples/calculator/NumberDisplayDataModel.cpp index 5086050c8..6f58f5854 100644 --- a/examples/calculator/NumberDisplayDataModel.cpp +++ b/examples/calculator/NumberDisplayDataModel.cpp @@ -4,7 +4,9 @@ NumberDisplayDataModel::NumberDisplayDataModel() : _label{nullptr} -{} +{ + this->setNodeProcessingStatus(QtNodes::NodeProcessingStatus::NoStatus); +} unsigned int NumberDisplayDataModel::nPorts(PortType portType) const { diff --git a/examples/calculator/NumberSourceDataModel.cpp b/examples/calculator/NumberSourceDataModel.cpp index f6a7ca55d..f2564886a 100644 --- a/examples/calculator/NumberSourceDataModel.cpp +++ b/examples/calculator/NumberSourceDataModel.cpp @@ -9,7 +9,9 @@ NumberSourceDataModel::NumberSourceDataModel() : _lineEdit{nullptr} , _number(std::make_shared(0.0)) -{} +{ + this->setNodeProcessingStatus(QtNodes::NodeProcessingStatus::NoStatus); +} QJsonObject NumberSourceDataModel::save() const { diff --git a/include/QtNodes/internal/NodeDelegateModel.hpp b/include/QtNodes/internal/NodeDelegateModel.hpp index 5f5d9e63c..63d813f34 100644 --- a/include/QtNodes/internal/NodeDelegateModel.hpp +++ b/include/QtNodes/internal/NodeDelegateModel.hpp @@ -33,8 +33,8 @@ struct NodeValidationState }; /** -* Describes the node status, depending on its current situation -*/ + * Describes the node status, depending on its current situation + */ enum class NodeProcessingStatus : int { NoStatus = 0, ///< No processing status is shown in the Node UI. Updated = 1, ///< Node is up to date; its outputs reflect the current inputs and parameters. diff --git a/src/DefaultHorizontalNodeGeometry.cpp b/src/DefaultHorizontalNodeGeometry.cpp index a30121d2a..564568227 100644 --- a/src/DefaultHorizontalNodeGeometry.cpp +++ b/src/DefaultHorizontalNodeGeometry.cpp @@ -1,6 +1,7 @@ #include "DefaultHorizontalNodeGeometry.hpp" #include "AbstractGraphModel.hpp" #include "NodeData.hpp" +#include "NodeDelegateModel.hpp" #include #include @@ -55,9 +56,10 @@ void DefaultHorizontalNodeGeometry::recomputeSize(NodeId const nodeId) const height += _portSpasing; // space below caption QVariant var = _graphModel.nodeData(nodeId, NodeRole::ProcessingStatus); - auto processingStatusValue = var.value(); - if (processingStatusValue != 0) + auto processingStatusValue = var.value(); + + if (processingStatusValue != QtNodes::NodeProcessingStatus::NoStatus) height += 20; unsigned int inPortWidth = maxPortsTextAdvance(nodeId, PortType::In); diff --git a/src/NodeGraphicsObject.cpp b/src/NodeGraphicsObject.cpp index 3eb94b359..1264f98ea 100644 --- a/src/NodeGraphicsObject.cpp +++ b/src/NodeGraphicsObject.cpp @@ -383,4 +383,66 @@ void NodeGraphicsObject::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) Q_EMIT nodeScene()->nodeContextMenu(_nodeId, mapToScene(event->pos())); } +<<<<<<< HEAD +======= +void NodeGraphicsObject::updateStatusIconSize() const +{ + QVariant var = _graphModel.nodeData(_nodeId, NodeRole::ProcessingStatus); + + auto processingStatusValue = var.value(); + + bool oldStatus = _statusIconActive; + _statusIconActive = processingStatusValue != QtNodes::NodeProcessingStatus::NoStatus; + + if (oldStatus != _statusIconActive) { + _statusIconSize.setWidth(_statusIconActive ? 32 : 0); + _statusIconSize.setHeight(_statusIconActive ? 32 : 0); + } +} + +QRect NodeGraphicsObject::statusIconRect() const +{ + QVariant var = _graphModel.nodeData(_nodeId, NodeRole::ProcessingStatus); + + // auto spacing = static_cast(_spacing); + auto iconPos = + // = portScenePosition(std::max(var.value().nPorts(PortType::Out), + // var.value().nPorts(PortType::In)), + // PortType::Out) + // .toPoint() + // + + QPoint{-statusIconSize().width() / 2, 0}; + + return QRect{iconPos, statusIconSize()}; +} + +const QIcon NodeGraphicsObject::processingStatusIcon() const +{ + QVariant var = _graphModel.nodeData(_nodeId, NodeRole::ProcessingStatus); + + switch (var.value()) { + case QtNodes::NodeProcessingStatus::NoStatus: + return QIcon(); + case QtNodes::NodeProcessingStatus::Updated: + return _statusUpdated; + case QtNodes::NodeProcessingStatus::Processing: + return _statusProcessing; + case QtNodes::NodeProcessingStatus::Pending: + return _statusPending; + case QtNodes::NodeProcessingStatus::Empty: + return _statusEmpty; + case QtNodes::NodeProcessingStatus::Failed: + return _statusInvalid; + case QtNodes::NodeProcessingStatus::Partial: + return _statusPartial; + } + return _statusInvalid; +} + +QSize NodeGraphicsObject::statusIconSize() const +{ + return _statusIconSize; +} + +>>>>>>> 47eb075 (Merge branch 'node_processing_status' of github.com:fabns-nano/nodeeditor2 into progress_value) } // namespace QtNodes From 6cfea7624a174f755961873dc5f86f1e47780149 Mon Sep 17 00:00:00 2001 From: g-abilio Date: Tue, 23 Sep 2025 11:36:40 -0300 Subject: [PATCH 6/9] solve conflicts --- examples/calculator/CMakeLists.txt | 1 + .../calculator/LongProcessingRandomNumber.hpp | 103 +++++++++++++----- .../QtNodes/internal/NodeDelegateModel.hpp | 6 +- src/NodeGraphicsObject.cpp | 62 ----------- 4 files changed, 79 insertions(+), 93 deletions(-) diff --git a/examples/calculator/CMakeLists.txt b/examples/calculator/CMakeLists.txt index dae6ee3b4..dfeae5c4e 100644 --- a/examples/calculator/CMakeLists.txt +++ b/examples/calculator/CMakeLists.txt @@ -13,6 +13,7 @@ set(CALC_HEADER_FILES NumberDisplayDataModel.hpp NumberSourceDataModel.hpp SubtractionModel.hpp + LongProcessingRandomNumber.hpp ) add_executable(calculator diff --git a/examples/calculator/LongProcessingRandomNumber.hpp b/examples/calculator/LongProcessingRandomNumber.hpp index 8be2882ca..122a0be96 100644 --- a/examples/calculator/LongProcessingRandomNumber.hpp +++ b/examples/calculator/LongProcessingRandomNumber.hpp @@ -3,14 +3,15 @@ #include #include #include +#include #include #include #include "MathOperationDataModel.hpp" #include "DecimalData.hpp" -/// The model generates a random value in a long processing schema, -/// as it should demonstrate the usage of the NodeProcessingStatus. +/// The model generates a random value in a long processing schema, as it should demonstrate +/// the usage of the NodeProcessingStatus and the ProgressValue functionality. /// The random number is generate in the [n1, n2] interval. class RandomNumberModel : public MathOperationDataModel { @@ -19,21 +20,53 @@ class RandomNumberModel : public MathOperationDataModel this->setNodeProcessingStatus(QtNodes::NodeProcessingStatus::Empty); QObject::connect(this, &NodeDelegateModel::computingStarted, this, [this]() { - if (_number1.lock() && _number2.lock()) { - this->setNodeProcessingStatus( - QtNodes::NodeProcessingStatus::Processing); + this->setNodeProcessingStatus( + QtNodes::NodeProcessingStatus::Processing); + + setProgressValue(QString{"0%"}); + emit requestNodeUpdate(); + + _elapsedTimer.start(); + + if (!_progressTimer) { + _progressTimer = new QTimer(this); + connect(_progressTimer, &QTimer::timeout, this, [this]() { + qint64 elapsed = _elapsedTimer.elapsed(); + int percent = static_cast((double(elapsed) / _totalDurationMs) * 100.0); + + if (percent > 100) + percent = 100; + + setProgressValue(QString::number(percent) + "%"); + emit requestNodeUpdate(); + }); } + _progressTimer->start(_progressUpdateIntervalMs); + emit requestNodeUpdate(); }); + QObject::connect(this, &NodeDelegateModel::computingFinished, this, [this]() { + if (_progressTimer) { + _progressTimer->stop(); + } + + setProgressValue(QString()); + this->setNodeProcessingStatus( QtNodes::NodeProcessingStatus::Updated); emit requestNodeUpdate(); }); } - virtual ~RandomNumberModel() {} + + virtual ~RandomNumberModel() { + if (_progressTimer) { + _progressTimer->stop(); + delete _progressTimer; + } + } public: QString caption() const override { return QStringLiteral("Random Number"); } @@ -43,40 +76,50 @@ class RandomNumberModel : public MathOperationDataModel private: void compute() override { + auto n1 = _number1.lock(); + auto n2 = _number2.lock(); + + if (!n1 || !n2) { + return; + } + Q_EMIT computingStarted(); PortIndex const outPortIndex = 0; - auto n1 = _number1.lock(); - auto n2 = _number2.lock(); + QTimer::singleShot(_totalDurationMs, this, [this, n1, n2]() { + if (n1 && n2) { + double a = n1->number(); + double b = n2->number(); + + if (a > b) { + setNodeProcessingStatus(QtNodes::NodeProcessingStatus::Failed); - QTimer *timer = new QTimer(this); - timer->start(1000); - int secondsRemaining = 3; - connect(timer, &QTimer::timeout, this, [=]() mutable { - if (--secondsRemaining <= 0) { - timer->stop(); - if (n1 && n2) { - double a = n1->number(); - double b = n2->number(); - - if (a > b) { - setNodeProcessingStatus(QtNodes::NodeProcessingStatus::Failed); - - emit requestNodeUpdate(); - return; + if (_progressTimer) { + _progressTimer->stop(); } - double upper = std::nextafter(b, std::numeric_limits::max()); - double randomValue = QRandomGenerator::global()->generateDouble() * (upper - a) + a; + setProgressValue(QString()); - _result = std::make_shared(randomValue); - Q_EMIT computingFinished(); - } else { - _result.reset(); + emit requestNodeUpdate(); + return; } - Q_EMIT dataUpdated(outPortIndex); + double upper = std::nextafter(b, std::numeric_limits::max()); + double randomValue = QRandomGenerator::global()->generateDouble() * (upper - a) + a; + + _result = std::make_shared(randomValue); + emit computingFinished(); + } else { + _result.reset(); } + + Q_EMIT dataUpdated(outPortIndex); }); } + + QTimer *_progressTimer = nullptr; + QElapsedTimer _elapsedTimer; + + const int _totalDurationMs = 3000; + const int _progressUpdateIntervalMs = 50; }; diff --git a/include/QtNodes/internal/NodeDelegateModel.hpp b/include/QtNodes/internal/NodeDelegateModel.hpp index 63d813f34..b6247d66b 100644 --- a/include/QtNodes/internal/NodeDelegateModel.hpp +++ b/include/QtNodes/internal/NodeDelegateModel.hpp @@ -86,7 +86,7 @@ class NODE_EDITOR_PUBLIC NodeDelegateModel virtual NodeProcessingStatus processingStatus() const { return _processingStatus; } /// Progress is used in GUI - virtual QString progressValue() const = 0; + virtual QString progressValue() const { return _progressValue; } public: QJsonObject save() const override; @@ -113,6 +113,8 @@ class NODE_EDITOR_PUBLIC NodeDelegateModel void setStatusIconStyle(ProcessingIconStyle const &style); + void setProgressValue(QString new_progress) { _progressValue = new_progress; } + public: virtual void setInData(std::shared_ptr nodeData, PortIndex const portIndex) = 0; @@ -188,6 +190,8 @@ public Q_SLOTS: NodeValidationState _nodeValidationState; NodeProcessingStatus _processingStatus{NodeProcessingStatus::NoStatus}; + + QString _progressValue{QString()}; }; } // namespace QtNodes diff --git a/src/NodeGraphicsObject.cpp b/src/NodeGraphicsObject.cpp index 1264f98ea..3eb94b359 100644 --- a/src/NodeGraphicsObject.cpp +++ b/src/NodeGraphicsObject.cpp @@ -383,66 +383,4 @@ void NodeGraphicsObject::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) Q_EMIT nodeScene()->nodeContextMenu(_nodeId, mapToScene(event->pos())); } -<<<<<<< HEAD -======= -void NodeGraphicsObject::updateStatusIconSize() const -{ - QVariant var = _graphModel.nodeData(_nodeId, NodeRole::ProcessingStatus); - - auto processingStatusValue = var.value(); - - bool oldStatus = _statusIconActive; - _statusIconActive = processingStatusValue != QtNodes::NodeProcessingStatus::NoStatus; - - if (oldStatus != _statusIconActive) { - _statusIconSize.setWidth(_statusIconActive ? 32 : 0); - _statusIconSize.setHeight(_statusIconActive ? 32 : 0); - } -} - -QRect NodeGraphicsObject::statusIconRect() const -{ - QVariant var = _graphModel.nodeData(_nodeId, NodeRole::ProcessingStatus); - - // auto spacing = static_cast(_spacing); - auto iconPos = - // = portScenePosition(std::max(var.value().nPorts(PortType::Out), - // var.value().nPorts(PortType::In)), - // PortType::Out) - // .toPoint() - // + - QPoint{-statusIconSize().width() / 2, 0}; - - return QRect{iconPos, statusIconSize()}; -} - -const QIcon NodeGraphicsObject::processingStatusIcon() const -{ - QVariant var = _graphModel.nodeData(_nodeId, NodeRole::ProcessingStatus); - - switch (var.value()) { - case QtNodes::NodeProcessingStatus::NoStatus: - return QIcon(); - case QtNodes::NodeProcessingStatus::Updated: - return _statusUpdated; - case QtNodes::NodeProcessingStatus::Processing: - return _statusProcessing; - case QtNodes::NodeProcessingStatus::Pending: - return _statusPending; - case QtNodes::NodeProcessingStatus::Empty: - return _statusEmpty; - case QtNodes::NodeProcessingStatus::Failed: - return _statusInvalid; - case QtNodes::NodeProcessingStatus::Partial: - return _statusPartial; - } - return _statusInvalid; -} - -QSize NodeGraphicsObject::statusIconSize() const -{ - return _statusIconSize; -} - ->>>>>>> 47eb075 (Merge branch 'node_processing_status' of github.com:fabns-nano/nodeeditor2 into progress_value) } // namespace QtNodes From ca356a325b2fdf632c1dab41a9e3904664edcf17 Mon Sep 17 00:00:00 2001 From: g-abilio Date: Wed, 24 Sep 2025 10:38:45 -0300 Subject: [PATCH 7/9] add ProgressValue case to switch --- src/DataFlowGraphModel.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/DataFlowGraphModel.cpp b/src/DataFlowGraphModel.cpp index db54baf1a..5e7ea27f6 100644 --- a/src/DataFlowGraphModel.cpp +++ b/src/DataFlowGraphModel.cpp @@ -386,8 +386,10 @@ bool DataFlowGraphModel::setNodeData(NodeId nodeId, NodeRole role, QVariant valu } Q_EMIT nodeUpdated(nodeId); } break; - } + case NodeRole::ProgressValue: + break; + } return result; } From e9d75d400cd1cd8c28240660ccb894395436498a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20Ab=C3=ADlio?= <150153171+g-abilio@users.noreply.github.com> Date: Fri, 5 Dec 2025 11:45:12 -0300 Subject: [PATCH 8/9] solve conflicts --- examples/calculator/LongProcessingRandomNumber.hpp | 1 + examples/calculator/NumberDisplayDataModel.cpp | 4 +--- examples/calculator/NumberSourceDataModel.cpp | 4 +--- include/QtNodes/internal/NodeDelegateModel.hpp | 4 ++-- src/DefaultHorizontalNodeGeometry.cpp | 5 ++--- 5 files changed, 7 insertions(+), 11 deletions(-) diff --git a/examples/calculator/LongProcessingRandomNumber.hpp b/examples/calculator/LongProcessingRandomNumber.hpp index 122a0be96..d56d0bd64 100644 --- a/examples/calculator/LongProcessingRandomNumber.hpp +++ b/examples/calculator/LongProcessingRandomNumber.hpp @@ -19,6 +19,7 @@ class RandomNumberModel : public MathOperationDataModel RandomNumberModel() { this->setNodeProcessingStatus(QtNodes::NodeProcessingStatus::Empty); + QObject::connect(this, &NodeDelegateModel::computingStarted, this, [this]() { this->setNodeProcessingStatus( QtNodes::NodeProcessingStatus::Processing); diff --git a/examples/calculator/NumberDisplayDataModel.cpp b/examples/calculator/NumberDisplayDataModel.cpp index 6f58f5854..5086050c8 100644 --- a/examples/calculator/NumberDisplayDataModel.cpp +++ b/examples/calculator/NumberDisplayDataModel.cpp @@ -4,9 +4,7 @@ NumberDisplayDataModel::NumberDisplayDataModel() : _label{nullptr} -{ - this->setNodeProcessingStatus(QtNodes::NodeProcessingStatus::NoStatus); -} +{} unsigned int NumberDisplayDataModel::nPorts(PortType portType) const { diff --git a/examples/calculator/NumberSourceDataModel.cpp b/examples/calculator/NumberSourceDataModel.cpp index f2564886a..f6a7ca55d 100644 --- a/examples/calculator/NumberSourceDataModel.cpp +++ b/examples/calculator/NumberSourceDataModel.cpp @@ -9,9 +9,7 @@ NumberSourceDataModel::NumberSourceDataModel() : _lineEdit{nullptr} , _number(std::make_shared(0.0)) -{ - this->setNodeProcessingStatus(QtNodes::NodeProcessingStatus::NoStatus); -} +{} QJsonObject NumberSourceDataModel::save() const { diff --git a/include/QtNodes/internal/NodeDelegateModel.hpp b/include/QtNodes/internal/NodeDelegateModel.hpp index b6247d66b..fc4c19f94 100644 --- a/include/QtNodes/internal/NodeDelegateModel.hpp +++ b/include/QtNodes/internal/NodeDelegateModel.hpp @@ -33,8 +33,8 @@ struct NodeValidationState }; /** - * Describes the node status, depending on its current situation - */ +* Describes the node status, depending on its current situation +*/ enum class NodeProcessingStatus : int { NoStatus = 0, ///< No processing status is shown in the Node UI. Updated = 1, ///< Node is up to date; its outputs reflect the current inputs and parameters. diff --git a/src/DefaultHorizontalNodeGeometry.cpp b/src/DefaultHorizontalNodeGeometry.cpp index 564568227..466af7439 100644 --- a/src/DefaultHorizontalNodeGeometry.cpp +++ b/src/DefaultHorizontalNodeGeometry.cpp @@ -1,7 +1,6 @@ #include "DefaultHorizontalNodeGeometry.hpp" #include "AbstractGraphModel.hpp" #include "NodeData.hpp" -#include "NodeDelegateModel.hpp" #include #include @@ -57,9 +56,9 @@ void DefaultHorizontalNodeGeometry::recomputeSize(NodeId const nodeId) const QVariant var = _graphModel.nodeData(nodeId, NodeRole::ProcessingStatus); - auto processingStatusValue = var.value(); + auto processingStatusValue = var.value(); - if (processingStatusValue != QtNodes::NodeProcessingStatus::NoStatus) + if (processingStatusValue != 0) height += 20; unsigned int inPortWidth = maxPortsTextAdvance(nodeId, PortType::In); From a5df74c201032d2f8f3afc0dc74b5026c4789c05 Mon Sep 17 00:00:00 2001 From: g-abilio Date: Fri, 12 Dec 2025 17:18:48 -0300 Subject: [PATCH 9/9] remove undesirable statement --- test/CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 98a8c306a..681251330 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -4,8 +4,6 @@ else() find_package(Qt5 COMPONENTS Test) endif() -find_package(Catch2) - add_executable(test_nodes test_main.cpp src/TestAbstractGraphModel.cpp