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
|