File: Connection.hpp

package info (click to toggle)
qnodeeditor 2.1.7-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye
  • size: 2,144 kB
  • sloc: cpp: 8,823; makefile: 3
file content (92 lines) | stat: -rw-r--r-- 3,184 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#pragma once
#include "ConnectionGeometry.hpp"
#include "ConnectionState.hpp"
#include "Export.hpp"
#include "NodeData.hpp"
#include "PortType.hpp"
#include "QUuidStdHash.hpp"
#include "Serializable.hpp"
#include "TypeConverter.hpp"
#include "memory.hpp"

#include <QtCore/QObject>
#include <QtCore/QUuid>
#include <QtCore/QVariant>
class QPointF;
namespace QtNodes
{
    class Node;
    class NodeData;
    class ConnectionGraphicsObject;
    ///
    class NODE_EDITOR_PUBLIC Connection
        : public QObject
        , public Serializable
    {
        Q_OBJECT
      public:
        /// New Connection is attached to the port of the given Node.
        /// The port has parameters (portType, portIndex).
        /// The opposite connection end will require anothre port.
        Connection(PortType portType, Node &node, PortIndex portIndex);
        Connection(Node &nodeIn, PortIndex portIndexIn, Node &nodeOut, PortIndex portIndexOut, TypeConverter converter = TypeConverter{});
        Connection(const Connection &) = delete;
        Connection operator=(const Connection &) = delete;
        ~Connection();

      public:
        QJsonObject save() const override;

      public:
        QUuid id() const;
        /// Remembers the end being dragged.
        /// Invalidates Node address.
        /// Grabs mouse.
        void setRequiredPort(PortType portType);
        PortType requiredPort() const;
        void setGraphicsObject(std::unique_ptr<ConnectionGraphicsObject> &&graphics);
        /// Assigns a node to the required port.
        /// It is assumed that there is a required port, no extra checks
        void setNodeToPort(Node &node, PortType portType, PortIndex portIndex);
        void removeFromNodes() const;

      public:
        ConnectionGraphicsObject &getConnectionGraphicsObject() const;
        ConnectionState const &connectionState() const;
        ConnectionState &connectionState();
        ConnectionGeometry &connectionGeometry();
        ConnectionGeometry const &connectionGeometry() const;
        Node *getNode(PortType portType) const;
        Node *&getNode(PortType portType);
        PortIndex getPortIndex(PortType portType) const;
        void clearNode(PortType portType);
        std::shared_ptr<NodeDataType> dataType(PortType portType) const;
        TypeConverter getTypeConverter() const;
        void setTypeConverter(TypeConverter converter);
        bool complete() const;

      public: // data propagation
        void propagateData() const;
        void propagateEmptyData() const;
      Q_SIGNALS:
        void connectionCompleted(Connection const &) const;
        void connectionMadeIncomplete(Connection const &) const;

      private:
        QUuid _uid;

      private:
        Node *_outNode = nullptr;
        Node *_inNode = nullptr;
        PortIndex _outPortIndex;
        PortIndex _inPortIndex;

      private:
        ConnectionState _connectionState;
        ConnectionGeometry _connectionGeometry;
        std::unique_ptr<ConnectionGraphicsObject> _connectionGraphicsObject;
        TypeConverter _converter;
      Q_SIGNALS:
        void updated(Connection &conn) const;
    };
} // namespace QtNodes