diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Window/AtomToolsMainWindow.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Window/AtomToolsMainWindow.h index 21afe114f5..2cc6621cec 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Window/AtomToolsMainWindow.h +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Window/AtomToolsMainWindow.h @@ -8,6 +8,7 @@ #pragma once #include +#include #include #include @@ -22,14 +23,19 @@ namespace AtomToolsFramework { class AtomToolsMainWindow : public AzQtComponents::DockMainWindow + , protected AtomToolsFramework::AtomToolsMainWindowRequestBus::Handler { public: AtomToolsMainWindow(QWidget* parent = 0); + ~AtomToolsMainWindow(); + protected: - AzQtComponents::FancyDocking* m_advancedDockManager = nullptr; - QWidget* m_centralWidget = nullptr; - QMenuBar* m_menuBar = nullptr; - AzQtComponents::TabWidget* m_tabWidget = nullptr; + void ActivateWindow() override; + bool AddDockWidget(const AZStd::string& name, QWidget* widget, uint32_t area, uint32_t orientation) override; + void RemoveDockWidget(const AZStd::string& name) override; + void SetDockWidgetVisible(const AZStd::string& name, bool visible) override; + bool IsDockWidgetVisible(const AZStd::string& name) const override; + AZStd::vector GetDockWidgetNames() const override; virtual void SetupMenu(); @@ -43,6 +49,14 @@ namespace AtomToolsFramework virtual void SelectPreviousTab(); virtual void SelectNextTab(); + AzQtComponents::FancyDocking* m_advancedDockManager = nullptr; + QWidget* m_centralWidget = nullptr; + QMenuBar* m_menuBar = nullptr; + AzQtComponents::TabWidget* m_tabWidget = nullptr; + + AZStd::unordered_map m_dockWidgets; + QMenu* m_menuFile = {}; + //StatusBarWidget* m_statusBar = {}; }; } diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Window/AtomToolsMainWindowFactoryRequestBus.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Window/AtomToolsMainWindowFactoryRequestBus.h new file mode 100644 index 0000000000..aed0d877db --- /dev/null +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Window/AtomToolsMainWindowFactoryRequestBus.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#pragma once + +#include + +namespace AtomToolsFramework +{ + //! AtomToolsMainWindowFactoryRequestBus provides + class AtomToolsMainWindowFactoryRequests : public AZ::EBusTraits + { + public: + static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single; + static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single; + + /// Creates and shows the AtomToolsMainWindow + virtual void CreateAtomToolsMainWindow() = 0; + + //! Destroys material editor window and releases all cached assets + virtual void DestroyAtomToolsMainWindow() = 0; + }; + using AtomToolsMainWindowFactoryRequestBus = AZ::EBus; + +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Window/AtomToolsMainWindowRequestBus.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Window/AtomToolsMainWindowRequestBus.h new file mode 100644 index 0000000000..fd98b3b68b --- /dev/null +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Window/AtomToolsMainWindowRequestBus.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#pragma once +#pragma warning(disable : 4100) +#include +#include +#include + +class QWidget; + +namespace AtomToolsFramework +{ + //! AtomToolsMainWindowRequestBus provides + class AtomToolsMainWindowRequests : public AZ::EBusTraits + { + public: + static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single; + static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single; + + //! Bring main window to foreground + virtual void ActivateWindow() = 0; + + //! Add dockable widget in main window + //! @param name title of the dockable window + //! @param widget docked window content + //! @param area location of docked window corresponding to Qt::DockWidgetArea + //! @param orientation orientation of docked window corresponding to Qt::Orientation + virtual bool AddDockWidget(const AZStd::string& name, QWidget* widget, uint32_t area, uint32_t orientation) = 0; + + //! Destroy dockable widget in main window + //! @param name title of the dockable window + virtual void RemoveDockWidget(const AZStd::string& name) = 0; + + //! Show or hide dockable widget in main window + //! @param name title of the dockable window + virtual void SetDockWidgetVisible(const AZStd::string& name, bool visible) = 0; + + //! Determine visibility of dockable widget in main window + //! @param name title of the dockable window + virtual bool IsDockWidgetVisible(const AZStd::string& name) const = 0; + + //! Get a list of registered docked widget names + virtual AZStd::vector GetDockWidgetNames() const = 0; + + //! Resizes the Material Editor window to achieve a requested size for the viewport render target. + //! (This indicates the size of the render target, not the desktop-scaled QT widget size). + virtual void ResizeViewportRenderTarget(uint32_t width, uint32_t height) {}; + + //! Forces the viewport's render target to use the given resolution, ignoring the size of the viewport widget. + virtual void LockViewportRenderTargetSize(uint32_t width, uint32_t height) {}; + + //! Releases the viewport's render target resolution lock, allowing it to match the viewport widget again. + virtual void UnlockViewportRenderTargetSize() {}; + }; + using AtomToolsMainWindowRequestBus = AZ::EBus; + +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Window/AtomToolsMainWindow.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Window/AtomToolsMainWindow.cpp index 15edd8c5b6..849169e2e3 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Window/AtomToolsMainWindow.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Window/AtomToolsMainWindow.cpp @@ -8,7 +8,6 @@ #include - namespace AtomToolsFramework { AtomToolsMainWindow::AtomToolsMainWindow(QWidget* parent) @@ -31,6 +30,80 @@ namespace AtomToolsFramework m_tabWidget->setObjectName("TabWidget"); m_tabWidget->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Preferred); m_tabWidget->setContentsMargins(0, 0, 0, 0); + + AtomToolsMainWindowRequestBus::Handler::BusConnect(); + } + + AtomToolsMainWindow::~AtomToolsMainWindow() + { + AtomToolsMainWindowRequestBus::Handler::BusDisconnect(); + } + + void AtomToolsMainWindow::ActivateWindow() + { + activateWindow(); + raise(); + } + + bool AtomToolsMainWindow::AddDockWidget(const AZStd::string& name, QWidget* widget, uint32_t area, uint32_t orientation) + { + auto dockWidgetItr = m_dockWidgets.find(name); + if (dockWidgetItr != m_dockWidgets.end() || !widget) + { + return false; + } + + auto dockWidget = new AzQtComponents::StyledDockWidget(name.c_str()); + dockWidget->setObjectName(QString("%1_DockWidget").arg(name.c_str())); + dockWidget->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetMovable); + widget->setObjectName(name.c_str()); + widget->setParent(dockWidget); + widget->setMinimumSize(QSize(300, 300)); + dockWidget->setWidget(widget); + addDockWidget(aznumeric_cast(area), dockWidget); + resizeDocks({ dockWidget }, { 400 }, aznumeric_cast(orientation)); + m_dockWidgets[name] = dockWidget; + return true; + } + + void AtomToolsMainWindow::RemoveDockWidget(const AZStd::string& name) + { + auto dockWidgetItr = m_dockWidgets.find(name); + if (dockWidgetItr != m_dockWidgets.end()) + { + delete dockWidgetItr->second; + m_dockWidgets.erase(dockWidgetItr); + } + } + + void AtomToolsMainWindow::SetDockWidgetVisible(const AZStd::string& name, bool visible) + { + auto dockWidgetItr = m_dockWidgets.find(name); + if (dockWidgetItr != m_dockWidgets.end()) + { + dockWidgetItr->second->setVisible(visible); + } + } + + bool AtomToolsMainWindow::IsDockWidgetVisible(const AZStd::string& name) const + { + auto dockWidgetItr = m_dockWidgets.find(name); + if (dockWidgetItr != m_dockWidgets.end()) + { + return dockWidgetItr->second->isVisible(); + } + return false; + } + + AZStd::vector AtomToolsMainWindow::GetDockWidgetNames() const + { + AZStd::vector names; + names.reserve(m_dockWidgets.size()); + for (const auto& dockWidgetPair : m_dockWidgets) + { + names.push_back(dockWidgetPair.first); + } + return names; } void AtomToolsMainWindow::SetupMenu() @@ -132,4 +205,4 @@ namespace AtomToolsFramework m_tabWidget->setCurrentIndex((m_tabWidget->currentIndex() + 1) % m_tabWidget->count()); } } -} +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake b/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake index 5ef4426537..0769aac86c 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake @@ -24,7 +24,9 @@ set(FILES Include/AtomToolsFramework/Viewport/RenderViewportWidget.h Include/AtomToolsFramework/Viewport/ModularViewportCameraController.h Include/AtomToolsFramework/Viewport/ModularViewportCameraControllerRequestBus.h - Include/AtomToolsFramework/Window/AtomToolsMainWindow.h + Include/AtomToolsFramework/Window/AtomToolsMainWindow.h + Include/AtomToolsFramework/Window/AtomToolsMainWindowRequestBus.h + Include/AtomToolsFramework/Window/AtomToolsMainWindowFactoryRequestBus.h Source/Application/AtomToolsApplication.cpp Source/Communication/LocalServer.cpp Source/Communication/LocalSocket.cpp @@ -41,5 +43,5 @@ set(FILES Source/Util/Util.cpp Source/Viewport/RenderViewportWidget.cpp Source/Viewport/ModularViewportCameraController.cpp - Source/Window/AtomToolsMainWindow.cpp + Source/Window/AtomToolsMainWindow.cpp ) diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindow.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindow.cpp index 78670ac710..96a94ebfcc 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindow.cpp +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindow.cpp @@ -131,7 +131,6 @@ namespace MaterialEditor m_advancedDockManager->restoreState(windowState); } - MaterialEditorWindowRequestBus::Handler::BusConnect(); MaterialDocumentNotificationBus::Handler::BusConnect(); OnDocumentOpened(AZ::Uuid::CreateNull()); } @@ -139,76 +138,9 @@ namespace MaterialEditor MaterialEditorWindow::~MaterialEditorWindow() { MaterialDocumentNotificationBus::Handler::BusDisconnect(); - MaterialEditorWindowRequestBus::Handler::BusDisconnect(); - } - - void MaterialEditorWindow::ActivateWindow() - { - activateWindow(); - raise(); - } - - bool MaterialEditorWindow::AddDockWidget(const AZStd::string& name, QWidget* widget, uint32_t area, uint32_t orientation) - { - auto dockWidgetItr = m_dockWidgets.find(name); - if (dockWidgetItr != m_dockWidgets.end() || !widget) - { - return false; - } - - auto dockWidget = new AzQtComponents::StyledDockWidget(name.c_str()); - dockWidget->setObjectName(QString("%1_DockWidget").arg(name.c_str())); - dockWidget->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetMovable); - widget->setObjectName(name.c_str()); - widget->setParent(dockWidget); - widget->setMinimumSize(QSize(300, 300)); - dockWidget->setWidget(widget); - addDockWidget(aznumeric_cast(area), dockWidget); - resizeDocks({ dockWidget }, { 400 }, aznumeric_cast(orientation)); - m_dockWidgets[name] = dockWidget; - return true; - } - - void MaterialEditorWindow::RemoveDockWidget(const AZStd::string& name) - { - auto dockWidgetItr = m_dockWidgets.find(name); - if (dockWidgetItr != m_dockWidgets.end()) - { - delete dockWidgetItr->second; - m_dockWidgets.erase(dockWidgetItr); - } - } - - void MaterialEditorWindow::SetDockWidgetVisible(const AZStd::string& name, bool visible) - { - auto dockWidgetItr = m_dockWidgets.find(name); - if (dockWidgetItr != m_dockWidgets.end()) - { - dockWidgetItr->second->setVisible(visible); - } - } - - bool MaterialEditorWindow::IsDockWidgetVisible(const AZStd::string& name) const - { - auto dockWidgetItr = m_dockWidgets.find(name); - if (dockWidgetItr != m_dockWidgets.end()) - { - return dockWidgetItr->second->isVisible(); - } - return false; - } - - AZStd::vector MaterialEditorWindow::GetDockWidgetNames() const - { - AZStd::vector names; - names.reserve(m_dockWidgets.size()); - for (const auto& dockWidgetPair : m_dockWidgets) - { - names.push_back(dockWidgetPair.first); - } - return names; } + void MaterialEditorWindow::ResizeViewportRenderTarget(uint32_t width, uint32_t height) { QSize requestedViewportSize = QSize(width, height) / devicePixelRatioF(); diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindow.h b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindow.h index 96f03e6eed..a443f04ebe 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindow.h +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindow.h @@ -46,7 +46,6 @@ namespace MaterialEditor */ class MaterialEditorWindow : public AtomToolsFramework::AtomToolsMainWindow - , private MaterialEditorWindowRequestBus::Handler , private MaterialDocumentNotificationBus::Handler { Q_OBJECT @@ -59,14 +58,6 @@ namespace MaterialEditor ~MaterialEditorWindow(); private: - // MaterialEditorWindowRequestBus::Handler overrides... - void ActivateWindow() override; - bool AddDockWidget(const AZStd::string& name, QWidget* widget, uint32_t area, uint32_t orientation) override; - void RemoveDockWidget(const AZStd::string& name) override; - void SetDockWidgetVisible(const AZStd::string& name, bool visible) override; - bool IsDockWidgetVisible(const AZStd::string& name) const override; - AZStd::vector GetDockWidgetNames() const override; - void ResizeViewportRenderTarget(uint32_t width, uint32_t height) override; void LockViewportRenderTargetSize(uint32_t width, uint32_t height) override; void UnlockViewportRenderTargetSize() override; @@ -92,8 +83,6 @@ namespace MaterialEditor MaterialViewportWidget* m_materialViewport = nullptr; MaterialEditorToolBar* m_toolBar = nullptr; - AZStd::unordered_map m_dockWidgets; - QAction* m_actionNew = {}; QAction* m_actionOpen = {}; QAction* m_actionOpenRecent = {}; diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/ShaderManagementConsoleWindow.cpp b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/ShaderManagementConsoleWindow.cpp index 90a2e238a9..05f88655ca 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/ShaderManagementConsoleWindow.cpp +++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/ShaderManagementConsoleWindow.cpp @@ -58,24 +58,8 @@ namespace ShaderManagementConsole SetupMenu(); SetupTabs(); - m_assetBrowserDockWidget = new AzQtComponents::StyledDockWidget("Asset Browser"); - m_assetBrowserDockWidget->setObjectName(m_assetBrowserDockWidget->windowTitle()); - m_assetBrowserDockWidget->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetMovable); - m_assetBrowser = new ShaderManagementConsoleBrowserWidget(m_assetBrowserDockWidget); - m_assetBrowser->setMinimumSize(QSize(300, 300)); - m_assetBrowserDockWidget->setWidget(m_assetBrowser); - addDockWidget(Qt::BottomDockWidgetArea, m_assetBrowserDockWidget); - resizeDocks({ m_assetBrowserDockWidget }, { 400 }, Qt::Vertical); - - m_pythonTerminalDockWidget = new AzQtComponents::StyledDockWidget("Python Terminal"); - m_pythonTerminalDockWidget->setObjectName(m_pythonTerminalDockWidget->windowTitle()); - m_pythonTerminalDockWidget->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetMovable); - m_pythonTerminal = new AzToolsFramework::CScriptTermDialog(m_pythonTerminalDockWidget); - m_pythonTerminal->setMinimumSize(QSize(300, 300)); - m_pythonTerminalDockWidget->setWidget(m_pythonTerminal); - addDockWidget(Qt::BottomDockWidgetArea, m_pythonTerminalDockWidget); - resizeDocks({ m_pythonTerminalDockWidget }, { 400 }, Qt::Vertical); - m_pythonTerminalDockWidget->setVisible(false); + AddDockWidget("Asset Browser", new ShaderManagementConsoleBrowserWidget, Qt::BottomDockWidgetArea, Qt::Vertical); + AddDockWidget("Python Terminal", new AzToolsFramework::CScriptTermDialog, Qt::BottomDockWidgetArea, Qt::Horizontal); ShaderManagementConsoleDocumentNotificationBus::Handler::BusConnect(); OnDocumentOpened(AZ::Uuid::CreateNull()); @@ -256,17 +240,20 @@ namespace ShaderManagementConsole m_menuView = m_menuBar->addMenu("&View"); - m_actionAssetBrowser = m_menuView->addAction("&Asset Browser", [this]() { - m_assetBrowserDockWidget->setVisible(!m_assetBrowserDockWidget->isVisible()); - }); - - m_actionPythonTerminal = m_menuView->addAction("Python &Terminal", [this]() { - m_pythonTerminalDockWidget->setVisible(!m_pythonTerminalDockWidget->isVisible()); - if (m_pythonTerminalDockWidget->isVisible()) + m_actionAssetBrowser = m_menuView->addAction( + "&Asset Browser", + [this]() { - // reposition console window on the bottom, otherwise it gets docked in some weird spot... - addDockWidget(Qt::BottomDockWidgetArea, m_pythonTerminalDockWidget); - } + const AZStd::string label = "Asset Browser"; + SetDockWidgetVisible(label, !IsDockWidgetVisible(label)); + }); + + m_actionPythonTerminal = m_menuView->addAction( + "Python &Terminal", + [this]() + { + const AZStd::string label = "Python Terminal"; + SetDockWidgetVisible(label, !IsDockWidgetVisible(label)); }); m_menuView->addSeparator(); diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/ShaderManagementConsoleWindow.h b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/ShaderManagementConsoleWindow.h index cb371bc4d6..8513366ec2 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/ShaderManagementConsoleWindow.h +++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/ShaderManagementConsoleWindow.h @@ -79,12 +79,7 @@ namespace ShaderManagementConsole void CreateDocumentContent(const AZ::Uuid& documentId, QStandardItemModel* model); - ShaderManagementConsoleBrowserWidget* m_assetBrowser = nullptr; ShaderManagementConsoleToolBar* m_toolBar = nullptr; - AzToolsFramework::CScriptTermDialog* m_pythonTerminal = nullptr; - - AzQtComponents::StyledDockWidget* m_assetBrowserDockWidget = nullptr; - AzQtComponents::StyledDockWidget* m_pythonTerminalDockWidget = nullptr; QMenu* m_menuNew = {}; QAction* m_actionOpen = {};