123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 |
- /*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
- #include "UiTooltipComponent.h"
- #include <AzCore/Serialization/SerializeContext.h>
- #include <AzCore/Serialization/EditContext.h>
- #include <AzCore/RTTI/BehaviorContext.h>
- #include <LyShine/Bus/UiElementBus.h>
- #include <LyShine/Bus/UiTextBus.h>
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- // PUBLIC MEMBER FUNCTIONS
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- UiTooltipComponent::UiTooltipComponent()
- : m_curTriggerMode(UiTooltipDisplayInterface::TriggerMode::OnHover)
- {
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- UiTooltipComponent::~UiTooltipComponent()
- {
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- void UiTooltipComponent::Update([[maybe_unused]] float deltaTime)
- {
- if (m_curDisplayElementId.IsValid())
- {
- UiTooltipDisplayBus::Event(m_curDisplayElementId, &UiTooltipDisplayBus::Events::Update);
- }
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- void UiTooltipComponent::OnHoverStart()
- {
- if (GetDisplayElementTriggerMode() == UiTooltipDisplayInterface::TriggerMode::OnHover)
- {
- TriggerTooltip(UiTooltipDisplayInterface::TriggerMode::OnHover);
- }
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- void UiTooltipComponent::OnHoverEnd()
- {
- if (IsTriggeredWithMode(UiTooltipDisplayInterface::TriggerMode::OnHover))
- {
- HideDisplayElement();
- }
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- void UiTooltipComponent::OnPressed()
- {
- if (IsTriggeredWithMode(UiTooltipDisplayInterface::TriggerMode::OnHover))
- {
- HideDisplayElement();
- }
- else
- {
- if (GetDisplayElementTriggerMode() == UiTooltipDisplayInterface::TriggerMode::OnPress)
- {
- TriggerTooltip(UiTooltipDisplayInterface::TriggerMode::OnPress);
- }
- }
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- void UiTooltipComponent::OnReleased()
- {
- if (IsTriggeredWithMode(UiTooltipDisplayInterface::TriggerMode::OnPress))
- {
- HideDisplayElement();
- }
- else
- {
- if (GetDisplayElementTriggerMode() == UiTooltipDisplayInterface::TriggerMode::OnClick)
- {
- TriggerTooltip(UiTooltipDisplayInterface::TriggerMode::OnClick);
- }
- }
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- void UiTooltipComponent::OnCanvasPrimaryReleased([[maybe_unused]] AZ::EntityId entityId)
- {
- // This callback is needed because OnReleased is only called when the mouse is over the element
- if (IsTriggeredWithMode(UiTooltipDisplayInterface::TriggerMode::OnPress))
- {
- HideDisplayElement();
- }
- if (IsTriggeredWithMode(UiTooltipDisplayInterface::TriggerMode::OnClick))
- {
- HideDisplayElement();
- }
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- void UiTooltipComponent::PushDataToDisplayElement(AZ::EntityId displayEntityId)
- {
- AZ::EntityId textEntityId;
- UiTooltipDisplayBus::EventResult(textEntityId, displayEntityId, &UiTooltipDisplayBus::Events::GetTextEntity);
- if (textEntityId.IsValid())
- {
- UiTextBus::Event(textEntityId, &UiTextBus::Events::SetText, m_text);
- }
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- AZStd::string UiTooltipComponent::GetText()
- {
- return m_text;
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- void UiTooltipComponent::SetText(const AZStd::string& text)
- {
- m_text = text;
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- void UiTooltipComponent::OnHiding()
- {
- HandleDisplayElementHidden();
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- void UiTooltipComponent::OnHidden()
- {
- HandleDisplayElementHidden();
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- // PUBLIC STATIC MEMBER FUNCTIONS
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- void UiTooltipComponent::Reflect(AZ::ReflectContext* context)
- {
- AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context);
- if (serializeContext)
- {
- serializeContext->Class<UiTooltipComponent, AZ::Component>()
- ->Version(1)
- ->Field("Text", &UiTooltipComponent::m_text);
- AZ::EditContext* ec = serializeContext->GetEditContext();
- if (ec)
- {
- auto editInfo = ec->Class<UiTooltipComponent>("Tooltip", "A component that provides the data needed to display a tooltip.");
- editInfo->ClassElement(AZ::Edit::ClassElements::EditorData, "")
- ->Attribute(AZ::Edit::Attributes::Category, "UI")
- ->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/UiTooltip.png")
- ->Attribute(AZ::Edit::Attributes::ViewportIcon, "Editor/Icons/Components/Viewport/UiTooltip.png")
- ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("UI", 0x27ff46b0))
- ->Attribute(AZ::Edit::Attributes::AutoExpand, true);
- editInfo->DataElement(0, &UiTooltipComponent::m_text, "Text", "The text string.");
- }
- }
- AZ::BehaviorContext* behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context);
- if (behaviorContext)
- {
- behaviorContext->EBus<UiTooltipBus>("UiTooltipBus")
- ->Event("GetText", &UiTooltipBus::Events::GetText)
- ->Event("SetText", &UiTooltipBus::Events::SetText);
- }
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- // PROTECTED MEMBER FUNCTIONS
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- void UiTooltipComponent::Activate()
- {
- UiInteractableNotificationBus::Handler::BusConnect(GetEntityId());
- UiTooltipDataPopulatorBus::Handler::BusConnect(GetEntityId());
- UiTooltipBus::Handler::BusConnect(GetEntityId());
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- void UiTooltipComponent::Deactivate()
- {
- UiCanvasUpdateNotificationBus::Handler::BusDisconnect();
- UiInteractableNotificationBus::Handler::BusDisconnect();
- UiCanvasInputNotificationBus::Handler::BusDisconnect();
- UiTooltipDisplayNotificationBus::Handler::BusDisconnect();
- UiTooltipDataPopulatorBus::Handler::BusDisconnect();
- UiTooltipBus::Handler::BusDisconnect();
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- void UiTooltipComponent::HideDisplayElement()
- {
- if (m_curDisplayElementId.IsValid())
- {
- UiTooltipDisplayBus::Event(m_curDisplayElementId, &UiTooltipDisplayBus::Events::Hide);
- HandleDisplayElementHidden();
- }
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- void UiTooltipComponent::HandleDisplayElementHidden()
- {
- if (m_curDisplayElementId.IsValid())
- {
- m_curDisplayElementId.SetInvalid();
- UiCanvasUpdateNotificationBus::Handler::BusDisconnect();
- UiCanvasInputNotificationBus::Handler::BusDisconnect();
- UiTooltipDisplayNotificationBus::Handler::BusDisconnect();
- }
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- void UiTooltipComponent::TriggerTooltip(UiTooltipDisplayInterface::TriggerMode triggerMode)
- {
- if (IsTriggered())
- {
- return;
- }
- // Get display element
- AZ::EntityId canvasEntityId;
- UiElementBus::EventResult(canvasEntityId, GetEntityId(), &UiElementBus::Events::GetCanvasEntityId);
- AZ::EntityId displayElementId;
- UiCanvasBus::EventResult(displayElementId, canvasEntityId, &UiCanvasBus::Events::GetTooltipDisplayElement);
- if (displayElementId.IsValid())
- {
- UiTooltipDisplayBus::Event(displayElementId, &UiTooltipDisplayBus::Events::PrepareToShow, GetEntityId());
- m_curDisplayElementId = displayElementId;
- m_curTriggerMode = triggerMode;
- UiCanvasUpdateNotificationBus::Handler::BusConnect(canvasEntityId);
- UiTooltipDisplayNotificationBus::Handler::BusConnect(GetEntityId());
- if (m_curTriggerMode != UiTooltipDisplayInterface::TriggerMode::OnHover)
- {
- UiCanvasInputNotificationBus::Handler::BusConnect(canvasEntityId);
- }
- }
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- bool UiTooltipComponent::IsTriggered()
- {
- return m_curDisplayElementId.IsValid();
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- bool UiTooltipComponent::IsTriggeredWithMode(UiTooltipDisplayInterface::TriggerMode triggerMode)
- {
- return IsTriggered() && m_curTriggerMode == triggerMode;
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- UiTooltipDisplayInterface::TriggerMode UiTooltipComponent::GetDisplayElementTriggerMode()
- {
- UiTooltipDisplayInterface::TriggerMode triggerMode = UiTooltipDisplayInterface::TriggerMode::OnHover;
- // Get display element
- AZ::EntityId canvasEntityId;
- UiElementBus::EventResult(canvasEntityId, GetEntityId(), &UiElementBus::Events::GetCanvasEntityId);
- AZ::EntityId displayElementId;
- UiCanvasBus::EventResult(displayElementId, canvasEntityId, &UiCanvasBus::Events::GetTooltipDisplayElement);
- // Get display element's trigger mode
- UiTooltipDisplayBus::EventResult(triggerMode, displayElementId, &UiTooltipDisplayBus::Events::GetTriggerMode);
- return triggerMode;
- }
|