diff --git a/examples/qtquick/dockwidgets/main.qml b/examples/qtquick/dockwidgets/main.qml index c25bf72d..f1183f52 100644 --- a/examples/qtquick/dockwidgets/main.qml +++ b/examples/qtquick/dockwidgets/main.qml @@ -16,6 +16,9 @@ import com.kdab.dockwidgets 1.0 as KDDW KDDW.MainWindow { id: root + // Each main layout needs a unique id + uniqueName: "MyWindowName-1" + Repeater { model: 3 KDDW.DockWidget { @@ -26,7 +29,7 @@ KDDW.MainWindow { KDDW.DockWidget { id: dock4 - uniqueName: "dock4" + uniqueName: "dock4" // Each dock widget needs a unique id source: ":/Another.qml" } @@ -47,8 +50,4 @@ KDDW.MainWindow { } } } - - Component.onCompleted: { - root.init("MyWindowName-1"); - } } diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 112d2390..7c39dd77 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -158,8 +158,8 @@ if(${PROJECT_NAME}_QTQUICK) private/quick/RubberBandQuick.h private/quick/MainWindowQuick.cpp private/quick/MainWindowQuick_p.h - private/quick/MainWindowWrapper.cpp - private/quick/MainWindowWrapper_p.h + private/quick/MainWindowInstantiator.cpp + private/quick/MainWindowInstantiator_p.h private/multisplitter/Widget_quick.cpp private/multisplitter/Widget_quick.h private/multisplitter/Separator_quick.cpp diff --git a/src/private/quick/MainWindowInstantiator.cpp b/src/private/quick/MainWindowInstantiator.cpp new file mode 100644 index 00000000..52b6a5a3 --- /dev/null +++ b/src/private/quick/MainWindowInstantiator.cpp @@ -0,0 +1,85 @@ +/* + 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 "MainWindowInstantiator_p.h" +#include "MainWindowQuick_p.h" +#include "MainWindowMDI.h" + +#include "DockRegistry_p.h" + +using namespace KDDockWidgets; + +MainWindowInstantiator::MainWindowInstantiator() + : QWidgetAdapter() +{ +} + +QString MainWindowInstantiator::uniqueName() const +{ + return m_uniqueName; +} + +void MainWindowInstantiator::setUniqueName(const QString &name) +{ + if (name != m_uniqueName) { + m_uniqueName = name; + Q_EMIT uniqueNameChanged(); + } +} + +int MainWindowInstantiator::options() const +{ + return m_options; +} + +void MainWindowInstantiator::setOptions(int options) +{ + if (m_options != options) { + m_options = options; + Q_EMIT optionsChanged(); + } +} + +void MainWindowInstantiator::classBegin() +{ + // Nothing interesting to do here. +} + +void MainWindowInstantiator::componentComplete() +{ + if (m_uniqueName.isEmpty()) { + qWarning() << Q_FUNC_INFO + << "Each DockWidget need an unique name. Set the uniqueName property."; + return; + } + + // if (DockRegistry::self()->contains(m_uniqueName)) { + // Dock widget already exists. all good. + // return; + //} + + if (m_uniqueName.isEmpty()) { + qWarning() << Q_FUNC_INFO << "Name can't be empty"; + return; + } + + if (m_mainWindow) { + qWarning() << Q_FUNC_INFO << "Main window is already initialized"; + return; + } + + const auto mainWindowOptions = MainWindowOptions(m_options); + + if (mainWindowOptions & MainWindowOption_MDI) + m_mainWindow = new MainWindowMDI(m_uniqueName, this); + else + m_mainWindow = new MainWindowQuick(m_uniqueName, mainWindowOptions, this); +} diff --git a/src/private/quick/MainWindowWrapper_p.h b/src/private/quick/MainWindowInstantiator_p.h similarity index 58% rename from src/private/quick/MainWindowWrapper_p.h rename to src/private/quick/MainWindowInstantiator_p.h index a3c557be..5479fd2a 100644 --- a/src/private/quick/MainWindowWrapper_p.h +++ b/src/private/quick/MainWindowInstantiator_p.h @@ -12,8 +12,8 @@ #ifndef KD_MAIN_WINDOW_WRAPPER_P_H #define KD_MAIN_WINDOW_WRAPPER_P_H -#include "kddockwidgets/docks_export.h" #include "QWidgetAdapter.h" +#include "kddockwidgets/docks_export.h" #include @@ -23,18 +23,34 @@ class MainWindowQuick; /// @brief A wrapper to workaround the limitation that QtQuick can't pass arguments through MainWindowQuick's ctor /// So instead, user instantiates a MainWindowWrapper in QML and calls init. -class DOCKS_EXPORT MainWindowWrapper : public QWidgetAdapter +class DOCKS_EXPORT MainWindowInstantiator + : public QWidgetAdapter { Q_OBJECT + Q_PROPERTY(QString uniqueName READ uniqueName WRITE setUniqueName NOTIFY uniqueNameChanged) + Q_PROPERTY(int options READ options WRITE setOptions NOTIFY optionsChanged) // TODO: Use num public: ///@brief ctor, called by QML engine - MainWindowWrapper(); + MainWindowInstantiator(); - ///@brief called by the user, typically in main.qml or so, in Component.onCompleted{} - Q_INVOKABLE void init(const QString &uniqueName, int options = 0); + QString uniqueName() const; + void setUniqueName(const QString &); + + int options() const; + void setOptions(int); + +protected: + void classBegin() override; + void componentComplete() override; + +Q_SIGNALS: + void uniqueNameChanged(); + void optionsChanged(); private: + QString m_uniqueName; MainWindowQuick *m_mainWindow = nullptr; + int m_options = 0; }; } diff --git a/src/private/quick/MainWindowWrapper.cpp b/src/private/quick/MainWindowWrapper.cpp deleted file mode 100644 index 484cbf35..00000000 --- a/src/private/quick/MainWindowWrapper.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/* - 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 "MainWindowWrapper_p.h" -#include "MainWindowQuick_p.h" -#include "MainWindowMDI.h" - -using namespace KDDockWidgets; - -MainWindowWrapper::MainWindowWrapper() - : QWidgetAdapter() -{ -} - -void MainWindowWrapper::init(const QString &uniqueName, int options) -{ - if (uniqueName.isEmpty()) { - qWarning() << Q_FUNC_INFO << "Name can't be empty"; - return; - } - - if (m_mainWindow) { - qWarning() << Q_FUNC_INFO << "Main window is already initialized"; - return; - } - - const auto mainWindowOptions = MainWindowOptions(options); - - if (mainWindowOptions & MainWindowOption_MDI) - m_mainWindow = new MainWindowMDI(uniqueName, this); - else - m_mainWindow = new MainWindowQuick(uniqueName, mainWindowOptions, this); -} diff --git a/src/private/quick/QmlTypes.cpp b/src/private/quick/QmlTypes.cpp index 7f0543a9..f16d284a 100644 --- a/src/private/quick/QmlTypes.cpp +++ b/src/private/quick/QmlTypes.cpp @@ -17,7 +17,7 @@ #include "TitleBar_p.h" #include "indicators/ClassicIndicators_p.h" #include "quick/DockWidgetInstantiator_p.h" -#include "quick/MainWindowWrapper_p.h" +#include "quick/MainWindowInstantiator_p.h" #include #include @@ -25,7 +25,7 @@ void KDDockWidgets::registerQmlTypes() { qmlRegisterType("com.kdab.dockwidgets", 1, 0, "DropAreaWithCentralFrame"); - qmlRegisterType("com.kdab.dockwidgets", 1, 0, "MainWindow"); + qmlRegisterType("com.kdab.dockwidgets", 1, 0, "MainWindow"); qmlRegisterType("com.kdab.dockwidgets", 1, 0, "DockWidget"); qmlRegisterUncreatableType("com.kdab.dockwidgets", 1, 0, "TitleBar", QStringLiteral("Enum access only"));