/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * * For complete copyright and license terms please see the LICENSE at the root of this * distribution (the "License"). All use of this software is governed by the License, * or, if provided, by the license below or the license accompanying this file. Do not * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ #include "LyShine_precompiled.h" #include "UiTooltipComponent.h" #include #include #include #include #include //////////////////////////////////////////////////////////////////////////////////////////////////// // PUBLIC MEMBER FUNCTIONS //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// UiTooltipComponent::UiTooltipComponent() : m_curTriggerMode(UiTooltipDisplayInterface::TriggerMode::OnHover) { } //////////////////////////////////////////////////////////////////////////////////////////////////// UiTooltipComponent::~UiTooltipComponent() { } //////////////////////////////////////////////////////////////////////////////////////////////////// void UiTooltipComponent::Update(float deltaTime) { if (m_curDisplayElementId.IsValid()) { EBUS_EVENT_ID(m_curDisplayElementId, UiTooltipDisplayBus, 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(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; EBUS_EVENT_ID_RESULT(textEntityId, displayEntityId, UiTooltipDisplayBus, GetTextEntity); if (textEntityId.IsValid()) { EBUS_EVENT_ID(textEntityId, UiTextBus, 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(context); if (serializeContext) { serializeContext->Class() ->Version(1) ->Field("Text", &UiTooltipComponent::m_text); AZ::EditContext* ec = serializeContext->GetEditContext(); if (ec) { auto editInfo = ec->Class("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(context); if (behaviorContext) { behaviorContext->EBus("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()) { bool enableShortDelay = m_curTriggerMode == UiTooltipDisplayInterface::TriggerMode::OnHover; 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; }