highlight the button corresponding to the currently selected collider component mode

Signed-off-by: greerdv <greerdv@amazon.com>
This commit is contained in:
greerdv
2021-11-18 13:49:18 +00:00
parent 1aae3d5619
commit d05d304fe8
3 changed files with 57 additions and 29 deletions
@@ -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<AZ::u32>(m_subMode);
AZ::u32 numSubModes = static_cast<AZ::u32>(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<size_t>(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<size_t>(SubMode::Offset)];
}
AzToolsFramework::ViewportUi::ButtonId ColliderComponentMode::GetRotationButtonId() const
{
return m_rotationModeButtonId;
return m_buttonIds[static_cast<size_t>(SubMode::Rotation)];
}
AzToolsFramework::ViewportUi::ButtonId ColliderComponentMode::GetDimensionsButtonId() const
{
return m_dimensionsModeButtonId;
return m_buttonIds[static_cast<size_t>(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<size_t>(SubMode::NumModes));
m_buttonIds[static_cast<size_t>(SubMode::Offset)] = RegisterClusterButton(m_modeSelectionClusterId, "Move");
m_buttonIds[static_cast<size_t>(SubMode::Rotation)] = RegisterClusterButton(m_modeSelectionClusterId, "Rotate");
m_buttonIds[static_cast<size_t>(SubMode::Dimensions)] = RegisterClusterButton(m_modeSelectionClusterId, "Scale");
AzToolsFramework::ViewportUi::ViewportUiRequestBus::Event(
AzToolsFramework::ViewportUi::DefaultViewportId,
&AzToolsFramework::ViewportUi::ViewportUiRequestBus::Events::SetClusterActiveButton, m_modeSelectionClusterId,
m_buttonIds[static_cast<size_t>(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<size_t>(SubMode::Offset)])
{
SetCurrentMode(SubMode::Offset);
}
else if (buttonId == m_rotationModeButtonId)
else if (buttonId == m_buttonIds[static_cast<size_t>(SubMode::Rotation)])
{
SetCurrentMode(SubMode::Rotation);
}
else if (buttonId == m_buttonIds[static_cast<size_t>(SubMode::Dimensions)])
{
SetCurrentMode(SubMode::Dimensions);
}
};
m_modeSelectionHandler = AZ::Event<AzToolsFramework::ViewportUi::ButtonId>::Handler(onButtonClicked);
AzToolsFramework::ViewportUi::ViewportUiRequestBus::Event(
AzToolsFramework::ViewportUi::DefaultViewportId,
@@ -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<AzToolsFramework::ViewportUi::ButtonId> m_buttonIds; //!< Ids for the Viewport UI buttons for each mode.
AZ::Event<AzToolsFramework::ViewportUi::ButtonId>::Handler
m_modeSelectionHandler; //!< Event handler for sub mode changes.
};
@@ -19,9 +19,9 @@ namespace PhysX
public:
enum class SubMode : AZ::u32
{
Dimensions,
Offset,
Rotation,
Dimensions,
NumModes
};