#pragma once #include #include "PortType.hpp" #include "NodeData.hpp" #include "Serializable.hpp" #include "NodeGeometry.hpp" #include "NodeStyle.hpp" #include "NodePainterDelegate.hpp" #include "Export.hpp" #include "memory.hpp" namespace QtNodes { enum class NodeValidationState { Valid, Warning, Error }; class Connection; class StyleCollection; class NODE_EDITOR_PUBLIC NodeDataModel : public QObject , public Serializable { Q_OBJECT public: NodeDataModel(); virtual ~NodeDataModel() = default; /// Caption is used in GUI virtual QString caption() const = 0; /// It is possible to hide caption in GUI virtual bool captionVisible() const { return true; } /// Port caption is used in GUI to label individual ports virtual QString portCaption(PortType, PortIndex) const { return QString(); } /// It is possible to hide port caption in GUI virtual bool portCaptionVisible(PortType, PortIndex) const { return false; } /// Name makes this model unique virtual QString name() const = 0; public: QJsonObject save() const override; public: virtual unsigned int nPorts(PortType portType) const = 0; virtual NodeDataType dataType(PortType portType, PortIndex portIndex) const = 0; public: enum class ConnectionPolicy { One, Many, }; virtual ConnectionPolicy portOutConnectionPolicy(PortIndex) const { return ConnectionPolicy::Many; } virtual ConnectionPolicy portInConnectionPolicy(PortIndex) const { return ConnectionPolicy::One; } NodeStyle const& nodeStyle() const; void setNodeStyle(NodeStyle const& style); public: /// Triggers the algorithm virtual void setInData(std::shared_ptr nodeData, PortIndex port) { Q_UNUSED(nodeData); Q_UNUSED(port); }; virtual std::shared_ptr outData(PortIndex port) = 0; virtual QWidget * embeddedWidget() { return nullptr; }; virtual bool resizable() const { return false; } virtual NodeValidationState validationState() const { return NodeValidationState::Valid; } virtual QString validationMessage() const { return QStringLiteral(""); } virtual NodePainterDelegate* painterDelegate() const { return nullptr; } public Q_SLOTS: virtual void inputConnectionCreated(Connection const&) { } virtual void inputConnectionDeleted(Connection const&) { } virtual void outputConnectionCreated(Connection const&) { } virtual void outputConnectionDeleted(Connection const&) { } Q_SIGNALS: void dataUpdated(PortIndex index); void dataInvalidated(PortIndex index); void computingStarted(); void computingFinished(); void embeddedWidgetSizeUpdated(); void portChanged(PortType type, PortIndex index); private: NodeStyle _nodeStyle; }; }