NodeGroupFrameComponent.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #pragma once
  9. #include <QGraphicsWidget>
  10. #include <qgraphicslinearlayout.h>
  11. #include <AzCore/Math/Color.h>
  12. #include <Components/Nodes/NodeFrameGraphicsWidget.h>
  13. #include <GraphCanvas/Components/Bookmarks/BookmarkBus.h>
  14. #include <GraphCanvas/Components/EntitySaveDataBus.h>
  15. #include <GraphCanvas/Components/GeometryBus.h>
  16. #include <GraphCanvas/Components/GraphCanvasPropertyBus.h>
  17. #include <GraphCanvas/Components/Nodes/Comment/CommentBus.h>
  18. #include <GraphCanvas/Components/Nodes/Group/NodeGroupBus.h>
  19. #include <GraphCanvas/Components/Nodes/NodeBus.h>
  20. #include <GraphCanvas/Components/Nodes/NodeLayoutBus.h>
  21. #include <GraphCanvas/Components/Nodes/NodeUIBus.h>
  22. #include <GraphCanvas/Components/PersistentIdBus.h>
  23. #include <GraphCanvas/Components/VisualBus.h>
  24. #include <GraphCanvas/Styling/StyleHelper.h>
  25. #include <GraphCanvas/Types/EntitySaveData.h>
  26. #include <GraphCanvas/Utils/StateControllers/StackStateController.h>
  27. #include <GraphCanvas/Utils/StateControllers/StateController.h>
  28. #include <Widgets/GraphCanvasLabel.h>
  29. namespace GraphCanvas
  30. {
  31. class NodeGroupFrameGraphicsWidget;
  32. class NodeGroupFrameTitleWidget;
  33. class NodeGroupFrameBlockAreaWidget;
  34. class NodeGroupFrameComponent
  35. : public GraphCanvasPropertyComponent
  36. , public NodeNotificationBus::Handler
  37. , public StyleNotificationBus::Handler
  38. , public EntitySaveDataRequestBus::Handler
  39. , public BookmarkRequestBus::Handler
  40. , public SceneBookmarkRequestBus::Handler
  41. , public BookmarkNotificationBus::Handler
  42. , public CommentNotificationBus::Handler
  43. , public SceneNotificationBus::Handler
  44. , public SceneMemberNotificationBus::MultiHandler
  45. , public GeometryNotificationBus::MultiHandler
  46. , public NodeGroupRequestBus::Handler
  47. , public NodeGroupNotificationBus::MultiHandler
  48. , public PersistentIdNotificationBus::Handler
  49. , public VisualNotificationBus::MultiHandler
  50. , public AZ::SystemTickBus::Handler
  51. , public RootGraphicsItemNotificationBus::Handler
  52. , public CollapsedNodeGroupNotificationBus::Handler
  53. {
  54. friend class NodeGroupFrameGraphicsWidget;
  55. public:
  56. AZ_COMPONENT(NodeGroupFrameComponent, "{71CF9059-C439-4536-BB4B-6A1872A5ED94}", GraphCanvasPropertyComponent);
  57. static void Reflect(AZ::ReflectContext*);
  58. class NodeGroupFrameComponentSaveData
  59. : public ComponentSaveData
  60. {
  61. public:
  62. AZ_RTTI(NodeGroupFrameComponentSaveData, "{6F4811ED-BD83-4A2A-8831-58EEA4020D57}", ComponentSaveData);
  63. AZ_CLASS_ALLOCATOR(NodeGroupFrameComponentSaveData, AZ::SystemAllocator, 0);
  64. NodeGroupFrameComponentSaveData();
  65. NodeGroupFrameComponentSaveData(NodeGroupFrameComponent* nodeFrameComponent);
  66. ~NodeGroupFrameComponentSaveData() = default;
  67. void operator=(const NodeGroupFrameComponentSaveData& other);
  68. void OnBookmarkStatusChanged();
  69. void OnCollapsedStatusChanged();
  70. AZ::Color m_color;
  71. float m_displayHeight;
  72. float m_displayWidth;
  73. bool m_enableAsBookmark;
  74. int m_shortcut;
  75. // Signals wether or not this group was created before or after the group refactor so we can update the initial state.
  76. bool m_isNewGroup = true;
  77. bool m_isCollapsed;
  78. AZStd::vector< PersistentGraphMemberId > m_persistentGroupedIds;
  79. private:
  80. NodeGroupFrameComponent* m_callback;
  81. };
  82. NodeGroupFrameComponent();
  83. ~NodeGroupFrameComponent() override = default;
  84. // AZ::Component
  85. static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
  86. {
  87. provided.push_back(AZ_CRC("GraphCanvas_NodeVisualService", 0x39c4e7f3));
  88. provided.push_back(AZ_CRC("GraphCanvas_RootVisualService", 0x9ec46d3b));
  89. provided.push_back(AZ_CRC("GraphCanvas_VisualService", 0xfbb2c871));
  90. }
  91. static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
  92. {
  93. incompatible.push_back(AZ_CRC("GraphCanvas_NodeVisualService", 0x39c4e7f3));
  94. incompatible.push_back(AZ_CRC("GraphCanvas_RootVisualService", 0x9ec46d3b));
  95. incompatible.push_back(AZ_CRC("GraphCanvas_VisualService", 0xfbb2c871));
  96. }
  97. static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent)
  98. {
  99. (void)dependent;
  100. }
  101. static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required)
  102. {
  103. required.push_back(AZ_CRC("GraphCanvas_NodeService", 0xcc0f32cc));
  104. required.push_back(AZ_CRC("GraphCanvas_StyledGraphicItemService", 0xeae4cdf4));
  105. }
  106. ////
  107. // AZ::Component
  108. void Init() override;
  109. void Activate() override;
  110. void Deactivate() override;
  111. ////
  112. // NodeGroupRequestBus
  113. void SetGroupSize(QRectF blockDimension) override;
  114. QRectF GetGroupBoundingBox() const override;
  115. AZ::Color GetGroupColor() const override;
  116. void CollapseGroup() override;
  117. void ExpandGroup() override;
  118. void UngroupGroup() override;
  119. bool IsCollapsed() const override;
  120. AZ::EntityId GetCollapsedNodeId() const override;
  121. void AddElementToGroup(const AZ::EntityId& groupableElement) override;
  122. void AddElementsToGroup(const AZStd::unordered_set<AZ::EntityId>& groupableElements) override;
  123. void AddElementsVectorToGroup(const AZStd::vector<AZ::EntityId>& groupableElements) override;
  124. void RemoveElementFromGroup(const AZ::EntityId& groupableElement) override;
  125. void RemoveElementsFromGroup(const AZStd::unordered_set<AZ::EntityId>& groupableElements) override;
  126. void RemoveElementsVectorFromGroup(const AZStd::vector<AZ::EntityId>& groupableElements) override;
  127. void FindGroupedElements(AZStd::vector< NodeId >& groupedElements) override;
  128. void ResizeGroupToElements(bool growGroupOnly) override;
  129. bool IsInTitle(const QPointF& scenePos) const override;
  130. void AdjustTitleSize() override;
  131. ////
  132. // NodeGroupNotifications
  133. void OnCollapsed(const NodeId& collapsedNodeId) override;
  134. void OnExpanded() override;
  135. ////
  136. // NodeNotificationBus
  137. void OnNodeActivated() override;
  138. void OnAddedToScene(const AZ::EntityId& sceneId) override;
  139. ////
  140. // SceneMemberNotificationBus
  141. void PreOnRemovedFromScene(const AZ::EntityId& sceneId) override;
  142. void OnRemovedFromScene(const AZ::EntityId& sceneId) override;
  143. void OnSceneMemberAboutToSerialize(GraphSerialization& serialziationTarget) override;
  144. void OnSceneMemberDeserialized(const AZ::EntityId& graphId, const GraphSerialization& serializationTarget) override;
  145. ////
  146. // StyleNotificationBus
  147. void OnStyleChanged() override;
  148. ////
  149. // GeometryNotificationBus
  150. void OnPositionChanged(const AZ::EntityId& entityId, const AZ::Vector2& position) override;
  151. void OnBoundsChanged() override;
  152. ////
  153. // EntitySaveDataRequestBus
  154. void WriteSaveData(EntitySaveDataContainer& saveDataContainer) const override;
  155. void ReadSaveData(const EntitySaveDataContainer& saveDataContainer) override;
  156. ////
  157. // SceneBookmarkRequests
  158. AZ::EntityId GetBookmarkId() const override;
  159. ////
  160. // BookmarkBus
  161. void RemoveBookmark() override;
  162. int GetShortcut() const override;
  163. void SetShortcut(int shortcut) override;
  164. AZStd::string GetBookmarkName() const override;
  165. void SetBookmarkName(const AZStd::string& bookmarkName) override;
  166. QRectF GetBookmarkTarget() const override;
  167. QColor GetBookmarkColor() const override;
  168. ////
  169. // BookmarkNotifications
  170. void OnBookmarkTriggered() override;
  171. ////
  172. // CommentNotificationBus
  173. void OnCommentChanged(const AZStd::string&) override;
  174. void OnBackgroundColorChanged(const AZ::Color& color) override;
  175. ////
  176. // SceneNotificationBus
  177. void OnSceneMemberDragBegin() override;
  178. void OnSceneMemberDragComplete() override;
  179. void OnDragSelectStart() override;
  180. void OnDragSelectEnd() override;
  181. void OnNodeRemoved(const AZ::EntityId& sceneMemberId) override;
  182. void OnSceneMemberRemoved(const AZ::EntityId& sceneMemberId) override;
  183. void OnEntitiesDeserializationComplete(const GraphSerialization&) override;
  184. void OnGraphLoadComplete() override;
  185. void PostOnGraphLoadComplete() override;
  186. ////
  187. // PersistentIdNotifications
  188. void OnPersistentIdsRemapped(const AZStd::unordered_map<PersistentGraphMemberId, PersistentGraphMemberId>& persistentIdRemapping) override;
  189. ////
  190. // SystemTickBus
  191. void OnSystemTick() override;
  192. ////
  193. // VisualNotificationBus
  194. void OnPositionAnimateBegin() override;
  195. void OnPositionAnimateEnd() override;
  196. ////
  197. // RootGraphicsNotificationBus
  198. void OnDisplayStateChanged(RootGraphicsItemDisplayState oldState, RootGraphicsItemDisplayState newState) override;
  199. ////
  200. // CollapsedNodeGroupNotificationBus
  201. void OnExpansionComplete() override;
  202. ////
  203. void OnFrameResizeStart();
  204. void OnFrameResized();
  205. void OnFrameResizeEnd();
  206. EditorId GetEditorId() const;
  207. protected:
  208. void RestoreCollapsedState();
  209. void TryAndRestoreCollapsedState();
  210. void FindInteriorElements(AZStd::unordered_set< AZ::EntityId >& interiorElements, Qt::ItemSelectionMode = Qt::ItemSelectionMode::ContainsItemShape);
  211. float SetDisplayHeight(float height);
  212. float SetDisplayWidth(float width);
  213. void EnableInteriorHighlight(bool highlight);
  214. void EnableGroupedDisplayState(bool enabled);
  215. void OnBookmarkStatusChanged();
  216. void UpdateSavedElements();
  217. void RemapGroupedPersistentIds();
  218. private:
  219. bool AddToGroupInternal(const AZ::EntityId& groupableElement);
  220. void UpdateHighlightState();
  221. void SetupHighlightElementsStateSetters();
  222. void SetupGroupedElementsStateSetters();
  223. void SetupSubGraphGroupedElementsStateSetters(const GraphSubGraph& subGraph);
  224. void OnElementGrouped(const AZ::EntityId& groupedElement);
  225. void OnElementUngrouped(const AZ::EntityId& ungroupedElement);
  226. NodeGroupFrameComponent(const NodeGroupFrameComponent&) = delete;
  227. const NodeGroupFrameComponent& operator=(const NodeGroupFrameComponent&) = delete;
  228. void SignalExpanded();
  229. void SetupElementsForMove();
  230. void SignalDirty();
  231. QRectF GetGroupBoundary() const;
  232. QGraphicsLinearLayout* m_displayLayout;
  233. AZStd::unique_ptr<NodeGroupFrameGraphicsWidget> m_frameWidget;
  234. NodeGroupFrameTitleWidget* m_titleWidget;
  235. NodeGroupFrameBlockAreaWidget* m_blockWidget;
  236. NodeGroupFrameComponentSaveData m_saveData;
  237. AZ::Vector2 m_previousPosition;
  238. EditorId m_editorId;
  239. AZ::EntityId m_collapsedNodeId;
  240. bool m_needsDisplayStateHighlight;
  241. bool m_needsManualHighlight;
  242. bool m_enableSelectionManipulation;
  243. bool m_ignoreDisplayStateChanges;
  244. bool m_ignoreSubSlementPostionChanged;
  245. bool m_isGroupAnimating;
  246. AZStd::unordered_set< AZ::EntityId > m_initializingGroups;
  247. AZStd::unordered_set< AZ::EntityId > m_groupedGrouped;
  248. AZStd::unordered_map< AZ::EntityId, AZ::EntityId > m_collapsedGroupMapping;
  249. AZStd::unordered_set< AZ::EntityId > m_movingElements;
  250. AZStd::unordered_set< AZ::EntityId > m_ignoreElementsOnResize;
  251. AZStd::unordered_set< AZ::EntityId > m_groupedElements;
  252. AZStd::unordered_set< AZ::EntityId > m_animatingElements;
  253. // List of redirections available on the collapsed group. Used to persist these
  254. // slots on a collapsed node post duplicate/copy and paste. Will not persist between saves.
  255. AZStd::vector< Endpoint > m_collapsedRedirectionEndpoints;
  256. StateSetter< RootGraphicsItemDisplayState > m_highlightDisplayStateStateSetter;
  257. // Grouped Element StateControllers
  258. StateSetter< RootGraphicsItemDisplayState > m_forcedGroupDisplayStateStateSetter;
  259. };
  260. //! The QGraphicsItem for the Node Group title area
  261. class NodeGroupFrameTitleWidget
  262. : public QGraphicsWidget
  263. {
  264. public:
  265. AZ_TYPE_INFO(NodeGroupFrameTitleWidget, "{FC062E52-CA81-4DA5-B9BF-48FD7BE6E374}");
  266. AZ_CLASS_ALLOCATOR(NodeGroupFrameTitleWidget, AZ::SystemAllocator, 0);
  267. NodeGroupFrameTitleWidget();
  268. void RefreshStyle(const AZ::EntityId& parentId);
  269. void SetColor(const AZ::Color& color);
  270. void RegisterFrame(NodeGroupFrameGraphicsWidget* frameWidget);
  271. // QGraphicsWidget
  272. void mousePressEvent(QGraphicsSceneMouseEvent* mouseEvent) override;
  273. void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override;
  274. QVariant itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant& value) override;
  275. ////
  276. private:
  277. Styling::StyleHelper m_styleHelper;
  278. QColor m_color;
  279. NodeGroupFrameGraphicsWidget* m_frameWidget;
  280. };
  281. //! The QGraphicsItem for the Node Group resiable area
  282. class NodeGroupFrameBlockAreaWidget
  283. : public QGraphicsWidget
  284. {
  285. public:
  286. AZ_TYPE_INFO(NodeGroupFrameBlockAreaWidget, "{9278BBBC-5872-4CA0-9F09-10BAE77ECA7E}");
  287. AZ_CLASS_ALLOCATOR(NodeGroupFrameBlockAreaWidget, AZ::SystemAllocator, 0);
  288. NodeGroupFrameBlockAreaWidget();
  289. void RegisterFrame(NodeGroupFrameGraphicsWidget* frame);
  290. void RefreshStyle(const AZ::EntityId& parentId);
  291. void SetColor(const AZ::Color& color);
  292. // QGraphicsWidget
  293. void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override;
  294. ////
  295. private:
  296. Styling::StyleHelper m_styleHelper;
  297. QColor m_color;
  298. NodeGroupFrameGraphicsWidget* m_frameWidget;
  299. };
  300. //! The QGraphicsItem for the Node Group frame.
  301. class NodeGroupFrameGraphicsWidget
  302. : public NodeFrameGraphicsWidget
  303. , public CommentNotificationBus::Handler
  304. , public SceneMemberNotificationBus::Handler
  305. {
  306. friend class NodeGroupFrameComponent;
  307. friend class NodeGroupFrameTitleWidget;
  308. public:
  309. AZ_TYPE_INFO(NodeGroupFrameGraphicsWidget, "{708C3817-C668-47B7-A4CB-0896425E634A}");
  310. AZ_CLASS_ALLOCATOR(NodeGroupFrameGraphicsWidget, AZ::SystemAllocator, 0);
  311. // Do not allow Serialization of Graphics Ui classes
  312. static void Reflect(AZ::ReflectContext*) = delete;
  313. NodeGroupFrameGraphicsWidget(const AZ::EntityId& nodeVisual, NodeGroupFrameComponent& frameComponent);
  314. ~NodeGroupFrameGraphicsWidget() override = default;
  315. void RefreshStyle(const AZ::EntityId& styleEntity);
  316. void SetResizableMinimum(const QSizeF& minimumSize);
  317. void SetUseTitleShape(bool enable);
  318. // NodeFrameGraphicsWidget
  319. void OnActivated() override;
  320. QPainterPath GetOutline() const override;
  321. ////
  322. // QGraphicsWidget
  323. void hoverEnterEvent(QGraphicsSceneHoverEvent* hoverEvent) override;
  324. void hoverMoveEvent(QGraphicsSceneHoverEvent* hoverEvent) override;
  325. void hoverLeaveEvent(QGraphicsSceneHoverEvent* hoverEvent) override;
  326. void mousePressEvent(QGraphicsSceneMouseEvent* pressEvent) override;
  327. void mouseMoveEvent(QGraphicsSceneMouseEvent* mouseEvent) override;
  328. void mouseReleaseEvent(QGraphicsSceneMouseEvent* releaseEvent) override;
  329. bool sceneEventFilter(QGraphicsItem*, QEvent* event) override;
  330. ////
  331. // CommentNotificationBus
  332. void OnEditBegin() override;
  333. void OnEditEnd() override;
  334. void OnCommentSizeChanged(const QSizeF& oldSize, const QSizeF& newSize) override;
  335. void OnCommentFontReloadBegin() override;
  336. void OnCommentFontReloadEnd() override;
  337. ////
  338. // QGraphicsItem
  339. void mouseDoubleClickEvent(QGraphicsSceneMouseEvent* mouseEvent) override;
  340. void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override;
  341. QPainterPath shape() const override;
  342. QVariant itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant& value) override;
  343. ////
  344. // SceneMemberNotificationBus
  345. void OnMemberSetupComplete() override;
  346. ////
  347. void ResizeToGroup(int adjustHorizontal, int adjustVertical, bool growOnly = false);
  348. protected:
  349. void UpdateHighlightState();
  350. void SetHighlightState(bool highlightState);
  351. void ResizeTo(float height, float width);
  352. // NodeFrameGraphicsWidget
  353. void OnDeactivated() override;
  354. ////
  355. private:
  356. void UpdateMinimumSize();
  357. void ResetCursor();
  358. void UpdateCursor(QPointF cursorPoint);
  359. Styling::StyleHelper m_borderStyle;
  360. NodeGroupFrameComponent& m_nodeFrameComponent;
  361. bool m_useTitleShape;
  362. bool m_allowCommentReaction;
  363. bool m_allowMovement;
  364. bool m_resizeComment;
  365. bool m_allowDraw;
  366. int m_adjustVertical;
  367. int m_adjustHorizontal;
  368. bool m_overTitleWidget;
  369. bool m_isSelected;
  370. bool m_enableHighlight;
  371. QSizeF m_minimumSize;
  372. QSizeF m_resizableMinimum;
  373. };
  374. }