Plasma Engine  2.0
Loading...
Searching...
No Matches
NodeScene.moc.h
1#pragma once
2
3#include <Foundation/Containers/Map.h>
4#include <GuiFoundation/GuiFoundationDLL.h>
5#include <QGraphicsItem>
6#include <QGraphicsScene>
7#include <ToolsFoundation/Factory/RttiMappedObjectFactory.h>
8#include <ToolsFoundation/NodeObject/DocumentNodeManager.h>
9
10class plQtNode;
11class plQtPin;
12class plQtConnection;
14
15class PL_GUIFOUNDATION_DLL plQtNodeScene : public QGraphicsScene
16{
17 Q_OBJECT
18public:
19 enum Type
20 {
21 Node = QGraphicsItem::UserType + 1,
22 Pin,
23 Connection
24 };
25
26 explicit plQtNodeScene(QObject* pParent = nullptr);
28
29 virtual void InitScene(const plDocumentNodeManager* pManager);
30 const plDocumentNodeManager* GetDocumentNodeManager() const;
31 const plDocument* GetDocument() const;
32
33 static plRttiMappedObjectFactory<plQtNode>& GetNodeFactory();
34 static plRttiMappedObjectFactory<plQtPin>& GetPinFactory();
35 static plRttiMappedObjectFactory<plQtConnection>& GetConnectionFactory();
36 static plVec2 GetLastMouseInteractionPos() { return s_vLastMouseInteraction; }
37
39 {
40 using StorageType = plUInt32;
41
42 enum Enum
43 {
44 BezierCurve,
45 StraightLine,
46 SubwayLines,
47
48 Default = SubwayLines
49 };
50 };
51
52 void SetConnectionStyle(plEnum<ConnectionStyle> style);
53 plEnum<ConnectionStyle> GetConnectionStyle() const { return m_ConnectionStyle; }
54
56 {
57 using StorageType = plUInt32;
58
59 enum Enum
60 {
61 DirectionArrows = PL_BIT(0),
62 DrawDebugging = PL_BIT(1),
63
64 Default = 0
65 };
66
67 struct Bits
68 {
69 StorageType DirectionArrows : 1;
70 StorageType DrawDebugging : 1;
71 };
72 };
73
74 void SetConnectionDecorationFlags(plBitflags<ConnectionDecorationFlags> flags);
75 plBitflags<ConnectionDecorationFlags> GetConnectionDecorationFlags() const { return m_ConnectionDecorationFlags; }
76
77protected:
78 virtual void mouseMoveEvent(QGraphicsSceneMouseEvent* event) override;
79 virtual void mousePressEvent(QGraphicsSceneMouseEvent* event) override;
80 virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent* event) override;
81 virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent* contextMenuEvent) override;
82 virtual void keyPressEvent(QKeyEvent* event) override;
83
84private:
85 void Clear();
86 void CreateQtNode(const plDocumentObject* pObject);
87 void DeleteQtNode(const plDocumentObject* pObject);
88 void CreateQtConnection(const plDocumentObject* pObject);
89 void DeleteQtConnection(const plDocumentObject* pObject);
90 void RecreateQtPins(const plDocumentObject* pObject);
91 void CreateNodeObject(const plNodeCreationTemplate& nodeTemplate);
92 void NodeEventsHandler(const plDocumentNodeManagerEvent& e);
93 void PropertyEventsHandler(const plDocumentObjectPropertyEvent& e);
94 void SelectionEventsHandler(const plSelectionManagerEvent& e);
95 void GetSelectedNodes(plDeque<plQtNode*>& selection) const;
96 void MarkupConnectablePins(plQtPin* pSourcePin);
97 void ResetConnectablePinMarkup();
98 void OpenSearchMenu(QPoint screenPos);
99
100protected:
101 virtual plStatus RemoveNode(plQtNode* pNode);
102 virtual void RemoveSelectedNodesAction();
103 virtual void ConnectPinsAction(const plPin& sourcePin, const plPin& targetPin);
104 virtual void DisconnectPinsAction(plQtConnection* pConnection);
105 virtual void DisconnectPinsAction(plQtPin* pPin);
106
107private Q_SLOTS:
108 void OnMenuItemTriggered(const QString& sName, const QVariant& variant);
109 void OnSelectionChanged();
110
111private:
112 static plRttiMappedObjectFactory<plQtNode> s_NodeFactory;
113 static plRttiMappedObjectFactory<plQtPin> s_PinFactory;
114 static plRttiMappedObjectFactory<plQtConnection> s_ConnectionFactory;
115
116protected:
117 const plDocumentNodeManager* m_pManager = nullptr;
118
121
122private:
123 bool m_bIgnoreSelectionChange = false;
124 plQtPin* m_pStartPin = nullptr;
125 plQtConnection* m_pTempConnection = nullptr;
126 plQtNode* m_pTempNode = nullptr;
128 plVec2 m_vMousePos = plVec2::MakeZero();
129 QString m_sContextMenuSearchText;
130 plDynamicArray<const plQtPin*> m_ConnectablePins;
131 plEnum<ConnectionStyle> m_ConnectionStyle;
132 plBitflags<ConnectionDecorationFlags> m_ConnectionDecorationFlags;
133
134 plDynamicArray<plNodeCreationTemplate> m_NodeCreationTemplates;
135
136 static plVec2 s_vLastMouseInteraction;
137};
138
139PL_DECLARE_FLAGS_OPERATORS(plQtNodeScene::ConnectionDecorationFlags);
Definition Deque.h:270
Definition Document.h:57
Definition DocumentNodeManager.h:141
Definition DocumentObjectBase.h:11
Definition DynamicArray.h:81
Definition Map.h:408
Definition DocumentNodeManager.h:59
Definition Connection.h:10
Definition Node.h:41
Definition NodeScene.moc.h:16
Definition Pin.h:20
A factory that creates the closest matching objects according to the passed type.
Definition RttiMappedObjectFactory.h:13
static constexpr plVec2Template< float > MakeZero()
Definition Vec2.h:49
The plBitflags class allows you to work with type-safe bitflags.
Definition Bitflags.h:82
Definition DocumentNodeManager.h:12
Used by plDocumentObjectManager::m_PropertyEvents.
Definition DocumentObjectManager.h:77
A custom enum implementation that allows to define the underlying storage type to control its memory ...
Definition Enum.h:37
Describes a template that will be used to create new nodes. In most cases this only contains the type...
Definition DocumentNodeManager.h:116
Definition NodeScene.moc.h:56
Enum
Definition NodeScene.moc.h:60
Definition NodeScene.moc.h:39
Definition SelectionManager.h:10
An plResult with an additional message for the reason of failure.
Definition Status.h:12