From 397398dfd8361836210e178a4e73abd7bd31edd5 Mon Sep 17 00:00:00 2001 From: Nicolas Fella Date: Mon, 28 Jul 2025 20:17:37 +0200 Subject: [PATCH] Port to declarative type registration BUG: 507602 --- src/CMakeLists.txt | 2 + src/declarative/CMakeLists.txt | 5 ++- src/declarative/layershellqtplugin.cpp | 51 ------------------------ src/declarative/types.cpp | 49 +++++++++++++++++++++++ src/declarative/types.h | 55 ++++++++++++++++++++++++++ 5 files changed, 109 insertions(+), 53 deletions(-) delete mode 100644 src/declarative/layershellqtplugin.cpp create mode 100644 src/declarative/types.cpp create mode 100644 src/declarative/types.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 123c52b..0297871 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -5,6 +5,8 @@ remove_definitions(-DQT_NO_SIGNALS_SLOTS_KEYWORDS) add_library(LayerShellQtInterface) +qt6_extract_metatypes(LayerShellQtInterface) + if (Qt6_VERSION VERSION_GREATER_EQUAL "6.8.0") set(private_code_option "PRIVATE_CODE") endif() diff --git a/src/declarative/CMakeLists.txt b/src/declarative/CMakeLists.txt index 07bcda9..e8a13b3 100644 --- a/src/declarative/CMakeLists.txt +++ b/src/declarative/CMakeLists.txt @@ -4,7 +4,8 @@ ecm_add_qml_module(LayerShellQtQml URI "org.kde.layershell" VERSION 1.0 - SOURCES layershellqtplugin.cpp) + SOURCES types.h types.cpp + GENERATE_PLUGIN_SOURCE) target_link_libraries(LayerShellQtQml PRIVATE Qt::Qml LayerShellQtInterface) -ecm_finalize_qml_module(LayerShellQtQml DESTINATION ${KDE_INSTALL_QMLDIR}) \ No newline at end of file +ecm_finalize_qml_module(LayerShellQtQml DESTINATION ${KDE_INSTALL_QMLDIR}) diff --git a/src/declarative/layershellqtplugin.cpp b/src/declarative/layershellqtplugin.cpp deleted file mode 100644 index fc4ae00..0000000 --- a/src/declarative/layershellqtplugin.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 Aleix Pol Gonzalez - * - * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL - */ - -#include "../interfaces/window.h" -#include -#include - -QML_DECLARE_TYPEINFO(LayerShellQt::Window, QML_HAS_ATTACHED_PROPERTIES) - -class ExtQMargins -{ - QMargins m_margins; - Q_GADGET - Q_PROPERTY(int left READ left WRITE setLeft FINAL) - Q_PROPERTY(int right READ right WRITE setRight FINAL) - Q_PROPERTY(int top READ top WRITE setTop FINAL) - Q_PROPERTY(int bottom READ bottom WRITE setBottom FINAL) - QML_FOREIGN(QMargins) - QML_EXTENDED(ExtQMargins) -public: - ExtQMargins(const QMargins &margins); - int left() const { return m_margins.left(); } - void setLeft(int left) { m_margins.setLeft(left); } - - int right() const { return m_margins.right(); } - void setRight(int right) { m_margins.setRight(right); } - - int top() const { return m_margins.top(); } - void setTop(int top) { m_margins.setTop(top); } - - int bottom() const { return m_margins.bottom(); } - void setBottom(int bottom) { m_margins.setBottom(bottom); } -}; - -class Plugin : public QQmlExtensionPlugin -{ - Q_PLUGIN_METADATA(IID "org.kde.layershellqt") - Q_OBJECT -public: - void registerTypes(const char *uri) override - { - Q_ASSERT(QLatin1String(uri) == QLatin1String("org.kde.layershell")); - qmlRegisterType(uri, 1, 0, "Window"); - qmlRegisterExtendedUncreatableType(uri, 1, 0, "ExtQMargins", QStringLiteral("Only created from C++")); - } -}; - -#include "layershellqtplugin.moc" diff --git a/src/declarative/types.cpp b/src/declarative/types.cpp new file mode 100644 index 0000000..bd9447e --- /dev/null +++ b/src/declarative/types.cpp @@ -0,0 +1,49 @@ +/* + * SPDX-FileCopyrightText: 2023 Aleix Pol Gonzalez + * + * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL + */ + +#include "types.h" + +#if QT_VERSION < QT_VERSION_CHECK(6, 8, 1) +int QQmlMarginsValueType::left() const +{ + return m.left(); +} + +int QQmlMarginsValueType::top() const +{ + return m.top(); +} + +int QQmlMarginsValueType::right() const +{ + return m.right(); +} + +int QQmlMarginsValueType::bottom() const +{ + return m.bottom(); +} + +void QQmlMarginsValueType::setLeft(int left) +{ + m.setLeft(left); +} + +void QQmlMarginsValueType::setTop(int top) +{ + m.setTop(top); +} + +void QQmlMarginsValueType::setRight(int right) +{ + m.setRight(right); +} + +void QQmlMarginsValueType::setBottom(int bottom) +{ + m.setBottom(bottom); +} +#endif diff --git a/src/declarative/types.h b/src/declarative/types.h new file mode 100644 index 0000000..f10a1ed --- /dev/null +++ b/src/declarative/types.h @@ -0,0 +1,55 @@ +/* + * SPDX-FileCopyrightText: 2023 Aleix Pol Gonzalez + * + * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL + */ + +#include "../interfaces/window.h" +#include + +QML_DECLARE_TYPEINFO(LayerShellQt::Window, QML_HAS_ATTACHED_PROPERTIES) + +class WindowForeign +{ + Q_GADGET + QML_NAMED_ELEMENT(Window) + QML_FOREIGN(LayerShellQt::Window) + QML_UNCREATABLE("") + QML_ATTACHED(LayerShellQt::Window) +}; + +// available upstream since https://invent.kde.org/qt/qt/qtdeclarative/-/commit/a398101f715bfc447aa889fc9c58b13bfe75ab47 +#if QT_VERSION < QT_VERSION_CHECK(6, 8, 1) +struct Q_QML_EXPORT QQmlMarginsValueType { + QMargins m; + Q_PROPERTY(int left READ left WRITE setLeft FINAL) + Q_PROPERTY(int right READ right WRITE setRight FINAL) + Q_PROPERTY(int top READ top WRITE setTop FINAL) + Q_PROPERTY(int bottom READ bottom WRITE setBottom FINAL) + Q_GADGET + QML_ANONYMOUS + QML_FOREIGN(QMargins) + QML_EXTENDED(QQmlMarginsValueType) + QML_STRUCTURED_VALUE + +public: + QQmlMarginsValueType() = default; + Q_INVOKABLE QQmlMarginsValueType(const QMarginsF &margins) + : m(margins.toMargins()) + { + } + int left() const; + int right() const; + int top() const; + int bottom() const; + void setLeft(int); + void setRight(int); + void setTop(int); + void setBottom(int); + + operator QMargins() const + { + return m; + } +}; +#endif