WrapperNodeLayoutComponent.h 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  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 <QGraphicsLinearLayout>
  10. #include <qgraphicswidget.h>
  11. #include <AzCore/Component/Component.h>
  12. #include <AzCore/Component/EntityBus.h>
  13. #include <AzCore/std/containers/set.h>
  14. #include <Components/Nodes/NodeLayoutComponent.h>
  15. #include <GraphCanvas/Components/Nodes/NodeLayoutBus.h>
  16. #include <GraphCanvas/Components/Nodes/Wrapper/WrapperNodeBus.h>
  17. #include <GraphCanvas/Components/StyleBus.h>
  18. #include <GraphCanvas/Styling/StyleHelper.h>
  19. class QGraphicsGridLayout;
  20. class QMimeData;
  21. namespace GraphCanvas
  22. {
  23. class GraphCanvasLabel;
  24. //! Lays out the parts of the generic Node
  25. class WrapperNodeLayoutComponent
  26. : public NodeLayoutComponent
  27. , public NodeNotificationBus::MultiHandler
  28. , public WrapperNodeRequestBus::Handler
  29. , public StyleNotificationBus::Handler
  30. , public SceneMemberNotificationBus::MultiHandler
  31. {
  32. private:
  33. typedef AZStd::unordered_map< AZ::EntityId, WrappedNodeConfiguration > WrappedNodeConfigurationMap;
  34. class WrappedNodeConfigurationComparator
  35. {
  36. public:
  37. WrappedNodeConfigurationComparator()
  38. : m_configurations(nullptr)
  39. {
  40. AZ_Assert(false, "Trying to use invalid ConfigurationComparator");
  41. }
  42. WrappedNodeConfigurationComparator(const WrappedNodeConfigurationMap* configurationMap)
  43. : m_configurations(configurationMap)
  44. {
  45. }
  46. bool operator()(const AZ::EntityId& a, const AZ::EntityId& b)
  47. {
  48. return m_configurations->at(a) < m_configurations->at(b);
  49. }
  50. private:
  51. const WrappedNodeConfigurationMap* m_configurations;
  52. };
  53. typedef AZStd::set<AZ::EntityId, WrappedNodeConfigurationComparator> WrappedNodeSet;
  54. class WrappedNodeLayout
  55. : public QGraphicsWidget
  56. {
  57. public:
  58. AZ_CLASS_ALLOCATOR(WrappedNodeLayout, AZ::SystemAllocator, 0);
  59. WrappedNodeLayout(WrapperNodeLayoutComponent& wrapperLayoutComponent);
  60. ~WrappedNodeLayout();
  61. void RefreshStyle();
  62. void RefreshLayout();
  63. void ClearLayout();
  64. private:
  65. void LayoutItems();
  66. WrapperNodeLayoutComponent& m_wrapperLayoutComponent;
  67. Styling::StyleHelper m_styleHelper;
  68. QGraphicsLinearLayout* m_layout;
  69. };
  70. class WrappedNodeActionGraphicsWidget
  71. : public QGraphicsWidget
  72. {
  73. public:
  74. enum class StyleState
  75. {
  76. Empty,
  77. HasElements,
  78. };
  79. AZ_CLASS_ALLOCATOR(WrappedNodeActionGraphicsWidget, AZ::SystemAllocator, 0);
  80. WrappedNodeActionGraphicsWidget(WrapperNodeLayoutComponent& wrapperLayoutComponent);
  81. void OnAddedToScene();
  82. void RefreshStyle();
  83. void SetActionString(const QString& addNodeString);
  84. void SetStyleState(StyleState state);
  85. private:
  86. bool sceneEventFilter(QGraphicsItem* watched, QEvent* event) override;
  87. bool m_acceptDrop;
  88. WrapperNodeLayoutComponent& m_wrapperLayoutComponent;
  89. StyleState m_styleState;
  90. GraphCanvasLabel* m_displayLabel;
  91. };
  92. friend class AddWrappedNodeGraphicsWidget;
  93. friend class WrappedNodeLayout;
  94. public:
  95. AZ_COMPONENT(WrapperNodeLayoutComponent, "{15A56424-0846-45D7-A4C2-ADCAE3E98DE0}", NodeLayoutComponent);
  96. static void Reflect(AZ::ReflectContext*);
  97. static AZ::Entity* CreateWrapperNodeEntity(const char* nodeType);
  98. WrapperNodeLayoutComponent();
  99. ~WrapperNodeLayoutComponent() override;
  100. // AZ::Component
  101. static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
  102. {
  103. provided.push_back(NodeLayoutServiceCrc);
  104. provided.push_back(WrapperNodeLayoutServiceCrc);
  105. }
  106. static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
  107. {
  108. incompatible.push_back(NodeLayoutServiceCrc);
  109. incompatible.push_back(WrapperNodeLayoutServiceCrc);
  110. }
  111. static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent)
  112. {
  113. dependent.push_back(AZ_CRC("GraphCanvas_NodeLayoutSupportService", 0xa8b639be));
  114. dependent.push_back(AZ_CRC("GraphCanvas_TitleService", 0xfe6d63bc));
  115. dependent.push_back(AZ_CRC("GraphCanvas_SlotsContainerService", 0x948b6696));
  116. }
  117. static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required)
  118. {
  119. required.push_back(AZ_CRC("GraphCanvas_NodeService", 0xcc0f32cc));
  120. required.push_back(AZ_CRC("GraphCanvas_StyledGraphicItemService", 0xeae4cdf4));
  121. }
  122. void Init() override;
  123. void Activate() override;
  124. void Deactivate() override;
  125. ////
  126. // WrapperNodeRequestBus
  127. void SetActionString(const QString& actionString) override;
  128. AZStd::vector< AZ::EntityId > GetWrappedNodeIds() const override;
  129. void WrapNode(const AZ::EntityId& nodeId, const WrappedNodeConfiguration& nodeConfiguration) override;
  130. void UnwrapNode(const AZ::EntityId& nodeId) override;
  131. void SetWrapperType(const AZ::Crc32& wrapperType) override;
  132. AZ::Crc32 GetWrapperType() const override;
  133. ////
  134. // NodeNotificationBus
  135. void OnNodeActivated() override;
  136. void OnAddedToScene(const AZ::EntityId& sceneId) override;
  137. ////
  138. // SceneMemberNotification
  139. void OnSceneMemberAboutToSerialize(GraphSerialization& sceneSerialization) override;
  140. void OnSceneMemberDeserialized(const AZ::EntityId& graphId, const GraphSerialization& sceneSerialization) override;
  141. void OnRemovedFromScene(const AZ::EntityId& sceneId) override;
  142. ////
  143. // StyleNotificationBus
  144. void OnStyleChanged() override;
  145. ////
  146. protected:
  147. void RefreshActionStyle();
  148. bool ShouldAcceptDrop(const QMimeData* mimeData) const;
  149. void OnDragLeave() const;
  150. void OnActionWidgetClicked(const QPointF& scenePoint, const QPoint& screenPoint) const;
  151. void ClearLayout();
  152. void CreateLayout();
  153. void UpdateLayout();
  154. void RefreshDisplay();
  155. Styling::StyleHelper m_styleHelper;
  156. AZ::Crc32 m_wrapperType;
  157. AZ::u32 m_elementCounter;
  158. WrappedNodeConfigurationMap m_wrappedNodeConfigurations;
  159. WrappedNodeSet m_wrappedNodes;
  160. // Overall Layout
  161. QGraphicsLayoutItem* m_title;
  162. QGraphicsLayoutItem* m_slots;
  163. WrappedNodeLayout* m_wrappedNodeLayout;
  164. WrappedNodeActionGraphicsWidget* m_wrapperNodeActionWidget;
  165. };
  166. }