UiTooltipComponent.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  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 "UiTooltipComponent.h"
  9. #include <AzCore/Serialization/SerializeContext.h>
  10. #include <AzCore/Serialization/EditContext.h>
  11. #include <AzCore/RTTI/BehaviorContext.h>
  12. #include <LyShine/Bus/UiElementBus.h>
  13. #include <LyShine/Bus/UiTextBus.h>
  14. ////////////////////////////////////////////////////////////////////////////////////////////////////
  15. // PUBLIC MEMBER FUNCTIONS
  16. ////////////////////////////////////////////////////////////////////////////////////////////////////
  17. ////////////////////////////////////////////////////////////////////////////////////////////////////
  18. UiTooltipComponent::UiTooltipComponent()
  19. : m_curTriggerMode(UiTooltipDisplayInterface::TriggerMode::OnHover)
  20. {
  21. }
  22. ////////////////////////////////////////////////////////////////////////////////////////////////////
  23. UiTooltipComponent::~UiTooltipComponent()
  24. {
  25. }
  26. ////////////////////////////////////////////////////////////////////////////////////////////////////
  27. void UiTooltipComponent::Update([[maybe_unused]] float deltaTime)
  28. {
  29. if (m_curDisplayElementId.IsValid())
  30. {
  31. UiTooltipDisplayBus::Event(m_curDisplayElementId, &UiTooltipDisplayBus::Events::Update);
  32. }
  33. }
  34. ////////////////////////////////////////////////////////////////////////////////////////////////////
  35. void UiTooltipComponent::OnHoverStart()
  36. {
  37. if (GetDisplayElementTriggerMode() == UiTooltipDisplayInterface::TriggerMode::OnHover)
  38. {
  39. TriggerTooltip(UiTooltipDisplayInterface::TriggerMode::OnHover);
  40. }
  41. }
  42. ////////////////////////////////////////////////////////////////////////////////////////////////////
  43. void UiTooltipComponent::OnHoverEnd()
  44. {
  45. if (IsTriggeredWithMode(UiTooltipDisplayInterface::TriggerMode::OnHover))
  46. {
  47. HideDisplayElement();
  48. }
  49. }
  50. ////////////////////////////////////////////////////////////////////////////////////////////////////
  51. void UiTooltipComponent::OnPressed()
  52. {
  53. if (IsTriggeredWithMode(UiTooltipDisplayInterface::TriggerMode::OnHover))
  54. {
  55. HideDisplayElement();
  56. }
  57. else
  58. {
  59. if (GetDisplayElementTriggerMode() == UiTooltipDisplayInterface::TriggerMode::OnPress)
  60. {
  61. TriggerTooltip(UiTooltipDisplayInterface::TriggerMode::OnPress);
  62. }
  63. }
  64. }
  65. ////////////////////////////////////////////////////////////////////////////////////////////////////
  66. void UiTooltipComponent::OnReleased()
  67. {
  68. if (IsTriggeredWithMode(UiTooltipDisplayInterface::TriggerMode::OnPress))
  69. {
  70. HideDisplayElement();
  71. }
  72. else
  73. {
  74. if (GetDisplayElementTriggerMode() == UiTooltipDisplayInterface::TriggerMode::OnClick)
  75. {
  76. TriggerTooltip(UiTooltipDisplayInterface::TriggerMode::OnClick);
  77. }
  78. }
  79. }
  80. ////////////////////////////////////////////////////////////////////////////////////////////////////
  81. void UiTooltipComponent::OnCanvasPrimaryReleased([[maybe_unused]] AZ::EntityId entityId)
  82. {
  83. // This callback is needed because OnReleased is only called when the mouse is over the element
  84. if (IsTriggeredWithMode(UiTooltipDisplayInterface::TriggerMode::OnPress))
  85. {
  86. HideDisplayElement();
  87. }
  88. if (IsTriggeredWithMode(UiTooltipDisplayInterface::TriggerMode::OnClick))
  89. {
  90. HideDisplayElement();
  91. }
  92. }
  93. ////////////////////////////////////////////////////////////////////////////////////////////////////
  94. void UiTooltipComponent::PushDataToDisplayElement(AZ::EntityId displayEntityId)
  95. {
  96. AZ::EntityId textEntityId;
  97. UiTooltipDisplayBus::EventResult(textEntityId, displayEntityId, &UiTooltipDisplayBus::Events::GetTextEntity);
  98. if (textEntityId.IsValid())
  99. {
  100. UiTextBus::Event(textEntityId, &UiTextBus::Events::SetText, m_text);
  101. }
  102. }
  103. ////////////////////////////////////////////////////////////////////////////////////////////////////
  104. AZStd::string UiTooltipComponent::GetText()
  105. {
  106. return m_text;
  107. }
  108. ////////////////////////////////////////////////////////////////////////////////////////////////////
  109. void UiTooltipComponent::SetText(const AZStd::string& text)
  110. {
  111. m_text = text;
  112. }
  113. ////////////////////////////////////////////////////////////////////////////////////////////////////
  114. void UiTooltipComponent::OnHiding()
  115. {
  116. HandleDisplayElementHidden();
  117. }
  118. ////////////////////////////////////////////////////////////////////////////////////////////////////
  119. void UiTooltipComponent::OnHidden()
  120. {
  121. HandleDisplayElementHidden();
  122. }
  123. ////////////////////////////////////////////////////////////////////////////////////////////////////
  124. // PUBLIC STATIC MEMBER FUNCTIONS
  125. ////////////////////////////////////////////////////////////////////////////////////////////////////
  126. void UiTooltipComponent::Reflect(AZ::ReflectContext* context)
  127. {
  128. AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context);
  129. if (serializeContext)
  130. {
  131. serializeContext->Class<UiTooltipComponent, AZ::Component>()
  132. ->Version(1)
  133. ->Field("Text", &UiTooltipComponent::m_text);
  134. AZ::EditContext* ec = serializeContext->GetEditContext();
  135. if (ec)
  136. {
  137. auto editInfo = ec->Class<UiTooltipComponent>("Tooltip", "A component that provides the data needed to display a tooltip.");
  138. editInfo->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  139. ->Attribute(AZ::Edit::Attributes::Category, "UI")
  140. ->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/UiTooltip.png")
  141. ->Attribute(AZ::Edit::Attributes::ViewportIcon, "Editor/Icons/Components/Viewport/UiTooltip.png")
  142. ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("UI", 0x27ff46b0))
  143. ->Attribute(AZ::Edit::Attributes::AutoExpand, true);
  144. editInfo->DataElement(0, &UiTooltipComponent::m_text, "Text", "The text string.");
  145. }
  146. }
  147. AZ::BehaviorContext* behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context);
  148. if (behaviorContext)
  149. {
  150. behaviorContext->EBus<UiTooltipBus>("UiTooltipBus")
  151. ->Event("GetText", &UiTooltipBus::Events::GetText)
  152. ->Event("SetText", &UiTooltipBus::Events::SetText);
  153. }
  154. }
  155. ////////////////////////////////////////////////////////////////////////////////////////////////////
  156. // PROTECTED MEMBER FUNCTIONS
  157. ////////////////////////////////////////////////////////////////////////////////////////////////////
  158. ////////////////////////////////////////////////////////////////////////////////////////////////////
  159. void UiTooltipComponent::Activate()
  160. {
  161. UiInteractableNotificationBus::Handler::BusConnect(GetEntityId());
  162. UiTooltipDataPopulatorBus::Handler::BusConnect(GetEntityId());
  163. UiTooltipBus::Handler::BusConnect(GetEntityId());
  164. }
  165. ////////////////////////////////////////////////////////////////////////////////////////////////////
  166. void UiTooltipComponent::Deactivate()
  167. {
  168. UiCanvasUpdateNotificationBus::Handler::BusDisconnect();
  169. UiInteractableNotificationBus::Handler::BusDisconnect();
  170. UiCanvasInputNotificationBus::Handler::BusDisconnect();
  171. UiTooltipDisplayNotificationBus::Handler::BusDisconnect();
  172. UiTooltipDataPopulatorBus::Handler::BusDisconnect();
  173. UiTooltipBus::Handler::BusDisconnect();
  174. }
  175. ////////////////////////////////////////////////////////////////////////////////////////////////////
  176. void UiTooltipComponent::HideDisplayElement()
  177. {
  178. if (m_curDisplayElementId.IsValid())
  179. {
  180. UiTooltipDisplayBus::Event(m_curDisplayElementId, &UiTooltipDisplayBus::Events::Hide);
  181. HandleDisplayElementHidden();
  182. }
  183. }
  184. ////////////////////////////////////////////////////////////////////////////////////////////////////
  185. void UiTooltipComponent::HandleDisplayElementHidden()
  186. {
  187. if (m_curDisplayElementId.IsValid())
  188. {
  189. m_curDisplayElementId.SetInvalid();
  190. UiCanvasUpdateNotificationBus::Handler::BusDisconnect();
  191. UiCanvasInputNotificationBus::Handler::BusDisconnect();
  192. UiTooltipDisplayNotificationBus::Handler::BusDisconnect();
  193. }
  194. }
  195. ////////////////////////////////////////////////////////////////////////////////////////////////////
  196. void UiTooltipComponent::TriggerTooltip(UiTooltipDisplayInterface::TriggerMode triggerMode)
  197. {
  198. if (IsTriggered())
  199. {
  200. return;
  201. }
  202. // Get display element
  203. AZ::EntityId canvasEntityId;
  204. UiElementBus::EventResult(canvasEntityId, GetEntityId(), &UiElementBus::Events::GetCanvasEntityId);
  205. AZ::EntityId displayElementId;
  206. UiCanvasBus::EventResult(displayElementId, canvasEntityId, &UiCanvasBus::Events::GetTooltipDisplayElement);
  207. if (displayElementId.IsValid())
  208. {
  209. UiTooltipDisplayBus::Event(displayElementId, &UiTooltipDisplayBus::Events::PrepareToShow, GetEntityId());
  210. m_curDisplayElementId = displayElementId;
  211. m_curTriggerMode = triggerMode;
  212. UiCanvasUpdateNotificationBus::Handler::BusConnect(canvasEntityId);
  213. UiTooltipDisplayNotificationBus::Handler::BusConnect(GetEntityId());
  214. if (m_curTriggerMode != UiTooltipDisplayInterface::TriggerMode::OnHover)
  215. {
  216. UiCanvasInputNotificationBus::Handler::BusConnect(canvasEntityId);
  217. }
  218. }
  219. }
  220. ////////////////////////////////////////////////////////////////////////////////////////////////////
  221. bool UiTooltipComponent::IsTriggered()
  222. {
  223. return m_curDisplayElementId.IsValid();
  224. }
  225. ////////////////////////////////////////////////////////////////////////////////////////////////////
  226. bool UiTooltipComponent::IsTriggeredWithMode(UiTooltipDisplayInterface::TriggerMode triggerMode)
  227. {
  228. return IsTriggered() && m_curTriggerMode == triggerMode;
  229. }
  230. ////////////////////////////////////////////////////////////////////////////////////////////////////
  231. UiTooltipDisplayInterface::TriggerMode UiTooltipComponent::GetDisplayElementTriggerMode()
  232. {
  233. UiTooltipDisplayInterface::TriggerMode triggerMode = UiTooltipDisplayInterface::TriggerMode::OnHover;
  234. // Get display element
  235. AZ::EntityId canvasEntityId;
  236. UiElementBus::EventResult(canvasEntityId, GetEntityId(), &UiElementBus::Events::GetCanvasEntityId);
  237. AZ::EntityId displayElementId;
  238. UiCanvasBus::EventResult(displayElementId, canvasEntityId, &UiCanvasBus::Events::GetTooltipDisplayElement);
  239. // Get display element's trigger mode
  240. UiTooltipDisplayBus::EventResult(triggerMode, displayElementId, &UiTooltipDisplayBus::Events::GetTriggerMode);
  241. return triggerMode;
  242. }