ExtenderSlotLayoutComponent.cpp 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  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. #include <QCoreApplication>
  9. #include <QGraphicsLayoutItem>
  10. #include <QGraphicsScene>
  11. #include <QGraphicsSceneEvent>
  12. #include <QSizePolicy>
  13. #include <Components/Slots/Extender/ExtenderSlotLayoutComponent.h>
  14. #include <GraphCanvas/Components/Slots/SlotBus.h>
  15. #include <GraphCanvas/Components/Slots/Extender/ExtenderSlotBus.h>
  16. #include <GraphCanvas/Editor/GraphModelBus.h>
  17. #include <GraphCanvas/GraphCanvasBus.h>
  18. #include <GraphCanvas/GraphicsItems/GraphCanvasSceneEventFilter.h>
  19. #include <Components/Slots/Extender/ExtenderSlotConnectionPin.h>
  20. #include <Widgets/GraphCanvasLabel.h>
  21. namespace GraphCanvas
  22. {
  23. class ExtenderLabelEventFilter
  24. : public SceneEventFilter
  25. {
  26. public:
  27. AZ_CLASS_ALLOCATOR(ExtenderLabelEventFilter, AZ::SystemAllocator);
  28. ExtenderLabelEventFilter(const SlotId& slotId)
  29. : SceneEventFilter(nullptr)
  30. , m_trackClick(false)
  31. , m_slotId(slotId)
  32. {
  33. }
  34. bool sceneEventFilter(QGraphicsItem* item, QEvent* event) override
  35. {
  36. switch (event->type())
  37. {
  38. case QEvent::GraphicsSceneMousePress:
  39. {
  40. m_trackClick = true;
  41. return true;
  42. }
  43. case QEvent::GraphicsSceneMouseRelease:
  44. {
  45. QGraphicsSceneMouseEvent* mouseEvent = static_cast<QGraphicsSceneMouseEvent*>(event);
  46. if (m_trackClick && item->sceneBoundingRect().contains(mouseEvent->scenePos()))
  47. {
  48. m_trackClick = false;
  49. ExtenderSlotRequestBus::Event(m_slotId, &ExtenderSlotRequests::TriggerExtension);
  50. }
  51. return true;
  52. }
  53. default:
  54. break;
  55. }
  56. return false;
  57. }
  58. private:
  59. bool m_trackClick;
  60. SlotId m_slotId;
  61. };
  62. ///////////////////////
  63. // ExtenderSlotLayout
  64. ///////////////////////
  65. ExtenderSlotLayout::ExtenderSlotLayout(ExtenderSlotLayoutComponent& owner)
  66. : m_connectionType(ConnectionType::CT_Invalid)
  67. , m_owner(owner)
  68. {
  69. setInstantInvalidatePropagation(true);
  70. setOrientation(Qt::Horizontal);
  71. // Event Filter needs to be in the same scene. Ergo we will wait until the scene is set before trying
  72. // to install this event filter.
  73. m_slotLabelFilter = aznew ExtenderLabelEventFilter(owner.GetEntityId());
  74. m_slotConnectionPin = aznew ExtenderSlotConnectionPin(owner.GetEntityId());
  75. m_slotText = aznew GraphCanvasLabel();
  76. m_slotText->setAcceptHoverEvents(true);
  77. m_slotText->setAcceptedMouseButtons(Qt::MouseButton::LeftButton);
  78. }
  79. ExtenderSlotLayout::~ExtenderSlotLayout()
  80. {
  81. m_slotText->removeSceneEventFilter(m_slotLabelFilter);
  82. delete m_slotLabelFilter;
  83. }
  84. void ExtenderSlotLayout::Activate()
  85. {
  86. SceneMemberNotificationBus::Handler::BusConnect(m_owner.GetEntityId());
  87. SlotNotificationBus::Handler::BusConnect(m_owner.GetEntityId());
  88. StyleNotificationBus::Handler::BusConnect(m_owner.GetEntityId());
  89. m_slotConnectionPin->Activate();
  90. }
  91. void ExtenderSlotLayout::Deactivate()
  92. {
  93. m_slotConnectionPin->Deactivate();
  94. SceneMemberNotificationBus::Handler::BusDisconnect();
  95. SlotNotificationBus::Handler::BusDisconnect();
  96. StyleNotificationBus::Handler::BusDisconnect();
  97. }
  98. void ExtenderSlotLayout::OnSceneSet(const AZ::EntityId& graphId)
  99. {
  100. SlotRequestBus::EventResult(m_connectionType, m_owner.GetEntityId(), &SlotRequests::GetConnectionType);
  101. AZStd::string slotName;
  102. SlotRequestBus::EventResult(slotName, m_owner.GetEntityId(), &SlotRequests::GetName);
  103. m_slotText->SetLabel(slotName);
  104. AZStd::string toolTip;
  105. SlotRequestBus::EventResult(toolTip, m_owner.GetEntityId(), &SlotRequests::GetTooltip);
  106. OnTooltipChanged(toolTip);
  107. QGraphicsScene* graphicsScene = nullptr;
  108. SceneRequestBus::EventResult(graphicsScene, graphId, &SceneRequests::AsQGraphicsScene);
  109. if (graphicsScene)
  110. {
  111. graphicsScene->addItem(m_slotLabelFilter);
  112. }
  113. UpdateLayout();
  114. OnStyleChanged();
  115. }
  116. void ExtenderSlotLayout::OnSceneReady()
  117. {
  118. OnStyleChanged();
  119. }
  120. void ExtenderSlotLayout::OnRegisteredToNode(const AZ::EntityId& /*nodeId*/)
  121. {
  122. OnStyleChanged();
  123. }
  124. void ExtenderSlotLayout::OnNameChanged(const AZStd::string& name)
  125. {
  126. m_slotText->SetLabel(name);
  127. }
  128. void ExtenderSlotLayout::OnTooltipChanged(const AZStd::string& tooltip)
  129. {
  130. m_slotConnectionPin->setToolTip(tooltip.c_str());
  131. m_slotText->setToolTip(tooltip.c_str());
  132. }
  133. void ExtenderSlotLayout::OnStyleChanged()
  134. {
  135. m_style.SetStyle(m_owner.GetEntityId());
  136. switch (m_connectionType)
  137. {
  138. case ConnectionType::CT_Input:
  139. m_slotText->SetStyle(m_owner.GetEntityId(), ".inputSlotName");
  140. break;
  141. case ConnectionType::CT_Output:
  142. m_slotText->SetStyle(m_owner.GetEntityId(), ".outputSlotName");
  143. break;
  144. default:
  145. m_slotText->SetStyle(m_owner.GetEntityId(), ".slotName");
  146. break;
  147. };
  148. m_slotConnectionPin->RefreshStyle();
  149. qreal padding = m_style.GetAttribute(Styling::Attribute::Padding, 2.);
  150. setContentsMargins(padding, padding, padding, padding);
  151. setSpacing(m_style.GetAttribute(Styling::Attribute::Spacing, 2.));
  152. UpdateGeometry();
  153. }
  154. void ExtenderSlotLayout::UpdateLayout()
  155. {
  156. for (int i = count() - 1; i >= 0; --i)
  157. {
  158. removeAt(i);
  159. }
  160. switch (m_connectionType)
  161. {
  162. case ConnectionType::CT_Input:
  163. addItem(m_slotConnectionPin);
  164. setAlignment(m_slotConnectionPin, Qt::AlignLeft);
  165. addItem(m_slotText);
  166. setAlignment(m_slotText, Qt::AlignLeft);
  167. break;
  168. case ConnectionType::CT_Output:
  169. addItem(m_slotText);
  170. setAlignment(m_slotText, Qt::AlignRight);
  171. addItem(m_slotConnectionPin);
  172. setAlignment(m_slotConnectionPin, Qt::AlignRight);
  173. break;
  174. default:
  175. addItem(m_slotConnectionPin);
  176. addItem(m_slotText);
  177. break;
  178. }
  179. if (m_slotText)
  180. {
  181. m_slotText->installSceneEventFilter(m_slotLabelFilter);
  182. }
  183. }
  184. void ExtenderSlotLayout::UpdateGeometry()
  185. {
  186. m_slotConnectionPin->updateGeometry();
  187. m_slotText->update();
  188. invalidate();
  189. updateGeometry();
  190. }
  191. ////////////////////////////////
  192. // ExtenderSlotLayoutComponent
  193. ////////////////////////////////
  194. void ExtenderSlotLayoutComponent::Reflect(AZ::ReflectContext* reflectContext)
  195. {
  196. AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(reflectContext);
  197. if (serializeContext)
  198. {
  199. serializeContext->Class<ExtenderSlotLayoutComponent, AZ::Component>()
  200. ->Version(1)
  201. ;
  202. }
  203. }
  204. ExtenderSlotLayoutComponent::ExtenderSlotLayoutComponent()
  205. : m_layout(nullptr)
  206. {
  207. }
  208. void ExtenderSlotLayoutComponent::Init()
  209. {
  210. SlotLayoutComponent::Init();
  211. m_layout = aznew ExtenderSlotLayout((*this));
  212. SetLayout(m_layout);
  213. }
  214. void ExtenderSlotLayoutComponent::Activate()
  215. {
  216. SlotLayoutComponent::Activate();
  217. m_layout->Activate();
  218. }
  219. void ExtenderSlotLayoutComponent::Deactivate()
  220. {
  221. SlotLayoutComponent::Deactivate();
  222. m_layout->Deactivate();
  223. }
  224. }