/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * * For complete copyright and license terms please see the LICENSE at the root of this * distribution (the "License"). All use of this software is governed by the License, * or, if provided, by the license below or the license accompanying this file. Do not * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ #include "StyledDockWidgetPage.h" #include #include #include #include #include #include #include #include #include #include #include StyledDockWidgetPage::StyledDockWidgetPage(QWidget* parent) : QWidget(parent) , ui(new Ui::StyledDockWidgetPage) , m_mainWindow(nullptr) { ui->setupUi(this); connect(ui->button, &QPushButton::clicked, this, &StyledDockWidgetPage::showMainWindow); QString exampleText = R"( This example demonstrates the minimum required to use Amazon's fancy docking and styled dock widgets. AzQtComponents::DockMainWindow and AzQtComponents::StyledDockWidget use the same API as QMainWindow and QDockWidget respectively. To use the fancy docking, simply construct an AzQtComponents::FancyDocking with an AzQtComponents::DockMainWindow as the parent.

QMainWindow docs: http://doc.qt.io/qt-5/qmainwindow.html
QDockWidget docs: http://doc.qt.io/qt-5/qdockwidget.html
#include <AzQtComponents/Components/DockMainWindow.h>
#include <AzQtComponents/Components/StyledDockWidget.h>

#include <QVBoxLayout>
#include <QPushButton>
#include <QSettings>

// Construct a main window and apply fancy docking.
AzQtComponents::DockMainWindow mainWindow;
auto fancyDocking = new AzQtComponents::FancyDocking(mainWindow);

// Add one AzQtComponents::StyledDockWidget per edge
auto leftDockWidget = new AzQtComponents::StyledDockWidget("Left Dock Widget", mainWindow);
leftDockWidget->setObjectName(leftDockWidget->windowTitle());
leftDockWidget->setWidget(new QLabel("StyledDockWidget"));
mainWindow->addDockWidget(Qt::LeftDockWidgetArea, leftDockWidget);

auto topDockWidget = new AzQtComponents::StyledDockWidget("Top Dock Widget", mainWindow);
topDockWidget->setObjectName(topDockWidget->windowTitle());
topDockWidget->setWidget(new QLabel("StyledDockWidget"));
mainWindow->addDockWidget(Qt::TopDockWidgetArea, topDockWidget);

auto rightDockWidget = new AzQtComponents::StyledDockWidget("Right Dock Widget", mainWindow);
rightDockWidget->setObjectName(rightDockWidget->windowTitle());
rightDockWidget->setWidget(new QLabel("StyledDockWidget"));
mainWindow->addDockWidget(Qt::RightDockWidgetArea, rightDockWidget);

auto bottomDockWidget = new AzQtComponents::StyledDockWidget("Bottom Dock Widget", mainWindow);
bottomDockWidget->setObjectName(bottomDockWidget->windowTitle());
bottomDockWidget->setWidget(new QLabel("StyledDockWidget"));
mainWindow->addDockWidget(Qt::BottomDockWidgetArea, bottomDockWidget);

QWidget* centralWidget = new QWidget;
QVBoxLayout* vl = new QVBoxLayout(centralWidget);
vl->addWidget(new QLabel("Central Widget"));
mainWindow->setCentralWidget(centralWidget);

QSettings* settings = new QSettings(fancyDocking);

// Is is even possible to save and restore docks state
QPushButton* load = new QPushButton("Restore layout");
QPushButton* save = new QPushButton("Save layout");
vl->addWidget(load);
vl->addWidget(save);

connect(load, &QPushButton::clicked, fancyDocking, [mainWindow, settings, fancyDocking]()
{
    const QByteArray windowGeometry = settings->value("geometry").toByteArray();
    const QByteArray state = settings->value("docks").toByteArray();
    if (!windowGeometry.isEmpty())
    {
        mainWindow->restoreGeometry(windowGeometry);
    }
    if (!state.isEmpty())
    {
        fancyDocking->restoreState(state);
    }
});

connect(save, &QPushButton::clicked, fancyDocking, [mainWindow, settings, fancyDocking]()
{
    const QByteArray windowGeometry = mainWindow->saveGeometry();
    const QByteArray state = fancyDocking->saveState();
    if (!windowGeometry.isEmpty())
    {
        settings->setValue("geometry", windowGeometry);
    }
    if (!state.isEmpty())
    {
        settings->setValue("docks", state);
    }
});

// or to tabify or split docks
QPushButton* split = new QPushButton("Split docks");
QPushButton* tabs = new QPushButton("Tabs docks");
vl->addWidget(split);
vl->addWidget(tabs);

connect(split, &QPushButton::clicked, fancyDocking, [mainWindow, fancyDocking, leftDockWidget, rightDockWidget]()
{
    fancyDocking->splitDockWidget(mainWindow, leftDockWidget, rightDockWidget, Qt::Vertical);
});

connect(tabs, &QPushButton::clicked, fancyDocking, [mainWindow, fancyDocking, topDockWidget, bottomDockWidget]()
{
    fancyDocking->tabifyDockWidget(topDockWidget, bottomDockWidget, mainWindow);
});

