From d05d304fe8a88a5b13ee36c1f8d79aa63c5f95f1 Mon Sep 17 00:00:00 2001 From: greerdv Date: Thu, 18 Nov 2021 13:49:18 +0000 Subject: [PATCH] highlight the button corresponding to the currently selected collider component mode Signed-off-by: greerdv --- .../Code/Editor/ColliderComponentMode.cpp | 73 +++++++++++++------ .../PhysX/Code/Editor/ColliderComponentMode.h | 11 ++- .../Code/Editor/ColliderComponentModeBus.h | 2 +- 3 files changed, 57 insertions(+), 29 deletions(-) diff --git a/Gems/PhysX/Code/Editor/ColliderComponentMode.cpp b/Gems/PhysX/Code/Editor/ColliderComponentMode.cpp index d6bafb8143..fbb8838bb8 100644 --- a/Gems/PhysX/Code/Editor/ColliderComponentMode.cpp +++ b/Gems/PhysX/Code/Editor/ColliderComponentMode.cpp @@ -39,19 +39,17 @@ namespace PhysX : AzToolsFramework::ComponentModeFramework::EditorBaseComponentMode(entityComponentIdPair, componentType) { CreateSubModes(); + CreateSubModeSelectionCluster(); ColliderComponentModeRequestBus::Handler::BusConnect(entityComponentIdPair); ColliderComponentModeUiRequestBus::Handler::BusConnect(entityComponentIdPair); - - CreateSubModeSelectionCluster(); } ColliderComponentMode::~ColliderComponentMode() { - RemoveSubModeSelectionCluster(); - ColliderComponentModeUiRequestBus::Handler::BusDisconnect(); ColliderComponentModeRequestBus::Handler::BusDisconnect(); + RemoveSubModeSelectionCluster(); m_subModes[m_subMode]->Teardown(GetEntityComponentIdPair()); } @@ -141,7 +139,7 @@ namespace PhysX if (mouseInteraction.m_mouseEvent == AzToolsFramework::ViewportInteraction::MouseEvent::Wheel && mouseInteraction.m_mouseInteraction.m_keyboardModifiers.Ctrl()) { - int direction = MouseWheelDelta(mouseInteraction) > 0.0f ? 1 : -1; + int direction = MouseWheelDelta(mouseInteraction) > 0.0f ? -1 : 1; AZ::u32 currentModeIndex = static_cast(m_subMode); AZ::u32 numSubModes = static_cast(SubMode::NumModes); AZ::u32 nextModeIndex = (currentModeIndex + numSubModes + direction) % m_subModes.size(); @@ -159,10 +157,30 @@ namespace PhysX void ColliderComponentMode::SetCurrentMode(SubMode newMode) { - AZ_Assert(m_subModes.count(newMode) > 0, "Submode not found:%d", newMode); - m_subModes[m_subMode]->Teardown(GetEntityComponentIdPair()); - m_subMode = newMode; - m_subModes[m_subMode]->Setup(GetEntityComponentIdPair()); + if (auto subMode = m_subModes.find(newMode); + subMode != m_subModes.end()) + { + m_subModes[m_subMode]->Teardown(GetEntityComponentIdPair()); + m_subMode = newMode; + m_subModes[m_subMode]->Setup(GetEntityComponentIdPair()); + + const auto modeIndex = static_cast(newMode); + if (modeIndex < m_buttonIds.size()) + { + AzToolsFramework::ViewportUi::ViewportUiRequestBus::Event( + AzToolsFramework::ViewportUi::DefaultViewportId, + &AzToolsFramework::ViewportUi::ViewportUiRequestBus::Events::SetClusterActiveButton, m_modeSelectionClusterId, + m_buttonIds[modeIndex]); + } + else + { + AZ_Error("PhysX Collider Component Mode", false, "Invalid mode index %i.", modeIndex); + } + } + else + { + AZ_Assert(false, "Submode not found:%d", newMode); + } } AzToolsFramework::ViewportUi::ClusterId ColliderComponentMode::GetClusterId() const @@ -172,17 +190,22 @@ namespace PhysX AzToolsFramework::ViewportUi::ButtonId ColliderComponentMode::GetOffsetButtonId() const { - return m_offsetModeButtonId; + return m_buttonIds[static_cast(SubMode::Offset)]; } AzToolsFramework::ViewportUi::ButtonId ColliderComponentMode::GetRotationButtonId() const { - return m_rotationModeButtonId; + return m_buttonIds[static_cast(SubMode::Rotation)]; } AzToolsFramework::ViewportUi::ButtonId ColliderComponentMode::GetDimensionsButtonId() const { - return m_dimensionsModeButtonId; + return m_buttonIds[static_cast(SubMode::Dimensions)]; + } + + AZStd::string ColliderComponentMode::GetComponentModeName() const + { + return "Collider Edit Mode"; } void RefreshUI() @@ -237,25 +260,31 @@ namespace PhysX &AzToolsFramework::ViewportUi::ViewportUiRequestBus::Events::CreateCluster, AzToolsFramework::ViewportUi::Alignment::TopLeft); // create and register the buttons - m_offsetModeButtonId = RegisterClusterButton(m_modeSelectionClusterId, "Move"); - m_rotationModeButtonId = RegisterClusterButton(m_modeSelectionClusterId, "Rotate"); - m_dimensionsModeButtonId = RegisterClusterButton(m_modeSelectionClusterId, "Scale"); + m_buttonIds.resize(static_cast(SubMode::NumModes)); + m_buttonIds[static_cast(SubMode::Offset)] = RegisterClusterButton(m_modeSelectionClusterId, "Move"); + m_buttonIds[static_cast(SubMode::Rotation)] = RegisterClusterButton(m_modeSelectionClusterId, "Rotate"); + m_buttonIds[static_cast(SubMode::Dimensions)] = RegisterClusterButton(m_modeSelectionClusterId, "Scale"); + + AzToolsFramework::ViewportUi::ViewportUiRequestBus::Event( + AzToolsFramework::ViewportUi::DefaultViewportId, + &AzToolsFramework::ViewportUi::ViewportUiRequestBus::Events::SetClusterActiveButton, m_modeSelectionClusterId, + m_buttonIds[static_cast(SubMode::Dimensions)]); const auto onButtonClicked = [this](AzToolsFramework::ViewportUi::ButtonId buttonId) { - if (buttonId == m_dimensionsModeButtonId) - { - SetCurrentMode(SubMode::Dimensions); - } - else if (buttonId == m_offsetModeButtonId) + if (buttonId == m_buttonIds[static_cast(SubMode::Offset)]) { SetCurrentMode(SubMode::Offset); } - else if (buttonId == m_rotationModeButtonId) + else if (buttonId == m_buttonIds[static_cast(SubMode::Rotation)]) { SetCurrentMode(SubMode::Rotation); } + else if (buttonId == m_buttonIds[static_cast(SubMode::Dimensions)]) + { + SetCurrentMode(SubMode::Dimensions); + } }; - + m_modeSelectionHandler = AZ::Event::Handler(onButtonClicked); AzToolsFramework::ViewportUi::ViewportUiRequestBus::Event( AzToolsFramework::ViewportUi::DefaultViewportId, diff --git a/Gems/PhysX/Code/Editor/ColliderComponentMode.h b/Gems/PhysX/Code/Editor/ColliderComponentMode.h index b4ca060065..bc8e7d9a0b 100644 --- a/Gems/PhysX/Code/Editor/ColliderComponentMode.h +++ b/Gems/PhysX/Code/Editor/ColliderComponentMode.h @@ -46,6 +46,8 @@ namespace PhysX AzToolsFramework::ViewportUi::ClusterId GetClusterId() const override; AzToolsFramework::ViewportUi::ButtonId GetDimensionsButtonId() const override; + // ComponentMode ... + AZStd::string GetComponentModeName() const override; private: // AzToolsFramework::ViewportInteraction::ViewportSelectionRequests ... @@ -63,12 +65,9 @@ namespace PhysX AzToolsFramework::ViewportUi::ClusterId m_modeSelectionClusterId; //!< Viewport UI cluster for changing sub mode. - AzToolsFramework::ViewportUi::ButtonId - m_dimensionsModeButtonId; //!< Id of the Viewport UI button for resize/dimensions mode. - AzToolsFramework::ViewportUi::ButtonId - m_offsetModeButtonId; //!< Id of the Viewport UI button for offset mode. - AzToolsFramework::ViewportUi::ButtonId - m_rotationModeButtonId; //!< Id of the Viewport UI button for rotation mode. + + AZStd::vector m_buttonIds; //!< Ids for the Viewport UI buttons for each mode. + AZ::Event::Handler m_modeSelectionHandler; //!< Event handler for sub mode changes. }; diff --git a/Gems/PhysX/Code/Editor/ColliderComponentModeBus.h b/Gems/PhysX/Code/Editor/ColliderComponentModeBus.h index 289215067a..05072f699a 100644 --- a/Gems/PhysX/Code/Editor/ColliderComponentModeBus.h +++ b/Gems/PhysX/Code/Editor/ColliderComponentModeBus.h @@ -19,9 +19,9 @@ namespace PhysX public: enum class SubMode : AZ::u32 { - Dimensions, Offset, Rotation, + Dimensions, NumModes };