diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp index c6450d03c7..1766e65276 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp @@ -2526,7 +2526,7 @@ namespace AzToolsFramework // create the cluster for changing transform mode ViewportUi::ViewportUiRequestBus::EventResult( m_transformModeClusterId, ViewportUi::DefaultViewportId, - &ViewportUi::ViewportUiRequestBus::Events::CreateCluster); + &ViewportUi::ViewportUiRequestBus::Events::CreateCluster, ViewportUi::Alignment::TopLeft); // create and register the buttons (strings correspond to icons even if the values appear different) m_translateButtonId = RegisterClusterButton(m_transformModeClusterId, "Move"); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplay.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplay.cpp index e67ac46f62..e9e7dcc1cc 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplay.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplay.cpp @@ -41,6 +41,28 @@ namespace AzToolsFramework::ViewportUi::Internal } } + static Qt::Alignment GetQtAlignment(Alignment align) + { + switch (align) + { + case Alignment::TopRight: + return Qt::AlignTop | Qt::AlignRight; + case Alignment::TopLeft: + return Qt::AlignTop | Qt::AlignLeft; + case Alignment::BottomRight: + return Qt::AlignBottom | Qt::AlignRight; + case Alignment::BottomLeft: + return Qt::AlignBottom | Qt::AlignLeft; + case Alignment::Top: + return Qt::AlignTop; + case Alignment::Bottom: + return Qt::AlignBottom; + } + + AZ_Assert(false, "ViewportUI", "Unhandled ViewportUI Alignment %d", static_cast(align)); + return Qt::AlignTop; + } + ViewportUiDisplay::ViewportUiDisplay(QWidget* parent, QWidget* renderOverlay) : m_renderOverlay(renderOverlay) , m_uiMainWindow(parent) @@ -56,7 +78,7 @@ namespace AzToolsFramework::ViewportUi::Internal UnparentWidgets(m_viewportUiElements); } - void ViewportUiDisplay::AddCluster(AZStd::shared_ptr buttonGroup) + void ViewportUiDisplay::AddCluster(AZStd::shared_ptr buttonGroup, const Alignment align) { if (!buttonGroup.get()) { @@ -66,7 +88,7 @@ namespace AzToolsFramework::ViewportUi::Internal auto viewportUiCluster = AZStd::make_shared(buttonGroup); auto id = AddViewportUiElement(viewportUiCluster); buttonGroup->SetViewportUiElementId(id); - PositionViewportUiElementAnchored(id, Qt::AlignTop | Qt::AlignLeft); + PositionViewportUiElementAnchored(id, GetQtAlignment(align)); } void ViewportUiDisplay::AddClusterButton( @@ -94,7 +116,7 @@ namespace AzToolsFramework::ViewportUi::Internal } } - void ViewportUiDisplay::AddSwitcher(AZStd::shared_ptr buttonGroup) + void ViewportUiDisplay::AddSwitcher(AZStd::shared_ptr buttonGroup, const Alignment align) { if (!buttonGroup.get()) { @@ -104,7 +126,7 @@ namespace AzToolsFramework::ViewportUi::Internal auto viewportUiSwitcher = AZStd::make_shared(buttonGroup); auto id = AddViewportUiElement(viewportUiSwitcher); buttonGroup->SetViewportUiElementId(id); - PositionViewportUiElementAnchored(id, Qt::AlignTop | Qt::AlignLeft); + PositionViewportUiElementAnchored(id, GetQtAlignment(align)); } void ViewportUiDisplay::AddSwitcherButton(const ViewportUiElementId clusterId, Button* button) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplay.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplay.h index 7ef81986c0..d46e01c978 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplay.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplay.h @@ -56,12 +56,12 @@ namespace AzToolsFramework::ViewportUi::Internal ViewportUiDisplay(QWidget* parent, QWidget* renderOverlay); ~ViewportUiDisplay(); - void AddCluster(AZStd::shared_ptr buttonGroup); + void AddCluster(AZStd::shared_ptr buttonGroup, Alignment align); void AddClusterButton(ViewportUiElementId clusterId, Button* button); void RemoveClusterButton(ViewportUiElementId clusterId, ButtonId buttonId); void UpdateCluster(const ViewportUiElementId clusterId); - void AddSwitcher(AZStd::shared_ptr buttonGroup); + void AddSwitcher(AZStd::shared_ptr buttonGroup, Alignment align); void AddSwitcherButton(ViewportUiElementId switcherId, Button* button); void RemoveSwitcherButton(ViewportUiElementId switcherId, ButtonId buttonId); void UpdateSwitcher(ViewportUiElementId switcherId); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiManager.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiManager.cpp index 6eb97adb93..12c3b5c9bb 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiManager.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiManager.cpp @@ -30,18 +30,18 @@ namespace AzToolsFramework::ViewportUi ViewportUiRequestBus::Handler::BusDisconnect(); } - const ClusterId ViewportUiManager::CreateCluster() + const ClusterId ViewportUiManager::CreateCluster(const Alignment align) { auto buttonGroup = AZStd::make_shared(); - m_viewportUi->AddCluster(buttonGroup); + m_viewportUi->AddCluster(buttonGroup, align); return RegisterNewCluster(buttonGroup); } - const SwitcherId ViewportUiManager::CreateSwitcher() + const SwitcherId ViewportUiManager::CreateSwitcher(const Alignment align) { auto buttonGroup = AZStd::make_shared(); - m_viewportUi->AddSwitcher(buttonGroup); + m_viewportUi->AddSwitcher(buttonGroup, align); return RegisterNewSwitcher(buttonGroup); } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiManager.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiManager.h index 1b350bbd64..04a58cef65 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiManager.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiManager.h @@ -31,8 +31,8 @@ namespace AzToolsFramework::ViewportUi ~ViewportUiManager() = default; // ViewportUiRequestBus ... - const ClusterId CreateCluster() override; - const SwitcherId CreateSwitcher() override; + const ClusterId CreateCluster(Alignment align) override; + const SwitcherId CreateSwitcher(Alignment align) override; void SetClusterActiveButton(ClusterId clusterId, ButtonId buttonId) override; void SetSwitcherActiveButton(SwitcherId switcherId, ButtonId buttonId) override; const ButtonId CreateClusterButton(ClusterId clusterId, const AZStd::string& icon) override; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiRequestBus.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiRequestBus.h index 5041f28656..3879817ccb 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiRequestBus.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiRequestBus.h @@ -41,15 +41,26 @@ namespace AzToolsFramework::ViewportUi String }; + //! Used to anchor widgets to a specific side of the viewport. + enum class Alignment + { + TopRight, + TopLeft, + BottomRight, + BottomLeft, + Top, + Bottom + }; + //! Viewport requests to interact with the Viewport UI. Viewport UI refers to the entire UI overlay (one per viewport). //! Each widget on the Viewport UI is referred to as an element. class ViewportUiRequests { public: //! Creates and registers a cluster with the Viewport UI system. - virtual const ClusterId CreateCluster() = 0; + virtual const ClusterId CreateCluster(Alignment align) = 0; //! Creates and registers a switcher with the Viewport UI system. - virtual const SwitcherId CreateSwitcher() = 0; + virtual const SwitcherId CreateSwitcher(Alignment align) = 0; //! Sets the active button of the cluster. This is the button which will display as highlighted. virtual void SetClusterActiveButton(ClusterId clusterId, ButtonId buttonId) = 0; //! Sets the active button of the switcher. This is the button which has a text label. diff --git a/Code/Framework/AzToolsFramework/Tests/Viewport/ViewportUiDisplayTests.cpp b/Code/Framework/AzToolsFramework/Tests/Viewport/ViewportUiDisplayTests.cpp index a1ce868569..5fd102b450 100644 --- a/Code/Framework/AzToolsFramework/Tests/Viewport/ViewportUiDisplayTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Viewport/ViewportUiDisplayTests.cpp @@ -72,7 +72,7 @@ namespace UnitTest TEST_F(ViewportUiDisplayTestFixture, RemoveViewportUiElementRemovesElementFromViewportUi) { ViewportUiDisplay viewportUi(m_parentWidget, m_mockRenderOverlay); - viewportUi.AddCluster(m_buttonGroup); + viewportUi.AddCluster(m_buttonGroup, AzToolsFramework::ViewportUi::Alignment::TopLeft); auto widget = viewportUi.GetViewportUiElement(m_buttonGroup->GetViewportUiElementId()); EXPECT_TRUE(widget.get() != nullptr); @@ -89,7 +89,7 @@ namespace UnitTest ViewportUiDisplay viewportUi(m_parentWidget, m_mockRenderOverlay); viewportUi.InitializeUiOverlay(); - viewportUi.AddCluster(m_buttonGroup); + viewportUi.AddCluster(m_buttonGroup, AzToolsFramework::ViewportUi::Alignment::TopLeft); viewportUi.Update(); viewportUi.ShowViewportUiElement(m_buttonGroup->GetViewportUiElementId()); @@ -102,7 +102,7 @@ namespace UnitTest ViewportUiDisplay viewportUi(m_parentWidget, m_mockRenderOverlay); viewportUi.InitializeUiOverlay(); - viewportUi.AddCluster(m_buttonGroup); + viewportUi.AddCluster(m_buttonGroup, AzToolsFramework::ViewportUi::Alignment::TopLeft); viewportUi.HideViewportUiElement(m_buttonGroup->GetViewportUiElementId()); EXPECT_FALSE(viewportUi.IsViewportUiElementVisible(m_buttonGroup->GetViewportUiElementId())); @@ -112,7 +112,7 @@ namespace UnitTest { ViewportUiDisplay viewportUi(m_parentWidget, m_mockRenderOverlay); viewportUi.InitializeUiOverlay(); - viewportUi.AddCluster(m_buttonGroup); + viewportUi.AddCluster(m_buttonGroup, AzToolsFramework::ViewportUi::Alignment::TopLeft); viewportUi.Update(); auto widget = viewportUi.GetViewportUiElement(m_buttonGroup->GetViewportUiElementId()); @@ -129,7 +129,7 @@ namespace UnitTest auto buttonGroup = AZStd::make_shared(); buttonGroup->AddButton(""); - viewportUi.AddCluster(buttonGroup); + viewportUi.AddCluster(buttonGroup, AzToolsFramework::ViewportUi::Alignment::TopLeft); viewportUi.Update(); EXPECT_TRUE(viewportUi.GetUiMainWindow()->isVisible()); diff --git a/Code/Framework/AzToolsFramework/Tests/Viewport/ViewportUiManagerTests.cpp b/Code/Framework/AzToolsFramework/Tests/Viewport/ViewportUiManagerTests.cpp index 396bde3fdd..9babd0fe6d 100644 --- a/Code/Framework/AzToolsFramework/Tests/Viewport/ViewportUiManagerTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Viewport/ViewportUiManagerTests.cpp @@ -101,7 +101,7 @@ namespace UnitTest TEST_F(ViewportUiManagerTestFixture, CreateClusterAddsNewClusterAndReturnsId) { - auto clusterId = m_viewportManagerWrapper.GetViewportManager()->CreateCluster(); + auto clusterId = m_viewportManagerWrapper.GetViewportManager()->CreateCluster(AzToolsFramework::ViewportUi::Alignment::TopLeft); auto clusterEntry = m_viewportManagerWrapper.GetViewportManager()->GetClusterMap().find(clusterId); EXPECT_TRUE(clusterEntry != m_viewportManagerWrapper.GetViewportManager()->GetClusterMap().end()); @@ -110,7 +110,7 @@ namespace UnitTest TEST_F(ViewportUiManagerTestFixture, CreateClusterButtonAddsNewButtonAndReturnsId) { - auto clusterId = m_viewportManagerWrapper.GetViewportManager()->CreateCluster(); + auto clusterId = m_viewportManagerWrapper.GetViewportManager()->CreateCluster(AzToolsFramework::ViewportUi::Alignment::TopLeft); auto buttonId = m_viewportManagerWrapper.GetViewportManager()->CreateClusterButton(clusterId, ""); auto clusterEntry = m_viewportManagerWrapper.GetViewportManager()->GetClusterMap().find(clusterId); @@ -120,7 +120,7 @@ namespace UnitTest TEST_F(ViewportUiManagerTestFixture, SetClusterActiveButtonSetsButtonStateToActive) { - auto clusterId = m_viewportManagerWrapper.GetViewportManager()->CreateCluster(); + auto clusterId = m_viewportManagerWrapper.GetViewportManager()->CreateCluster(AzToolsFramework::ViewportUi::Alignment::TopLeft); auto buttonId = m_viewportManagerWrapper.GetViewportManager()->CreateClusterButton(clusterId, ""); auto clusterEntry = m_viewportManagerWrapper.GetViewportManager()->GetClusterMap().find(clusterId); @@ -133,7 +133,7 @@ namespace UnitTest TEST_F(ViewportUiManagerTestFixture, RegisterClusterEventHandlerConnectsHandlerToClusterEvent) { - auto clusterId = m_viewportManagerWrapper.GetViewportManager()->CreateCluster(); + auto clusterId = m_viewportManagerWrapper.GetViewportManager()->CreateCluster(AzToolsFramework::ViewportUi::Alignment::TopLeft); auto buttonId = m_viewportManagerWrapper.GetViewportManager()->CreateClusterButton(clusterId, ""); // create a handler which will be triggered by the cluster @@ -159,7 +159,7 @@ namespace UnitTest TEST_F(ViewportUiManagerTestFixture, RemoveClusterRemovesClusterFromViewportUi) { - auto clusterId = m_viewportManagerWrapper.GetViewportManager()->CreateCluster(); + auto clusterId = m_viewportManagerWrapper.GetViewportManager()->CreateCluster(AzToolsFramework::ViewportUi::Alignment::TopLeft); m_viewportManagerWrapper.GetViewportManager()->RemoveCluster(clusterId); auto clusterEntry = m_viewportManagerWrapper.GetViewportManager()->GetClusterMap().find(clusterId); @@ -171,7 +171,7 @@ namespace UnitTest { m_viewportManagerWrapper.GetMockRenderOverlay()->setVisible(true); - auto clusterId = m_viewportManagerWrapper.GetViewportManager()->CreateCluster(); + auto clusterId = m_viewportManagerWrapper.GetViewportManager()->CreateCluster(AzToolsFramework::ViewportUi::Alignment::TopLeft); auto buttonId = m_viewportManagerWrapper.GetViewportManager()->CreateClusterButton(clusterId, ""); m_viewportManagerWrapper.GetViewportManager()->Update(); diff --git a/Gems/PhysX/Code/Editor/ColliderComponentMode.cpp b/Gems/PhysX/Code/Editor/ColliderComponentMode.cpp index 9aece90d90..7caa497344 100644 --- a/Gems/PhysX/Code/Editor/ColliderComponentMode.cpp +++ b/Gems/PhysX/Code/Editor/ColliderComponentMode.cpp @@ -240,7 +240,7 @@ namespace PhysX // create the cluster for changing transform mode AzToolsFramework::ViewportUi::ViewportUiRequestBus::EventResult( m_modeSelectionClusterId, AzToolsFramework::ViewportUi::DefaultViewportId, - &AzToolsFramework::ViewportUi::ViewportUiRequestBus::Events::CreateCluster); + &AzToolsFramework::ViewportUi::ViewportUiRequestBus::Events::CreateCluster, AzToolsFramework::ViewportUi::Alignment::TopLeft); // create and register the buttons m_dimensionsModeButtonId = RegisterClusterButton(m_modeSelectionClusterId, "Scale"); diff --git a/Gems/WhiteBox/Code/Source/EditorWhiteBoxComponentMode.cpp b/Gems/WhiteBox/Code/Source/EditorWhiteBoxComponentMode.cpp index 7677ee69f4..0772851cba 100644 --- a/Gems/WhiteBox/Code/Source/EditorWhiteBoxComponentMode.cpp +++ b/Gems/WhiteBox/Code/Source/EditorWhiteBoxComponentMode.cpp @@ -482,7 +482,7 @@ namespace WhiteBox // create the cluster for changing transform mode AzToolsFramework::ViewportUi::ViewportUiRequestBus::EventResult( m_modeSelectionClusterId, AzToolsFramework::ViewportUi::DefaultViewportId, - &AzToolsFramework::ViewportUi::ViewportUiRequestBus::Events::CreateCluster); + &AzToolsFramework::ViewportUi::ViewportUiRequestBus::Events::CreateCluster, AzToolsFramework::ViewportUi::Alignment::TopLeft); // create and register the buttons m_defaultModeButtonId = RegisterClusterButton(m_modeSelectionClusterId, "SketchMode");