From 9e0dccbf39090e4536dfa407d1cdd6162deffbd6 Mon Sep 17 00:00:00 2001 From: hasareej Date: Mon, 14 Jun 2021 16:22:36 +0100 Subject: [PATCH 1/4] Initial bug fix - Added a margin. --- .../AzToolsFramework/ViewportUi/ViewportUiDisplay.cpp | 3 --- .../AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.cpp | 3 ++- .../AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.h | 3 +++ 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplay.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplay.cpp index 3565d33174..37776f97e1 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplay.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplay.cpp @@ -24,8 +24,6 @@ namespace AzToolsFramework::ViewportUi::Internal { - // margin for the Viewport UI Overlay in pixels - const static int ViewportUiOverlayMargin = 5; const static int HighlightBorderSize = 5; const static int TopHighlightBorderSize = 25; const static char* HighlightBorderColor = "#44B2F8"; @@ -379,7 +377,6 @@ namespace AzToolsFramework::ViewportUi::Internal m_fullScreenLayout.setSpacing(0); m_fullScreenLayout.setContentsMargins(0, 0, 0, 0); m_fullScreenLayout.addLayout(&m_uiOverlayLayout, 0, 0, 1, 1); - m_uiOverlayLayout.setMargin(ViewportUiOverlayMargin); // format the label which will appear on top of the highlight border AZStd::string styleSheet = AZStd::string::format( diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.cpp index bab664d832..a03248d8df 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.cpp @@ -25,7 +25,8 @@ namespace AzToolsFramework::ViewportUi::Internal : QGridLayout(parent) { // set margins and spacing for internal contents - setContentsMargins(0, 0, 0, 0); + // +20 to avoid overlapping with ImGui + setContentsMargins(ViewportUiOverlayMargin, ViewportUiOverlayMargin + 20, ViewportUiOverlayMargin, ViewportUiOverlayMargin); setSpacing(ViewportUiDisplayLayoutSpacing); // create a 3x2 map of sub layouts which will stack widgets according to their mapped alignment diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.h index 0beb0d5bd6..f4699ef492 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.h @@ -19,6 +19,9 @@ namespace AzToolsFramework::ViewportUi::Internal { + // margin for the Viewport UI Overlay in pixels + const static int ViewportUiOverlayMargin = 5; + //! QGridLayout implementation that uses a grid of QVBox/QHBoxLayouts internally to stack widgets. class ViewportUiDisplayLayout : public QGridLayout { From 1cb780b2153443c69048ac8956d9995c582d4b65 Mon Sep 17 00:00:00 2001 From: hasareej Date: Tue, 15 Jun 2021 15:36:29 +0100 Subject: [PATCH 2/4] Layout right side bug fix. --- .../ViewportUi/ViewportUiDisplayLayout.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.cpp index a03248d8df..da1c4bb149 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.cpp @@ -53,7 +53,21 @@ namespace AzToolsFramework::ViewportUi::Internal { // place the widget before the invisible spacer // spacer must be last item in layout to not interfere with positioning - int index = layoutForAlignment->second->count() - 1; + 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; + } layoutForAlignment->second->insertWidget(index, widget); } } From 6ae20b9c9c4c55c1f47325bcd5190f0598fffd3a Mon Sep 17 00:00:00 2001 From: hasareej Date: Wed, 16 Jun 2021 18:08:54 +0100 Subject: [PATCH 3/4] 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 From e0dd33b0842b256e2ab1fc108473f448a9967b86 Mon Sep 17 00:00:00 2001 From: hasareej Date: Thu, 17 Jun 2021 12:52:43 +0100 Subject: [PATCH 4/4] Comment Update --- .../AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.cpp index c8caad78fb..92fad8cc93 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.cpp @@ -33,7 +33,7 @@ namespace AzToolsFramework::ViewportUi::Internal // create a 3x2 map of sub layouts which will stack widgets according to their mapped alignment m_internalLayouts = AZStd::unordered_map { CreateSubLayout(new QVBoxLayout(), 0, 0, Qt::AlignTop | Qt::AlignLeft), - CreateSubLayout(new QHBoxLayout(), 1, 0, Qt::AlignBottom | Qt::AlignLeft), + CreateSubLayout(new QVBoxLayout(), 1, 0, Qt::AlignBottom | Qt::AlignLeft), CreateSubLayout(new QVBoxLayout(), 0, 1, Qt::AlignTop), CreateSubLayout(new QHBoxLayout(), 1, 1, Qt::AlignBottom), CreateSubLayout(new QVBoxLayout(), 0, 2, Qt::AlignTop | Qt::AlignRight), @@ -66,6 +66,7 @@ namespace AzToolsFramework::ViewportUi::Internal index = layoutForAlignment->second->count(); break; // TopRight and BottomLeft are special cases + // place the spacer differently according to whether it's a vertical or horizontal layout case Qt::AlignTop | Qt::AlignRight: if (QVBoxLayout* vLayout = qobject_cast(layoutForAlignment->second)) {