From 037140b980ab83b4e410a9632b1ba75e2cd01378 Mon Sep 17 00:00:00 2001 From: Sergio Martins Date: Mon, 11 Apr 2022 00:55:28 +0100 Subject: [PATCH] Add KDDockWidgets::initPlatform() Instead of using the static variable, which is initialized before having QApplication. Will allow us to remove the QTimer from Platform init --- examples/dockwidgets/main.cpp | 3 ++- examples/mdi_with_docking/main.cpp | 2 ++ examples/minimal-mdi/main.cpp | 2 ++ examples/minimal/main.cpp | 3 ++- src/CMakeLists.txt | 1 + src/KDDockWidgets.cpp | 33 ++++++++++++++++++++++++++++ src/KDDockWidgets.h | 10 ++++++--- src/Platform.cpp | 2 ++ src/qtcommon/Platform_qt.cpp | 3 +++ src/qtquick/Platform_qtquick.cpp | 2 -- src/qtwidgets/Platform_qtwidgets.cpp | 1 - tests/tst_docks.h | 3 +++ 12 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 src/KDDockWidgets.cpp diff --git a/examples/dockwidgets/main.cpp b/examples/dockwidgets/main.cpp index b4b68483..f63be6ba 100644 --- a/examples/dockwidgets/main.cpp +++ b/examples/dockwidgets/main.cpp @@ -33,10 +33,11 @@ int main(int argc, char **argv) QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); #endif QApplication app(argc, argv); - app.setOrganizationName(QStringLiteral("KDAB")); app.setApplicationName(QStringLiteral("Test app")); + KDDockWidgets::initFrontend(KDDockWidgets::FrontendType::QtWidgets); + QCommandLineParser parser; parser.setApplicationDescription("KDDockWidgets example application"); parser.addHelpOption(); diff --git a/examples/mdi_with_docking/main.cpp b/examples/mdi_with_docking/main.cpp index 76be26fa..79a2468c 100644 --- a/examples/mdi_with_docking/main.cpp +++ b/examples/mdi_with_docking/main.cpp @@ -32,6 +32,8 @@ int main(int argc, char **argv) app.setOrganizationName(QStringLiteral("KDAB")); app.setApplicationName(QStringLiteral("App supporting both docking and a MDI area")); + KDDockWidgets::initFrontend(KDDockWidgets::FrontendType::QtWidgets); + QCommandLineParser parser; parser.setApplicationDescription("KDDockWidgets MDI mixed with normal docking"); parser.addHelpOption(); diff --git a/examples/minimal-mdi/main.cpp b/examples/minimal-mdi/main.cpp index 85fe7583..4f29f948 100644 --- a/examples/minimal-mdi/main.cpp +++ b/examples/minimal-mdi/main.cpp @@ -30,6 +30,8 @@ int main(int argc, char **argv) app.setOrganizationName(QStringLiteral("KDAB")); app.setApplicationName(QStringLiteral("Test app")); + KDDockWidgets::initFrontend(KDDockWidgets::FrontendType::QtWidgets); + // Fusion looks better in general, but feel free to change qApp->setStyle(QStyleFactory::create(QStringLiteral("Fusion"))); diff --git a/examples/minimal/main.cpp b/examples/minimal/main.cpp index 2194b9cd..4798daf7 100644 --- a/examples/minimal/main.cpp +++ b/examples/minimal/main.cpp @@ -28,10 +28,11 @@ int main(int argc, char **argv) QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); #endif QApplication app(argc, argv); - app.setOrganizationName(QStringLiteral("KDAB")); app.setApplicationName(QStringLiteral("Test app")); + KDDockWidgets::initFrontend(KDDockWidgets::FrontendType::QtWidgets); + // Fusion looks better in general, but feel free to change qApp->setStyle(QStyleFactory::create(QStringLiteral("Fusion"))); diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8ae535ee..17c44ffa 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -22,6 +22,7 @@ add_definitions(-DQT_NO_SIGNALS_SLOTS_KEYWORDS ) set(DOCKSLIBS_SRCS + KDDockWidgets.cpp Config.cpp Config.h Qt5Qt6Compat_p.h diff --git a/src/KDDockWidgets.cpp b/src/KDDockWidgets.cpp new file mode 100644 index 00000000..64649204 --- /dev/null +++ b/src/KDDockWidgets.cpp @@ -0,0 +1,33 @@ +/* + This file is part of KDDockWidgets. + + SPDX-FileCopyrightText: 2019-2022 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 "KDDockWidgets.h" + +#include "qtwidgets/Platform_qtwidgets.h" +#include "qtquick/Platform_qtquick.h" + +#include + +void KDDockWidgets::initFrontend(FrontendType type) +{ + if (Platform::instance()) + return; + + switch (type) { + case FrontendType::QtWidgets: + new Platform_qtwidgets(); + break; + case FrontendType::QtQuick: + // new Platform_qtquick(); // TODOv2 + break; + } +} diff --git a/src/KDDockWidgets.h b/src/KDDockWidgets.h index 620ab011..abee661a 100644 --- a/src/KDDockWidgets.h +++ b/src/KDDockWidgets.h @@ -60,12 +60,12 @@ enum MainWindowOption { Q_DECLARE_FLAGS(MainWindowOptions, MainWindowOption) Q_ENUM_NS(MainWindowOptions) -enum class FrontEndType +enum class FrontendType { QtWidgets = 1, QtQuick }; -Q_ENUM_NS(FrontEndType) +Q_ENUM_NS(FrontendType) ///@internal ///@brief Describes some sizing strategies for the layouting engine. @@ -310,7 +310,11 @@ inline QString locationStr(Location loc) return QString(); } -} + +/// @brief Initializes the desired frontend +void DOCKS_EXPORT initFrontend(FrontendType); + +} // end namespace QT_BEGIN_NAMESPACE ///@internal diff --git a/src/Platform.cpp b/src/Platform.cpp index 4a1c5bdb..eed4eff8 100644 --- a/src/Platform.cpp +++ b/src/Platform.cpp @@ -10,6 +10,7 @@ */ #include "Platform.h" + #include #include @@ -19,6 +20,7 @@ static Platform *s_platform = nullptr; Platform::Platform() { + Q_ASSERT(!s_platform); s_platform = this; } diff --git a/src/qtcommon/Platform_qt.cpp b/src/qtcommon/Platform_qt.cpp index f5492b8c..2826e047 100644 --- a/src/qtcommon/Platform_qt.cpp +++ b/src/qtcommon/Platform_qt.cpp @@ -13,6 +13,7 @@ #include "Window_qt.h" #include +#include #include using namespace KDDockWidgets; @@ -20,6 +21,8 @@ using namespace KDDockWidgets; Platform_qt::Platform_qt() { + if (!qApp) + qWarning() << "Please call KDDockWidgets::initPlatform() after QGuiApplication"; } Platform_qt::~Platform_qt() diff --git a/src/qtquick/Platform_qtquick.cpp b/src/qtquick/Platform_qtquick.cpp index fdeaae20..17d5eccd 100644 --- a/src/qtquick/Platform_qtquick.cpp +++ b/src/qtquick/Platform_qtquick.cpp @@ -22,8 +22,6 @@ #include #include -static KDDockWidgets::Platform_qtquick s_platformQtQuick; - using namespace KDDockWidgets; diff --git a/src/qtwidgets/Platform_qtwidgets.cpp b/src/qtwidgets/Platform_qtwidgets.cpp index d307dcdd..afae8961 100644 --- a/src/qtwidgets/Platform_qtwidgets.cpp +++ b/src/qtwidgets/Platform_qtwidgets.cpp @@ -22,7 +22,6 @@ #include -static KDDockWidgets::Platform_qtwidgets s_platformQtWidgets; using namespace KDDockWidgets; diff --git a/tests/tst_docks.h b/tests/tst_docks.h index 504017ed..75e307da 100644 --- a/tests/tst_docks.h +++ b/tests/tst_docks.h @@ -46,6 +46,9 @@ class TestDocks : public QObject public Q_SLOTS: void initTestCase() { + // TODOv2 + KDDockWidgets::initFrontend(KDDockWidgets::FrontendType::QtWidgets); + qputenv("KDDOCKWIDGETS_SHOW_DEBUG_WINDOW", ""); qApp->setOrganizationName("KDAB"); qApp->setApplicationName("dockwidgets-unit-tests");