From 6ae20b9c9c4c55c1f47325bcd5190f0598fffd3a Mon Sep 17 00:00:00 2001 From: hasareej Date: Wed, 16 Jun 2021 18:08:54 +0100 Subject: [PATCH] Fixing Issue with TopRight & BottomLeft Corners --- .../ViewportUi/ViewportUiDisplayLayout.cpp | 33 +++++++++++++++---- .../ViewportUi/ViewportUiDisplayLayout.h | 4 ++- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.cpp index da1c4bb149..c8caad78fb 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.cpp @@ -25,8 +25,9 @@ namespace AzToolsFramework::ViewportUi::Internal : QGridLayout(parent) { // set margins and spacing for internal contents - // +20 to avoid overlapping with ImGui - setContentsMargins(ViewportUiOverlayMargin, ViewportUiOverlayMargin + 20, ViewportUiOverlayMargin, ViewportUiOverlayMargin); + setContentsMargins( + ViewportUiOverlayMargin, ViewportUiOverlayMargin + ViewportUiOverlayTopMarginPadding, ViewportUiOverlayMargin, + ViewportUiOverlayMargin); setSpacing(ViewportUiDisplayLayoutSpacing); // create a 3x2 map of sub layouts which will stack widgets according to their mapped alignment @@ -51,22 +52,40 @@ namespace AzToolsFramework::ViewportUi::Internal if (auto layoutForAlignment = m_internalLayouts.find(alignment); layoutForAlignment != m_internalLayouts.end()) { - // place the widget before the invisible spacer - // spacer must be last item in layout to not interfere with positioning + // place the widget before or after the invisible spacer + // depending on the layout alignment int index = 0; switch (alignment) { case Qt::AlignTop | Qt::AlignLeft: - case Qt::AlignBottom | Qt::AlignLeft: case Qt::AlignTop: index = layoutForAlignment->second->count() - 1; - layoutForAlignment->second->insertWidget(index, widget); break; - case Qt::AlignTop | Qt::AlignRight: case Qt::AlignBottom | Qt::AlignRight: case Qt::AlignBottom: index = layoutForAlignment->second->count(); break; + // TopRight and BottomLeft are special cases + case Qt::AlignTop | Qt::AlignRight: + if (QVBoxLayout* vLayout = qobject_cast(layoutForAlignment->second)) + { + index = layoutForAlignment->second->count() - 1; + } + else if (QHBoxLayout* hLayout = qobject_cast(layoutForAlignment->second)) + { + index = layoutForAlignment->second->count(); + } + break; + case Qt::AlignBottom | Qt::AlignLeft: + if (QVBoxLayout* vLayout = qobject_cast(layoutForAlignment->second)) + { + index = layoutForAlignment->second->count(); + } + else if (QHBoxLayout* hLayout = qobject_cast(layoutForAlignment->second)) + { + index = layoutForAlignment->second->count() - 1; + } + break; } layoutForAlignment->second->insertWidget(index, widget); } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.h index f4699ef492..8d710264be 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.h @@ -20,7 +20,9 @@ namespace AzToolsFramework::ViewportUi::Internal { // margin for the Viewport UI Overlay in pixels - const static int ViewportUiOverlayMargin = 5; + constexpr int ViewportUiOverlayMargin = 5; + // padding to make space for ImGui + constexpr int ViewportUiOverlayTopMarginPadding = 20; //! QGridLayout implementation that uses a grid of QVBox/QHBoxLayouts internally to stack widgets. class ViewportUiDisplayLayout : public QGridLayout