/* * 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. * */ #pragma once #include #include #include #include #include #include #include //////////////////////////////////////////////////////////////////////////////////////////////////// class UiTooltipDisplayComponent : public AZ::Component , public UiTooltipDisplayBus::Handler , public UiInitializationBus::Handler , public IUiAnimationListener { public: //types using EntityComboBoxVec = AZStd::vector >; using SequenceComboBoxVec = AZStd::vector; enum class State { Hiding, Hidden, DelayBeforeShow, Showing, Shown }; public: // member functions AZ_COMPONENT(UiTooltipDisplayComponent, LyShine::UiTooltipDisplayComponentUuid, AZ::Component); UiTooltipDisplayComponent(); ~UiTooltipDisplayComponent() override; // UiTooltipDisplayInterface TriggerMode GetTriggerMode() override; void SetTriggerMode(TriggerMode triggerMode) override; bool GetAutoPosition() override; void SetAutoPosition(bool autoPosition) override; AutoPositionMode GetAutoPositionMode() override; void SetAutoPositionMode(AutoPositionMode autoPositionMode) override; const AZ::Vector2& GetOffset() override; void SetOffset(const AZ::Vector2& offset) override; bool GetAutoSize() override; void SetAutoSize(bool autoSize) override; AZ::EntityId GetTextEntity() override; void SetTextEntity(AZ::EntityId textEntity) override; float GetDelayTime() override; void SetDelayTime(float delayTime) override; float GetDisplayTime() override; void SetDisplayTime(float displayTime) override; void PrepareToShow(AZ::EntityId tooltipElement) override; void Hide() override; void Update() override; // ~UiTooltipDisplayInterface // UiInitializationInterface void InGamePostActivate() override; // ~UiInitializationInterface //! IUiAnimationListener void OnUiAnimationEvent(EUiAnimationEvent uiAnimationEvent, IUiAnimSequence* pAnimSequence); // ~IUiAnimationListener State GetState(); public: // static member functions static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided) { provided.push_back(AZ_CRC("UiTooltipDisplayService", 0xb2f093fd)); } static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible) { incompatible.push_back(AZ_CRC("UiTooltipService", 0x78437544)); incompatible.push_back(AZ_CRC("UiTooltipDisplayService", 0xb2f093fd)); } static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required) { required.push_back(AZ_CRC("UiElementService", 0x3dca7ad4)); required.push_back(AZ_CRC("UiTransformService", 0x3a838e34)); } static void Reflect(AZ::ReflectContext* context); protected: // member functions // AZ::Component void Activate() override; void Deactivate() override; // ~AZ::Component AZ_DISABLE_COPY_MOVE(UiTooltipDisplayComponent); //! Set the current state of the tooltip void SetState(State state); //! Skip to the next state if the current state is a transitional one void EndTransitionState(); //! Show the display element void Show(); //! Resize the display element so that its child text element is the same size as the //! text string. The text element's anchors are assumed to be set up so that the text //! element grows/shrinks with its parent. void AutoResize(); //! Resize an element by a specified delta void ResizeElementByDelta(AZ::EntityId entityId, const AZ::Vector2& delta); //! Position the display element according to the positioning mode void AutoPosition(); //! Move the display element to a specified position void MoveToPosition(const AZ::Vector2& point, const AZ::Vector2& offsetFromPoint); //! Change the vertical position of the display element if it exceeds a bounding rect. //! If the element exceeds the top of the rect, move it so that its top is a certain //! distance below the specified point. If the element exceeds the bottom of the rect, //! move it so that its bottom is a certain distance above the specified point. void CheckBoundsAndChangeYPosition(const UiTransformInterface::Rect& boundsRect, float yPoint, float yOffsetFromPoint); //! Constrain the display element to a bounding rect void ConstrainToBounds(const UiTransformInterface::Rect& boundsRect); //! Get the axis aligned rect of the display element UiTransformInterface::Rect GetAxisAlignedRect(); //! Get the canvas's animation system IUiAnimationSystem* GetAnimationSystem(); //! Get a sequence that is owned by the canvas's animation system IUiAnimSequence* GetSequence(const AZStd::string& sequenceName, IUiAnimationSystem*& animSystemOut); //! Initialize the sequence before playing void PrepareSequenceForPlay(const AZStd::string& sequenceName, IUiAnimSequence*& sequence, IUiAnimationSystem*& animSystemOut); EntityComboBoxVec PopulateTextEntityList(); SequenceComboBoxVec PopulateSequenceList(); private: // static member functions static bool VersionConverter(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement); protected: // data TriggerMode m_triggerMode; bool m_autoPosition; AutoPositionMode m_autoPositionMode; AZ::Vector2 m_offset; AZ::EntityId m_textEntity; bool m_autoSize; float m_delayTime; float m_displayTime; AZStd::string m_showSequenceName; AZStd::string m_hideSequenceName; State m_state; float m_stateStartTime; float m_curDelayTime; float m_timeSinceLastShown; AZ::EntityId m_tooltipElement; float m_maxWrapTextWidth; IUiAnimSequence* m_showSequence; IUiAnimSequence* m_hideSequence; bool m_listeningForAnimationEvents = false; };