AtomToolsMainWindowRequestBus

Signed-off-by: Dayo Lawal <lawalfua@amazon.com>
This commit is contained in:
Dayo Lawal
2021-08-02 14:59:45 -05:00
parent 8eb9205711
commit 58ff2d8cab
9 changed files with 206 additions and 121 deletions
@@ -8,6 +8,7 @@
#pragma once
#include <AzCore/Memory/SystemAllocator.h>
#include <AtomToolsFramework/Window/AtomToolsMainWindowRequestBus.h>
#include <AzQtComponents/Components/DockMainWindow.h>
#include <AzQtComponents/Components/FancyDocking.h>
@@ -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<AZStd::string> 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<AZStd::string, AzQtComponents::StyledDockWidget*> m_dockWidgets;
QMenu* m_menuFile = {};
//StatusBarWidget* m_statusBar = {};
};
}
@@ -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 <AzCore/EBus/EBus.h>
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<AtomToolsMainWindowFactoryRequests>;
} // namespace AtomToolsFramework
@@ -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 <AzCore/EBus/EBus.h>
#include <AzCore/std/containers/vector.h>
#include <AzCore/std/string/string.h>
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<AZStd::string> 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<AtomToolsMainWindowRequests>;
} // namespace AtomToolsFramework
@@ -8,7 +8,6 @@
#include <AtomToolsFramework/Window/AtomToolsMainWindow.h>
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<Qt::DockWidgetArea>(area), dockWidget);
resizeDocks({ dockWidget }, { 400 }, aznumeric_cast<Qt::Orientation>(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<AZStd::string> AtomToolsMainWindow::GetDockWidgetNames() const
{
AZStd::vector<AZStd::string> 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
@@ -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
)
@@ -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<Qt::DockWidgetArea>(area), dockWidget);
resizeDocks({ dockWidget }, { 400 }, aznumeric_cast<Qt::Orientation>(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<AZStd::string> MaterialEditorWindow::GetDockWidgetNames() const
{
AZStd::vector<AZStd::string> 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();
@@ -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<AZStd::string> 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 <AZStd::string, AzQtComponents::StyledDockWidget*> m_dockWidgets;
QAction* m_actionNew = {};
QAction* m_actionOpen = {};
QAction* m_actionOpenRecent = {};
@@ -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();
@@ -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 = {};