#pragma once #include #include "global.h" #include "nodeData.h" #include "nodeStyle.h" #include "serializable.h" class StyleCollection; /** * The class wraps Node-specific data operations and propagates it to * the nesting DataFlowGraphModel which is a subclass of * AbstractGraphModel. * This class is the same what has been called NodeDataModel before v3. */ class NodeDelegateModel : public QObject, public Serializable { Q_OBJECT public: NodeDelegateModel(); virtual ~NodeDelegateModel() = default; /// It is possible to hide caption in GUI virtual bool captionVisible() const { return true; } /// Caption is used in GUI virtual QString caption() const = 0; /// It is possible to hide port caption in GUI virtual bool portCaptionVisible(PortType, PortIndex) const { return false; } /// Port caption is used in GUI to label individual ports virtual QString portCaption(PortType, PortIndex) const { return QString(); } /// Name makes this model unique virtual QString name() const = 0; public: QJsonObject save() const override; void load(QJsonObject const &) override; public: virtual unsigned int nPorts(PortType portType) const = 0; virtual NodeDataType dataType(PortType portType, PortIndex portIndex) const = 0; public: virtual ConnectionPolicy portConnectionPolicy(PortType, PortIndex) const; NodeStyle const &nodeStyle() const; void setNodeStyle(NodeStyle const &style); public: virtual void setInData(std::shared_ptr nodeData, PortIndex const portIndex) = 0; virtual std::shared_ptr outData(PortIndex const port) = 0; /** * It is recommented to preform a lazy initialization for the * embedded widget and create it inside this function, not in the * constructor of the current model. * * Our Model Registry is able to shortly instantiate models in order * to call the non-static `Model::name()`. If the embedded widget is * allocated in the constructor but not actually embedded into some * QGraphicsProxyWidget, we'll gonna have a dangling pointer. */ virtual QWidget *embeddedWidget() = 0; virtual bool resizable() const { return false; } public Q_SLOTS: virtual void inputConnectionCreated(ConnectionId const &) {} virtual void inputConnectionDeleted(ConnectionId const &) {} virtual void outputConnectionCreated(ConnectionId const &) {} virtual void outputConnectionDeleted(ConnectionId const &) {} Q_SIGNALS: /// Triggers the updates in the nodes downstream. void dataUpdated(PortIndex const index); /// Triggers the propagation of the empty data downstream. void dataInvalidated(PortIndex const index); void computingStarted(); void computingFinished(); void embeddedWidgetSizeUpdated(); /// Call this function before deleting the data associated with ports. /** * The function notifies the Graph Model and makes it remove and recompute the * affected connection addresses. */ void portsAboutToBeDeleted(PortType const portType, PortIndex const first, PortIndex const last); /// Call this function when data and port moditications are finished. void portsDeleted(); /// Call this function before inserting the data associated with ports. /** * The function notifies the Graph Model and makes it recompute the affected * connection addresses. */ void portsAboutToBeInserted(PortType const portType, PortIndex const first, PortIndex const last); /// Call this function when data and port moditications are finished. void portsInserted(); private: NodeStyle _nodeStyle; };