diff --git a/examples/qtquick/customtabbar/MyTabBar.qml b/examples/qtquick/customtabbar/MyTabBar.qml index 797a8af9c..b9c305a98 100644 --- a/examples/qtquick/customtabbar/MyTabBar.qml +++ b/examples/qtquick/customtabbar/MyTabBar.qml @@ -53,7 +53,7 @@ KDDW.TabBarBase { onPressed: { /// Do not use random uuids if you're planing to use layout save/restore! /// Using them here for convenience of the exercise - var uniqueName = _kddwHelpers.generateUuid(); + var uniqueName = Singletons.helpers.generateUuid(); var code = `import com.kdab.dockwidgets 2.0 as KDDW; import QtQuick 2.6; diff --git a/examples/qtquick/dockwidgets/main.qml b/examples/qtquick/dockwidgets/main.qml index 272f7eb39..206c03d8f 100644 --- a/examples/qtquick/dockwidgets/main.qml +++ b/examples/qtquick/dockwidgets/main.qml @@ -62,7 +62,7 @@ ApplicationWindow { onTriggered: { /// Do not use random uuids if you're planing to use layout save/restore! /// Using them here for convenience of the exercise - var uniqueName = _kddwHelpers.generateUuid(); + var uniqueName = KDDW.Singletons.helpers.generateUuid(); var code = `import com.kdab.dockwidgets 2.0 as KDDW; import QtQuick 2.6; diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index cbaa161e6..c8562e578 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -531,6 +531,13 @@ if(KDDW_FRONTEND_QTQUICK) set(QT_QML_GENERATE_QMLLS_INI ON) set(KDDW_MODULE_QML_ELEMENTS + qtquick/Singletons.cpp + qtquick/Singletons_p.h + qtquick/Helpers.cpp + qtquick/Helpers_p.h + qtquick/ViewFactory.cpp + qtquick/ViewFactory.h + core/ViewFactory.h qtquick/MainWindowInstantiator.cpp qtquick/MainWindowInstantiator.h qtquick/LayoutSaverInstantiator.cpp diff --git a/src/core/DockRegistry.h b/src/core/DockRegistry.h index 1082b38d4..54030b3f7 100644 --- a/src/core/DockRegistry.h +++ b/src/core/DockRegistry.h @@ -47,7 +47,8 @@ class MainWindowMDI; class DOCKS_EXPORT DockRegistry : public Core::Object, public Core::EventFilterInterface { Q_OBJECT - + QML_ELEMENT + QML_UNCREATABLE("Created by the framework only.") public: enum class DockByNameFlag { None = 0, @@ -61,7 +62,7 @@ class DOCKS_EXPORT DockRegistry : public Core::Object, public Core::EventFilterI static DockRegistry *self(); static bool isInitialized(); - ~DockRegistry(); + ~DockRegistry() override; void registerDockWidget(Core::DockWidget *); void unregisterDockWidget(Core::DockWidget *); diff --git a/src/core/ViewFactory.h b/src/core/ViewFactory.h index 539513f6a..3d5332caf 100644 --- a/src/core/ViewFactory.h +++ b/src/core/ViewFactory.h @@ -56,6 +56,8 @@ class TitleBar; class DOCKS_EXPORT ViewFactory : public Core::Object { Q_OBJECT + QML_ELEMENT + QML_UNCREATABLE("Created by the framework only.") public: ViewFactory() = default; diff --git a/src/qtquick/Helpers_p.h b/src/qtquick/Helpers_p.h index 7bcb9e145..ce4b497f4 100644 --- a/src/qtquick/Helpers_p.h +++ b/src/qtquick/Helpers_p.h @@ -12,7 +12,7 @@ #ifndef KD_QTQUICK_HELPERS_P_H #define KD_QTQUICK_HELPERS_P_H -#include +#include #include @@ -26,6 +26,8 @@ namespace KDDockWidgets { class QtQuickHelpers : public QObject { Q_OBJECT + QML_ELEMENT + QML_UNCREATABLE("Created by the framework only.") Q_PROPERTY( QObject *groupViewInMDIResize READ groupViewInMDIResize NOTIFY groupInMDIResizeChanged) diff --git a/src/qtquick/Platform.cpp b/src/qtquick/Platform.cpp index 7bb0edc23..6875efa4f 100644 --- a/src/qtquick/Platform.cpp +++ b/src/qtquick/Platform.cpp @@ -266,3 +266,8 @@ Core::DockWidget *Platform::dockWidgetForItem(QQuickItem *item) return nullptr; } + +QtQuickHelpers *Platform::helpers() const +{ + return m_qquickHelpers; +} diff --git a/src/qtquick/Platform.h b/src/qtquick/Platform.h index 5f6d2698c..4dfc3c479 100644 --- a/src/qtquick/Platform.h +++ b/src/qtquick/Platform.h @@ -56,6 +56,8 @@ class DOCKS_EXPORT Platform : public QtCommon::Platform_qt void ungrabMouse() override; void onViewFactoryChanged() override; + QtQuickHelpers *helpers() const; + static Platform *instance(); static Core::DockWidget *dockWidgetForItem(QQuickItem *); diff --git a/src/qtquick/QmlTypes.cpp b/src/qtquick/QmlTypes.cpp index 3c2d9735f..9b5000f69 100644 --- a/src/qtquick/QmlTypes.cpp +++ b/src/qtquick/QmlTypes.cpp @@ -14,6 +14,7 @@ #include "MainWindowInstantiator.h" #include "MainWindowMDIInstantiator.h" #include "LayoutSaverInstantiator.h" +#include "Singletons_p.h" #include "views/Group.h" #include "views/TitleBar.h" @@ -50,4 +51,8 @@ void KDDockWidgets::registerQmlTypes() qmlRegisterUncreatableType("com.kdab.dockwidgets", 2, 0, "DockWidgetModel", QStringLiteral("Internal usage only")); + + qmlRegisterSingletonType("com.kdab.dockwidgets", 2, 0, "Singletons", [](QQmlEngine *, QJSEngine *) -> QObject * { + return new QtQuick::Singletons(); + }); } diff --git a/src/qtquick/QmlTypes.h b/src/qtquick/QmlTypes.h index 7e32cab63..75521ce43 100644 --- a/src/qtquick/QmlTypes.h +++ b/src/qtquick/QmlTypes.h @@ -20,6 +20,9 @@ #define KD_QMLTYPES_H namespace KDDockWidgets { +// This is only called for: +// Qt5 +// Qt6 if KDDockWidgets_QML_MODULE=OFF void registerQmlTypes(); } diff --git a/src/qtquick/Singletons.cpp b/src/qtquick/Singletons.cpp new file mode 100644 index 000000000..f22bc30de --- /dev/null +++ b/src/qtquick/Singletons.cpp @@ -0,0 +1,40 @@ +/* + This file is part of KDDockWidgets. + + SPDX-FileCopyrightText: 2025 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 "Singletons_p.h" +#include "ViewFactory.h" +#include "core/DockRegistry.h" +#include "core/DockWidget.h" +#include "Platform.h" +#include "Helpers_p.h" + +using namespace KDDockWidgets::QtQuick; + +Singletons::~Singletons() = default; + +KDDockWidgets::QtQuick::ViewFactory *Singletons::widgetFactory() const +{ + return QtQuick::ViewFactory::self(); +} + +KDDockWidgets::DockRegistry *Singletons::dockRegistry() const +{ + return DockRegistry::self(); +} + +KDDockWidgets::QtQuickHelpers *Singletons::helpers() const +{ + if (auto plat = QtQuick::Platform::instance()) { + return plat->helpers(); + } + + return nullptr; +} diff --git a/src/qtquick/Singletons_p.h b/src/qtquick/Singletons_p.h new file mode 100644 index 000000000..c7f686c10 --- /dev/null +++ b/src/qtquick/Singletons_p.h @@ -0,0 +1,37 @@ +/* + This file is part of KDDockWidgets. + + SPDX-FileCopyrightText: 2025 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. +*/ + +#pragma once + +#include "Helpers_p.h" +#include "ViewFactory.h" +#include "core/DockRegistry.h" + +#include + +namespace KDDockWidgets::QtQuick { + +class Singletons : public QObject +{ + Q_OBJECT + QML_ELEMENT + QML_SINGLETON + Q_PROPERTY(KDDockWidgets::QtQuick::ViewFactory *widgetFactory READ widgetFactory CONSTANT) + Q_PROPERTY(KDDockWidgets::DockRegistry *dockRegistry READ dockRegistry CONSTANT) + Q_PROPERTY(KDDockWidgets::QtQuickHelpers *helpers READ helpers CONSTANT) +public: + ~Singletons() override; + KDDockWidgets::QtQuick::ViewFactory *widgetFactory() const; + KDDockWidgets::DockRegistry *dockRegistry() const; + KDDockWidgets::QtQuickHelpers *helpers() const; +}; + +} diff --git a/src/qtquick/ViewFactory.h b/src/qtquick/ViewFactory.h index c7e257330..bf1297d77 100644 --- a/src/qtquick/ViewFactory.h +++ b/src/qtquick/ViewFactory.h @@ -14,6 +14,8 @@ #include "kddockwidgets/core/ViewFactory.h" +#include + // clazy:excludeall=ctor-missing-parent-argument /** @@ -49,6 +51,7 @@ namespace QtQuick { class DOCKS_EXPORT ViewFactory : public Core::ViewFactory { Q_OBJECT + QML_ELEMENT public: ViewFactory() = default; ~ViewFactory() override; diff --git a/src/qtquick/views/qml/FloatingWindow.qml b/src/qtquick/views/qml/FloatingWindow.qml index 102a95c05..c50f20ba0 100644 --- a/src/qtquick/views/qml/FloatingWindow.qml +++ b/src/qtquick/views/qml/FloatingWindow.qml @@ -39,7 +39,7 @@ Rectangle { id: titleBar readonly property TitleBarView titleBarCpp: root.titleBarCpp readonly property int heightWhenVisible: item.heightWhenVisible // qmllint disable missing-property - source: _kddw_widgetFactory.titleBarFilename() + source: Singletons.widgetFactory.titleBarFilename() anchors { top: parent ? parent.top : undefined diff --git a/src/qtquick/views/qml/Group.qml b/src/qtquick/views/qml/Group.qml index eec4024ff..d6042d767 100644 --- a/src/qtquick/views/qml/Group.qml +++ b/src/qtquick/views/qml/Group.qml @@ -22,7 +22,7 @@ Rectangle { property int titleBarContentsMargin: 1 property int mouseResizeMargin: 8 readonly property bool isMDI: groupCpp && groupCpp.isMDI - readonly property bool resizeAllowed: root.isMDI && !_kddwHelpers.isDragging && _kddwDockRegistry && (!_kddwHelpers.groupViewInMDIResize || _kddwHelpers.groupViewInMDIResize === groupCpp) + readonly property bool resizeAllowed: root.isMDI && !Singletons.helpers.isDragging && Singletons.dockRegistry && (!Singletons.helpers.groupViewInMDIResize || Singletons.helpers.groupViewInMDIResize === groupCpp) property alias tabBarHeight: tabbar.height readonly property bool hasCustomMouseEventRedirector: false readonly property bool isFixedHeight: groupCpp && groupCpp.isFixedHeight @@ -176,7 +176,7 @@ Rectangle { Loader { id: titleBar readonly property QtObject titleBarCpp: root.titleBarCpp - source: groupCpp ? _kddw_widgetFactory.titleBarFilename() : "" + source: groupCpp ? Singletons.widgetFactory.titleBarFilename() : "" anchors { top: parent ? parent.top : undefined @@ -193,7 +193,7 @@ Rectangle { readonly property GroupView groupCpp: root.groupCpp readonly property bool hasCustomMouseEventRedirector: root.hasCustomMouseEventRedirector - source: groupCpp ? _kddw_widgetFactory.tabbarFilename() : "" + source: groupCpp ? Singletons.widgetFactory.tabbarFilename() : "" function topAnchor() { if (root.tabsAtTop) {