#pragma once #include #include #include #include "PortType.hpp" #include "Export.hpp" #include "NodeState.hpp" #include "NodeGeometry.hpp" #include "NodeData.hpp" #include "NodeGraphicsObject.hpp" #include "ConnectionGraphicsObject.hpp" #include "Serializable.hpp" #include "memory.hpp" namespace QtNodes { class Connection; class ConnectionState; class NodeGraphicsObject; class NodeDataModel; class Node : public QObject , public Serializable { Q_OBJECT public: /// NodeDataModel should be an rvalue and is moved into the Node Node(std::unique_ptr&& dataModel); virtual ~Node(); public: /** * \brief Json序列化 * \return json object */ QJsonObject save() const override; /** * \brief Json反序列化 * \param json json */ void restore(QJsonObject const& json) override; public: /** * \brief 节点的QUuid * \return uid */ QUuid id() const; void reactToPossibleConnection(PortType, NodeDataType const&, QPointF const& scenePoint); void resetReactionToConnection(); public: NodeGraphicsObject const& nodeGraphicsObject() const; NodeGraphicsObject& nodeGraphicsObject(); void setGraphicsObject(std::unique_ptr&& graphics); NodeGeometry& nodeGeometry(); NodeGeometry const& nodeGeometry() const; NodeState const& nodeState() const; NodeState& nodeState(); NodeDataModel* nodeDataModel() const; public Q_SLOTS: // data propagation /// Propagates incoming data to the underlying model. void propagateData(std::shared_ptr nodeData, PortIndex inPortIndex, const QUuid& connectionId) const; /// Fetches data from model's OUT #index port /// and propagates it to the connection void onDataUpdated(PortIndex index); /// Propagates empty data to the attached connection. void onDataInvalidated(PortIndex index); /// update the graphic part if the size of the embeddedwidget changes void onNodeSizeUpdated(); private: // addressing QUuid _uid; // data std::unique_ptr _nodeDataModel; NodeState _nodeState; // painting NodeGeometry _nodeGeometry; std::unique_ptr _nodeGraphicsObject; }; }