ExecutionSlotLayoutComponent.cpp 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  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 <Components/Slots/Execution/ExecutionSlotComponent.h>
  10. #include <Components/Slots/Execution/ExecutionSlotConnectionPin.h>
  11. #include <Components/Slots/Execution/ExecutionSlotLayoutComponent.h>
  12. namespace GraphCanvas
  13. {
  14. ////////////////////////
  15. // ExecutionSlotLayout
  16. ////////////////////////
  17. ExecutionSlotLayout::ExecutionSlotLayout(ExecutionSlotLayoutComponent& owner)
  18. : m_connectionType(ConnectionType::CT_Invalid)
  19. , m_owner(owner)
  20. , m_textDecoration(nullptr)
  21. {
  22. setInstantInvalidatePropagation(true);
  23. setOrientation(Qt::Horizontal);
  24. m_slotConnectionPin = aznew ExecutionSlotConnectionPin(owner.GetEntityId());
  25. m_slotText = aznew GraphCanvasLabel();
  26. if (const AZ::Entity* ownerEntity = owner.GetEntity())
  27. {
  28. if (const SlotComponent* slotComponent = ownerEntity->FindComponent<ExecutionSlotComponent>())
  29. {
  30. m_isNameHidden = slotComponent->IsNameHidden();
  31. }
  32. }
  33. }
  34. ExecutionSlotLayout::~ExecutionSlotLayout()
  35. {
  36. }
  37. void ExecutionSlotLayout::Activate()
  38. {
  39. SceneMemberNotificationBus::Handler::BusConnect(m_owner.GetEntityId());
  40. SlotNotificationBus::Handler::BusConnect(m_owner.GetEntityId());
  41. StyleNotificationBus::Handler::BusConnect(m_owner.GetEntityId());
  42. m_slotConnectionPin->Activate();
  43. }
  44. void ExecutionSlotLayout::Deactivate()
  45. {
  46. m_slotConnectionPin->Deactivate();
  47. SceneMemberNotificationBus::Handler::BusDisconnect();
  48. SlotNotificationBus::Handler::BusDisconnect();
  49. StyleNotificationBus::Handler::BusDisconnect();
  50. }
  51. void ExecutionSlotLayout::OnSceneSet(const AZ::EntityId&)
  52. {
  53. SlotRequests* slotRequests = SlotRequestBus::FindFirstHandler(m_owner.GetEntityId());
  54. if (slotRequests)
  55. {
  56. m_connectionType = slotRequests->GetConnectionType();
  57. OnNameChanged(slotRequests->GetName());
  58. OnTooltipChanged(slotRequests->GetTooltip());
  59. const SlotConfiguration& configuration = slotRequests->GetSlotConfiguration();
  60. if (!configuration.m_textDecoration.empty())
  61. {
  62. SetTextDecoration(configuration.m_textDecoration, configuration.m_textDecorationToolTip);
  63. }
  64. }
  65. UpdateLayout();
  66. OnStyleChanged();
  67. }
  68. void ExecutionSlotLayout::OnSceneReady()
  69. {
  70. OnStyleChanged();
  71. }
  72. void ExecutionSlotLayout::OnRegisteredToNode(const AZ::EntityId& /*nodeId*/)
  73. {
  74. OnStyleChanged();
  75. }
  76. void ExecutionSlotLayout::OnNameChanged(const AZStd::string& name)
  77. {
  78. m_slotText->SetLabel(m_isNameHidden ? "" : name);
  79. }
  80. void ExecutionSlotLayout::OnTooltipChanged(const AZStd::string& tooltip)
  81. {
  82. m_slotConnectionPin->setToolTip(tooltip.c_str());
  83. m_slotText->setToolTip(tooltip.c_str());
  84. }
  85. void ExecutionSlotLayout::OnStyleChanged()
  86. {
  87. m_style.SetStyle(m_owner.GetEntityId());
  88. ApplyTextStyle(m_slotText);
  89. if (m_textDecoration)
  90. {
  91. ApplyTextStyle(m_textDecoration);
  92. }
  93. m_slotConnectionPin->RefreshStyle();
  94. qreal padding = m_style.GetAttribute(Styling::Attribute::Padding, 2.);
  95. setContentsMargins(padding, padding, padding, padding);
  96. setSpacing(m_style.GetAttribute(Styling::Attribute::Spacing, 2.));
  97. UpdateGeometry();
  98. }
  99. void ExecutionSlotLayout::SetTextDecoration(const AZStd::string& textDecoration, const AZStd::string& toolTip)
  100. {
  101. if (m_textDecoration)
  102. {
  103. delete m_textDecoration;
  104. m_textDecoration = nullptr;
  105. }
  106. if (!textDecoration.empty())
  107. {
  108. m_textDecoration = new GraphCanvasLabel();
  109. m_textDecoration->SetLabel(textDecoration);
  110. m_textDecoration->setToolTip(toolTip.c_str());
  111. ApplyTextStyle(m_textDecoration);
  112. }
  113. }
  114. void ExecutionSlotLayout::ClearTextDecoration()
  115. {
  116. delete m_textDecoration;
  117. m_textDecoration = nullptr;
  118. }
  119. void ExecutionSlotLayout::ApplyTextStyle(GraphCanvasLabel* graphCanvasLabel)
  120. {
  121. switch (m_connectionType)
  122. {
  123. case ConnectionType::CT_Input:
  124. graphCanvasLabel->SetStyle(m_owner.GetEntityId(), ".inputSlotName");
  125. break;
  126. case ConnectionType::CT_Output:
  127. graphCanvasLabel->SetStyle(m_owner.GetEntityId(), ".outputSlotName");
  128. break;
  129. default:
  130. graphCanvasLabel->SetStyle(m_owner.GetEntityId(), ".slotName");
  131. break;
  132. };
  133. }
  134. void ExecutionSlotLayout::UpdateLayout()
  135. {
  136. for (int i = count() - 1; i >= 0; --i)
  137. {
  138. removeAt(i);
  139. }
  140. switch (m_connectionType)
  141. {
  142. case ConnectionType::CT_Input:
  143. addItem(m_slotConnectionPin);
  144. setAlignment(m_slotConnectionPin, Qt::AlignLeft);
  145. addItem(m_slotText);
  146. setAlignment(m_slotText, Qt::AlignLeft);
  147. if (m_textDecoration)
  148. {
  149. addItem(m_textDecoration);
  150. setAlignment(m_textDecoration, Qt::AlignLeft);
  151. }
  152. break;
  153. case ConnectionType::CT_Output:
  154. if (m_textDecoration)
  155. {
  156. addItem(m_textDecoration);
  157. setAlignment(m_textDecoration, Qt::AlignRight);
  158. }
  159. addItem(m_slotText);
  160. setAlignment(m_slotText, Qt::AlignRight);
  161. addItem(m_slotConnectionPin);
  162. setAlignment(m_slotConnectionPin, Qt::AlignRight);
  163. break;
  164. default:
  165. if (m_textDecoration)
  166. {
  167. addItem(m_textDecoration);
  168. }
  169. addItem(m_slotConnectionPin);
  170. addItem(m_slotText);
  171. break;
  172. }
  173. }
  174. void ExecutionSlotLayout::UpdateGeometry()
  175. {
  176. m_slotConnectionPin->updateGeometry();
  177. m_slotText->update();
  178. invalidate();
  179. updateGeometry();
  180. }
  181. /////////////////////////////////
  182. // ExecutionSlotLayoutComponent
  183. /////////////////////////////////
  184. void ExecutionSlotLayoutComponent::Reflect(AZ::ReflectContext* reflectContext)
  185. {
  186. AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(reflectContext);
  187. if (serializeContext)
  188. {
  189. serializeContext->Class<ExecutionSlotLayoutComponent, AZ::Component>()
  190. ->Version(1)
  191. ;
  192. }
  193. }
  194. ExecutionSlotLayoutComponent::ExecutionSlotLayoutComponent()
  195. : m_layout(nullptr)
  196. {
  197. }
  198. void ExecutionSlotLayoutComponent::Init()
  199. {
  200. SlotLayoutComponent::Init();
  201. m_layout = aznew ExecutionSlotLayout((*this));
  202. SetLayout(m_layout);
  203. }
  204. void ExecutionSlotLayoutComponent::Activate()
  205. {
  206. SlotLayoutComponent::Activate();
  207. m_layout->Activate();
  208. }
  209. void ExecutionSlotLayoutComponent::Deactivate()
  210. {
  211. SlotLayoutComponent::Deactivate();
  212. m_layout->Deactivate();
  213. }
  214. }