Ensure ImGui menu is displayed when the Viewport UI viewport border is showing (#5240)

* add optimize off code temporarily

Signed-off-by: Tom Hulton-Harrop <82228511+hultonha@users.noreply.github.com>

* ensure the imgui menu displays when the viewport border is active

Signed-off-by: Tom Hulton-Harrop <82228511+hultonha@users.noreply.github.com>
This commit is contained in:
Tom Hulton-Harrop
2021-11-04 09:16:27 +00:00
committed by GitHub
parent d598a7c709
commit 4c41a4dfc9
7 changed files with 135 additions and 36 deletions
@@ -8,8 +8,9 @@
#pragma once
#include <AzFramework/Viewport/ViewportId.h>
#include <AzCore/EBus/EBus.h>
#include <AzCore/std/optional.h>
#include <AzFramework/Viewport/ViewportId.h>
namespace AZ
{
@@ -20,18 +21,15 @@ namespace AZ
namespace AzFramework
{
class ViewportRequests
: public AZ::EBusTraits
class ViewportRequests : public AZ::EBusTraits
{
public:
static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single;
static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::ById;
static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::ById;
using BusIdType = ViewportId;
static void Reflect(AZ::ReflectContext* context);
virtual ~ViewportRequests() {}
//! Gets the current camera's world to view matrix.
virtual const AZ::Matrix4x4& GetCameraViewMatrix() const = 0;
//! Sets the current camera's world to view matrix.
@@ -44,8 +42,36 @@ namespace AzFramework
virtual AZ::Transform GetCameraTransform() const = 0;
//! Convenience method, sets the camera's world to view matrix from this AZ::Transform.
virtual void SetCameraTransform(const AZ::Transform& transform) = 0;
protected:
~ViewportRequests() = default;
};
using ViewportRequestBus = AZ::EBus<ViewportRequests>;
} //namespace AzFramework
//! The additional padding around the viewport when a viewport border is active.
struct ViewportBorderPadding
{
float m_top;
float m_bottom;
float m_left;
float m_right;
};
//! For performing queries about the state of the viewport border.
class ViewportBorderRequests : public AZ::EBusTraits
{
public:
static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single;
static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::ById;
using BusIdType = ViewportId;
//! Returns if a viewport border is in effect and what the current dimensions (padding) of the border are.
virtual AZStd::optional<ViewportBorderPadding> GetViewportBorderPadding() const = 0;
protected:
~ViewportBorderRequests() = default;
};
using ViewportBorderRequestBus = AZ::EBus<ViewportBorderRequests>;
} // namespace AzFramework
@@ -12,6 +12,7 @@
#include <AzToolsFramework/ViewportSelection/EditorSelectionUtil.h>
#include <AzToolsFramework/ViewportUi/ViewportUiCluster.h>
#include <AzToolsFramework/ViewportUi/ViewportUiDisplay.h>
#include <AzToolsFramework/ViewportUi/ViewportUiDisplayLayout.h>
#include <AzToolsFramework/ViewportUi/ViewportUiSwitcher.h>
#include <AzToolsFramework/ViewportUi/ViewportUiTextField.h>
#include <QWidget>
@@ -19,7 +20,6 @@
namespace AzToolsFramework::ViewportUi::Internal
{
const static int HighlightBorderSize = 5;
const static int TopHighlightBorderSize = 25;
const static char* HighlightBorderColor = "#4A90E2";
static void UnparentWidgets(ViewportUiElementIdInfoLookup& viewportUiElementIdInfoLookup)
@@ -61,7 +61,7 @@ namespace AzToolsFramework::ViewportUi::Internal
, m_uiOverlay(parent)
, m_fullScreenLayout(&m_uiOverlay)
, m_uiOverlayLayout()
, m_componentModeBorderText(&m_uiOverlay)
, m_viewportBorderText(&m_uiOverlay)
{
}
@@ -221,11 +221,11 @@ namespace AzToolsFramework::ViewportUi::Internal
AZStd::shared_ptr<QWidget> ViewportUiDisplay::GetViewportUiElement(ViewportUiElementId elementId)
{
auto element = m_viewportUiElements.find(elementId);
if (element != m_viewportUiElements.end())
if (auto element = m_viewportUiElements.find(elementId); element != m_viewportUiElements.end())
{
return element->second.m_widget;
}
return nullptr;
}
@@ -287,27 +287,30 @@ namespace AzToolsFramework::ViewportUi::Internal
{
return element.IsValid() && element.m_widget->isVisible();
}
return false;
}
void ViewportUiDisplay::CreateViewportBorder(const AZStd::string& borderTitle)
{
const AZStd::string styleSheet = AZStd::string::format(
"border: %dpx solid %s; border-top: %dpx solid %s;", HighlightBorderSize, HighlightBorderColor, TopHighlightBorderSize,
"border: %dpx solid %s; border-top: %dpx solid %s;", HighlightBorderSize, HighlightBorderColor, ViewportUiTopBorderSize,
HighlightBorderColor);
m_uiOverlay.setStyleSheet(styleSheet.c_str());
m_uiOverlayLayout.setContentsMargins(
HighlightBorderSize + ViewportUiOverlayMargin, TopHighlightBorderSize + ViewportUiOverlayMargin,
HighlightBorderSize + ViewportUiOverlayMargin, ViewportUiTopBorderSize + ViewportUiOverlayMargin,
HighlightBorderSize + ViewportUiOverlayMargin, HighlightBorderSize + ViewportUiOverlayMargin);
m_componentModeBorderText.setVisible(true);
m_componentModeBorderText.setText(borderTitle.c_str());
m_viewportBorderText.setVisible(true);
m_viewportBorderText.setText(borderTitle.c_str());
}
void ViewportUiDisplay::RemoveViewportBorder()
{
m_componentModeBorderText.setVisible(false);
m_viewportBorderText.setVisible(false);
m_uiOverlay.setStyleSheet("border: none;");
m_uiOverlayLayout.setMargin(ViewportUiOverlayMargin);
m_uiOverlayLayout.setContentsMargins(
ViewportUiOverlayMargin, ViewportUiOverlayMargin + ViewportUiOverlayTopMarginPadding, ViewportUiOverlayMargin,
ViewportUiOverlayMargin);
}
void ViewportUiDisplay::PositionViewportUiElementFromWorldSpace(ViewportUiElementId elementId, const AZ::Vector3& pos)
@@ -359,10 +362,10 @@ namespace AzToolsFramework::ViewportUi::Internal
// format the label which will appear on top of the highlight border
AZStd::string styleSheet = AZStd::string::format("background-color: %s; border: none;", HighlightBorderColor);
m_componentModeBorderText.setStyleSheet(styleSheet.c_str());
m_componentModeBorderText.setFixedHeight(TopHighlightBorderSize);
m_componentModeBorderText.setVisible(false);
m_fullScreenLayout.addWidget(&m_componentModeBorderText, 0, 0, Qt::AlignTop | Qt::AlignHCenter);
m_viewportBorderText.setStyleSheet(styleSheet.c_str());
m_viewportBorderText.setFixedHeight(ViewportUiTopBorderSize);
m_viewportBorderText.setVisible(false);
m_fullScreenLayout.addWidget(&m_viewportBorderText, 0, 0, Qt::AlignTop | Qt::AlignHCenter);
}
void ViewportUiDisplay::PrepareWidgetForViewportUi(QPointer<QWidget> widget)
@@ -395,14 +398,14 @@ namespace AzToolsFramework::ViewportUi::Internal
void ViewportUiDisplay::UpdateUiOverlayGeometry()
{
// add the component mode border region if visible
// add the viewport border region if visible
QRegion region;
if (m_componentModeBorderText.isVisible())
if (m_viewportBorderText.isVisible())
{
// get the border region by taking the entire region and subtracting the non-border area
region += m_uiOverlay.rect();
region -= QRect(
QPoint(m_uiOverlay.rect().left() + HighlightBorderSize, m_uiOverlay.rect().top() + TopHighlightBorderSize),
QPoint(m_uiOverlay.rect().left() + HighlightBorderSize, m_uiOverlay.rect().top() + ViewportUiTopBorderSize),
QPoint(m_uiOverlay.rect().right() - HighlightBorderSize, m_uiOverlay.rect().bottom() - HighlightBorderSize));
}
@@ -113,7 +113,7 @@ namespace AzToolsFramework::ViewportUi::Internal
QWidget m_uiOverlay; //!< The UI Overlay which displays Viewport UI Elements.
QGridLayout m_fullScreenLayout; //!< The layout which extends across the full screen.
ViewportUiDisplayLayout m_uiOverlayLayout; //!< The layout used for optionally anchoring Viewport UI Elements.
QLabel m_componentModeBorderText; //!< The text used for the Component Mode border.
QLabel m_viewportBorderText; //!< The text used for the viewport border.
QWidget* m_renderOverlay;
QPointer<QWidget> m_fullScreenWidget; //!< Reference to the widget attached to m_fullScreenLayout if any.
@@ -14,13 +14,20 @@
#include <QGridLayout>
#include <QPointer>
namespace AzToolsFramework::ViewportUi
{
//! Margin for the Viewport UI Overlay (in pixels)
constexpr int ViewportUiOverlayMargin = 5;
//! Padding to make space for ImGui (in pixels)
constexpr int ViewportUiOverlayTopMarginPadding = 20;
//! Size of the top viewport border (in pixels)
constexpr int ViewportUiTopBorderSize = 25;
//! Size of the left, right and bottom viewport border (in pixels)
constexpr int ViewportUiLeftRightBottomBorderSize = 5;
} // namespace AzToolsFramework::ViewportUi
namespace AzToolsFramework::ViewportUi::Internal
{
// margin for the Viewport UI Overlay in pixels
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
{