From 5b87fb4435a901b2709c2d7e87ce1a00b6398b21 Mon Sep 17 00:00:00 2001 From: Sergio Martins Date: Fri, 7 Jan 2022 17:31:20 +0000 Subject: [PATCH] Add an examples/mdi_with_docking/ example --- CMakeLists.txt | 2 + examples/dockwidgets/CMakeLists.txt | 1 + examples/mdi_with_docking/CMakeLists.txt | 37 ++++++++ examples/mdi_with_docking/MyWidget.cpp | 116 +++++++++++++++++++++++ examples/mdi_with_docking/MyWidget.h | 65 +++++++++++++ examples/mdi_with_docking/main.cpp | 77 +++++++++++++++ 6 files changed, 298 insertions(+) create mode 100644 examples/mdi_with_docking/CMakeLists.txt create mode 100644 examples/mdi_with_docking/MyWidget.cpp create mode 100644 examples/mdi_with_docking/MyWidget.h create mode 100644 examples/mdi_with_docking/main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 80bb0f8f..06e4861b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -298,8 +298,10 @@ if(${PROJECT_NAME}_EXAMPLES) add_subdirectory(examples/dockwidgets) add_subdirectory(examples/minimal) add_subdirectory(examples/minimal-mdi) + add_subdirectory(examples/mdi_with_docking) set_compiler_flags(kddockwidgets_example) set_compiler_flags(kddockwidgets_minimal_example) + set_compiler_flags(kddockwidgets_mdi_with_docking_example) endif() endif() diff --git a/examples/dockwidgets/CMakeLists.txt b/examples/dockwidgets/CMakeLists.txt index be1f4d30..cd30abad 100644 --- a/examples/dockwidgets/CMakeLists.txt +++ b/examples/dockwidgets/CMakeLists.txt @@ -35,5 +35,6 @@ add_executable(kddockwidgets_example target_link_libraries(kddockwidgets_example PRIVATE KDAB::kddockwidgets + X11 ) diff --git a/examples/mdi_with_docking/CMakeLists.txt b/examples/mdi_with_docking/CMakeLists.txt new file mode 100644 index 00000000..4ca18681 --- /dev/null +++ b/examples/mdi_with_docking/CMakeLists.txt @@ -0,0 +1,37 @@ +# +# This file is part of KDDockWidgets. +# +# SPDX-FileCopyrightText: 2019-2021 Klarälvdalens Datakonsult AB, a KDAB Group company +# Author: Sergio Martins +# +# SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only +# +# Contact KDAB at for commercial licensing options. +# + +cmake_minimum_required(VERSION 3.7) +project(kddockwidgets_mdi_with_docking_example) + +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) +set(CMAKE_INCLUDE_CURRENT_DIRS ON) + +if(NOT TARGET kddockwidgets) + # This will look for Qt, do find_package yourself manually before + # if you want to look for a specific Qt version for instance. + find_package(KDDockWidgets REQUIRED) +endif() + +set(RESOURCES_EXAMPLE_SRC ${CMAKE_CURRENT_SOURCE_DIR}/../dockwidgets/resources_example.qrc) + +add_executable(kddockwidgets_mdi_with_docking_example + main.cpp + ../dockwidgets/MyWidget.cpp + ${RESOURCES_EXAMPLE_SRC} +) + +target_link_libraries(kddockwidgets_mdi_with_docking_example + PRIVATE + KDAB::kddockwidgets +) + diff --git a/examples/mdi_with_docking/MyWidget.cpp b/examples/mdi_with_docking/MyWidget.cpp new file mode 100644 index 00000000..6bca080b --- /dev/null +++ b/examples/mdi_with_docking/MyWidget.cpp @@ -0,0 +1,116 @@ +/* + This file is part of KDDockWidgets. + + SPDX-FileCopyrightText: 2019-2021 Klarälvdalens Datakonsult AB, a KDAB Group company + Author: Sérgio Martins + + SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only + + Contact KDAB at for commercial licensing options. +*/ + +#include "MyWidget.h" + +#include +#include +#include +#include + +static QHash s_images; /// clazy:exclude=non-pod-global-static + +MyWidget::MyWidget(const QString &backgroundFile, const QString &logoFile, QWidget *parent) + : QWidget(parent) +{ + if (!backgroundFile.isEmpty()) { + auto it = s_images.find(backgroundFile); + if (it == s_images.end()) + it = s_images.insert(backgroundFile, QImage(backgroundFile)); + m_background = it.value(); + } + + if (!logoFile.isEmpty()) { + auto it = s_images.find(logoFile); + if (it == s_images.end()) + it = s_images.insert(logoFile, QImage(logoFile)); + m_logo = it.value(); + } + + setFocusPolicy(Qt::StrongFocus); +#if 0 + // Uncomment to show focus propagation working + new QLineEdit(this); + auto l2 = new QLineEdit(this); + l2->move(0, 100); + setFocusProxy(l2); +#endif +} + +MyWidget::~MyWidget() +{ +} + +void MyWidget::drawLogo(QPainter &p) +{ + if (m_logo.isNull()) + return; + + const qreal ratio = m_logo.height() / (m_logo.width() * 1.0); + + const int maxWidth = int(0.80 * size().width()); + const int maxHeight = int(0.80 * size().height()); + + const int proposedHeight = int(maxWidth * ratio); + + const int width = proposedHeight <= maxHeight ? maxWidth + : int(maxHeight / ratio); + + const int height = int(width * ratio); + QRect targetLogoRect(0,0, width, height); + targetLogoRect.moveCenter(rect().center() + QPoint(0, -int(size().height() * 0.00))); + p.drawImage(targetLogoRect, m_logo, m_logo.rect()); +} + +MyWidget1::MyWidget1(MyWidget::QWidget *parent) + : MyWidget(QStringLiteral(":/assets/triangles.png"), QStringLiteral(":/assets/KDAB_bubble_white.png"), parent) +{ +} + +void MyWidget1::paintEvent(QPaintEvent *) +{ + QPainter p(this); + p.fillRect(rect(), QColor(0xCC, 0xCC, 0xCC)); + p.drawImage(m_background.rect(), m_background, m_background.rect()); + + drawLogo(p); +} + +MyWidget2::MyWidget2(MyWidget::QWidget *parent) + : MyWidget(QString(), QStringLiteral(":/assets/KDAB_bubble_blue.png"), parent) +{ +} + +void MyWidget2::paintEvent(QPaintEvent *) +{ + QPainter p(this); + p.fillRect(rect(), Qt::white); + drawLogo(p); +} + +MyWidget3::MyWidget3(MyWidget::QWidget *parent) + : MyWidget(QStringLiteral(":/assets/base.png"), QStringLiteral(":/assets/KDAB_bubble_fulcolor.png"), parent) + , m_triangle(QImage(QStringLiteral(":/assets/tri.png"))) +{ +} + +void MyWidget3::paintEvent(QPaintEvent *) +{ + QPainter p(this); + p.fillRect(rect(), QColor(0xD5, 0xD5, 0xD5)); + + p.drawImage(m_background.rect(), m_background, m_background.rect()); + + const QRect targetRect = QRect({ width() - m_triangle.width(), height() - m_triangle.height() }, m_triangle.size()); + + p.drawImage(targetRect, m_triangle, m_triangle.rect()); + drawLogo(p); +} diff --git a/examples/mdi_with_docking/MyWidget.h b/examples/mdi_with_docking/MyWidget.h new file mode 100644 index 00000000..ad9ff91d --- /dev/null +++ b/examples/mdi_with_docking/MyWidget.h @@ -0,0 +1,65 @@ +/* + This file is part of KDDockWidgets. + + SPDX-FileCopyrightText: 2019-2021 Klarälvdalens Datakonsult AB, a KDAB Group company + Author: Sérgio Martins + + SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only + + Contact KDAB at for commercial licensing options. +*/ + +#ifndef EXAMPLEDOCKABLEWIDGET_H +#define EXAMPLEDOCKABLEWIDGET_H + +#pragma once + +#include + +QT_BEGIN_NAMESPACE +class QPainter; +QT_END_NAMESPACE + +class MyWidget : public QWidget +{ + Q_OBJECT +public: + MyWidget() = default; + explicit MyWidget(const QString &backgroundFile, const QString &logoFile, QWidget *parent = nullptr); + ~MyWidget(); +protected: + void drawLogo(QPainter &); + QImage m_background; + QImage m_logo; +}; + +class MyWidget1 : public MyWidget +{ + Q_OBJECT +public: + explicit MyWidget1(QWidget *parent = nullptr); +protected: + void paintEvent(QPaintEvent*) override; +}; + +class MyWidget2 : public MyWidget +{ + Q_OBJECT +public: + explicit MyWidget2(QWidget *parent = nullptr); +protected: + void paintEvent(QPaintEvent*) override; +}; + +class MyWidget3 : public MyWidget +{ + Q_OBJECT +public: + explicit MyWidget3(QWidget *parent = nullptr); +protected: + void paintEvent(QPaintEvent*) override; + QImage m_triangle; +}; + + +#endif diff --git a/examples/mdi_with_docking/main.cpp b/examples/mdi_with_docking/main.cpp new file mode 100644 index 00000000..b557df44 --- /dev/null +++ b/examples/mdi_with_docking/main.cpp @@ -0,0 +1,77 @@ +/* + This file is part of KDDockWidgets. + + SPDX-FileCopyrightText: 2019-2021 Klarälvdalens Datakonsult AB, a KDAB Group company + Author: Sérgio Martins + + SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only + + Contact KDAB at for commercial licensing options. +*/ + +#include "MyWidget.h" + +#include +#include +#include + +#include +#include + +// clazy:excludeall=qstring-allocations + +int main(int argc, char **argv) +{ +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); +#endif + QApplication app(argc, argv); + + app.setOrganizationName(QStringLiteral("KDAB")); + app.setApplicationName(QStringLiteral("App supporting both docking and a MDI area")); + + // Fusion looks better in general, but feel free to change + qApp->setStyle(QStyleFactory::create(QStringLiteral("Fusion"))); + + // # 1. Create our main window + + KDDockWidgets::MainWindow mainWindow(QStringLiteral("MyMainWindow"), KDDockWidgets::MainWindowOption_HasCentralWidget); + mainWindow.setWindowTitle("Main Window"); + mainWindow.resize(1600, 1200); + mainWindow.show(); + + // # 2. Create a dock widget, it needs a unique name + auto dock1 = new KDDockWidgets::DockWidget(QStringLiteral("MyDock1")); + auto widget1 = new MyWidget1(); + dock1->setWidget(widget1); + + auto dock2 = new KDDockWidgets::DockWidget(QStringLiteral("MyDock2")); + auto widget2 = new MyWidget2(); + dock2->setWidget(widget2); + + // # 3. Dock them + mainWindow.addDockWidget(dock1, KDDockWidgets::Location_OnLeft, nullptr, KDDockWidgets::InitialOption(QSize(300, 0))); + mainWindow.addDockWidget(dock2, KDDockWidgets::Location_OnBottom, nullptr, KDDockWidgets::InitialOption(QSize(0, 300))); + + + // 4. Create our MDI widgets, which will go into the MDI area + auto mdiWidget1 = new KDDockWidgets::DockWidget(QStringLiteral("MDI widget1")); + mdiWidget1->setWidget(new MyWidget1()); + + auto mdiWidget2 = new KDDockWidgets::DockWidget(QStringLiteral("MDI widget2")); + mdiWidget2->setWidget(new MyWidget2()); + + auto mdiWidget3 = new KDDockWidgets::DockWidget(QStringLiteral("MDI widget3")); + mdiWidget3->setWidget(new MyWidget3()); + + auto mdiArea = new KDDockWidgets::MDIArea(); + mainWindow.setPersistentCentralWidget(mdiArea); + + mdiArea->addDockWidget(mdiWidget1, QPoint(10, 10)); + mdiArea->addDockWidget(mdiWidget2, QPoint(50, 50)); + mdiArea->addDockWidget(mdiWidget3, QPoint(110, 110)); + + + return app.exec(); +}