// Show the main window
mainWindow->show();
    
)"; ui->exampleText->setHtml(exampleText); } StyledDockWidgetPage::~StyledDockWidgetPage() { } void StyledDockWidgetPage::showMainWindow() { if (m_mainWindow) { auto window = m_mainWindow->window(); window->show(); window->raise(); window->activateWindow(); return; } // Supply our own WindowDecorationWrapper, otherwise one gets automatically applied, forcing the // DockMainWindow to have Qt::Tool window flags. This is annoying on macOS, as the main window // is then always displayed on top, and also appears to prevent GammaRay from working until the // main window has been closed. using AzQtComponents::WindowDecorationWrapper; auto wrapper = new WindowDecorationWrapper(WindowDecorationWrapper::OptionAutoAttach | WindowDecorationWrapper::OptionAutoTitleBarButtons, m_mainWindow); m_mainWindow = new AzQtComponents::DockMainWindow(this); m_mainWindow->setObjectName("mainWindow"); m_mainWindow->resize(800, 600); m_mainWindow->setAttribute(Qt::WA_DeleteOnClose); auto fancyDocking = new AzQtComponents::FancyDocking(m_mainWindow); auto action = new QAction(m_mainWindow); action->setIcon(QIcon(QStringLiteral(":/stylesheet/img/search.svg"))); auto toolBar = new QToolBar(m_mainWindow); toolBar->addAction(action); m_mainWindow->addToolBar(toolBar); auto statusBar = new QStatusBar(m_mainWindow); statusBar->showMessage(QStringLiteral("Status Bar...")); m_mainWindow->setStatusBar(statusBar); QWidget* centralWidget = new QWidget; QPushButton* load = new QPushButton("Restore layout"); QPushButton* save = new QPushButton("Save layout"); QPushButton* split = new QPushButton("Split docks"); QPushButton* tabs = new QPushButton("Tabs docks"); QVBoxLayout* vl = new QVBoxLayout(centralWidget); vl->addWidget(new QLabel("Central Widget")); vl->addWidget(load); vl->addWidget(save); vl->addWidget(split); vl->addWidget(tabs); m_mainWindow->setCentralWidget(centralWidget); auto leftDockWidget = new AzQtComponents::StyledDockWidget("Left Dock Widget", m_mainWindow); leftDockWidget->setObjectName(leftDockWidget->windowTitle()); leftDockWidget->setWidget(new QLabel("StyledDockWidget")); m_mainWindow->addDockWidget(Qt::LeftDockWidgetArea, leftDockWidget); auto topDockWidget = new AzQtComponents::StyledDockWidget("Top Dock Widget", m_mainWindow); topDockWidget->setObjectName(topDockWidget->windowTitle()); topDockWidget->setWidget(new QLabel("StyledDockWidget")); m_mainWindow->addDockWidget(Qt::TopDockWidgetArea, topDockWidget); auto rightDockWidget = new AzQtComponents::StyledDockWidget("Right Dock Widget", m_mainWindow); rightDockWidget->setObjectName(rightDockWidget->windowTitle()); rightDockWidget->setWidget(new QLabel("StyledDockWidget")); m_mainWindow->addDockWidget(Qt::RightDockWidgetArea, rightDockWidget); auto bottomDockWidget = new AzQtComponents::StyledDockWidget("Bottom Dock Widget", m_mainWindow); bottomDockWidget->setObjectName(bottomDockWidget->windowTitle()); bottomDockWidget->setWidget(new QLabel("StyledDockWidget")); m_mainWindow->addDockWidget(Qt::BottomDockWidgetArea, bottomDockWidget); auto galleryCenter = mapToGlobal(frameGeometry().center()); auto mainWindowCenter = m_mainWindow->mapToGlobal(m_mainWindow->frameGeometry().center()); m_mainWindow->window()->move(galleryCenter - mainWindowCenter); m_mainWindow->setParent(wrapper, m_mainWindow->windowFlags()); // Ensure the wrapper doesn't reset the window size m_mainWindow->resize(m_mainWindow->size()); wrapper->show(); QSettings* settings = new QSettings(fancyDocking); connect(load, &QPushButton::clicked, this, [wrapper, settings, fancyDocking]() { const QByteArray windowGeometry = settings->value("geometry").toByteArray(); const QByteArray state = settings->value("docks").toByteArray(); if (!windowGeometry.isEmpty()) { wrapper->restoreGeometry(windowGeometry); } if (!state.isEmpty()) { fancyDocking->restoreState(state); } }); connect(save, &QPushButton::clicked, this, [wrapper, settings, fancyDocking]() { const QByteArray windowGeometry = wrapper->saveGeometry(); const QByteArray state = fancyDocking->saveState(); if (!windowGeometry.isEmpty()) { settings->setValue("geometry", windowGeometry); } if (!state.isEmpty()) { settings->setValue("docks", state); } }); connect(split, &QPushButton::clicked, this, [this, fancyDocking, leftDockWidget, rightDockWidget]() { fancyDocking->splitDockWidget(m_mainWindow, leftDockWidget, rightDockWidget, Qt::Vertical); }); connect(tabs, &QPushButton::clicked, this, [this, fancyDocking, topDockWidget, bottomDockWidget]() { fancyDocking->tabifyDockWidget(topDockWidget, bottomDockWidget, m_mainWindow); }); } #include "Gallery/moc_StyledDockWidgetPage.cpp"