From 6ffd3e574f2b33d3804c7aca9531173ca6fa7ed1 Mon Sep 17 00:00:00 2001 From: Sergio Martins Date: Thu, 8 Apr 2021 23:23:24 +0100 Subject: [PATCH] qtquick: Add support for LayoutSaver You can now instantiate LayoutSaver {} in QML and save/restore layouts --- examples/qtquick/dockwidgets/main.qml | 18 ++++++++ src/CMakeLists.txt | 2 + src/private/quick/LayoutSaverInstantiator.cpp | 44 ++++++++++++++++++ src/private/quick/LayoutSaverInstantiator_p.h | 45 +++++++++++++++++++ src/private/quick/LayoutSaverQuick.cpp | 24 ---------- src/private/quick/QmlTypes.cpp | 2 + 6 files changed, 111 insertions(+), 24 deletions(-) create mode 100644 src/private/quick/LayoutSaverInstantiator.cpp create mode 100644 src/private/quick/LayoutSaverInstantiator_p.h delete mode 100644 src/private/quick/LayoutSaverQuick.cpp diff --git a/examples/qtquick/dockwidgets/main.qml b/examples/qtquick/dockwidgets/main.qml index 3f6125f7..ef38cb48 100644 --- a/examples/qtquick/dockwidgets/main.qml +++ b/examples/qtquick/dockwidgets/main.qml @@ -22,6 +22,20 @@ ApplicationWindow { Menu { title: qsTr("&File") + Action { + text: qsTr("Save layout") + onTriggered: { + layoutSaver.saveToFile("mySavedLayout.json"); + } + } + + Action { + text: qsTr("Restore layout") + onTriggered: { + layoutSaver.restoreFromFile("mySavedLayout.json"); + } + } + Action { text: qsTr("Toggle widget #4") onTriggered: { @@ -90,6 +104,10 @@ ApplicationWindow { } } + KDDW.LayoutSaver { + id: layoutSaver + } + function toggleDockWidget(dw) { if (dw.dockWidget.visible) { dw.dockWidget.close(); diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7c39dd77..489e0dae 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -154,6 +154,8 @@ if(${PROJECT_NAME}_QTQUICK) private/quick/QmlTypes.h private/quick/FrameQuick.cpp private/quick/FrameQuick_p.h + private/quick/LayoutSaverInstantiator.cpp + private/quick/LayoutSaverInstantiator_p.h private/quick/RubberBandQuick.cpp private/quick/RubberBandQuick.h private/quick/MainWindowQuick.cpp diff --git a/src/private/quick/LayoutSaverInstantiator.cpp b/src/private/quick/LayoutSaverInstantiator.cpp new file mode 100644 index 00000000..aa9f59fb --- /dev/null +++ b/src/private/quick/LayoutSaverInstantiator.cpp @@ -0,0 +1,44 @@ +/* + 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. +*/ + +/** + * @file + * @brief The GUI counterpart of Frame. + * + * @author Sérgio Martins \ + */ + +#include "LayoutSaverInstantiator_p.h" + + +using namespace KDDockWidgets; + +LayoutSaverInstantiator::LayoutSaverInstantiator(QObject *parent) + : QObject(parent) + , LayoutSaver() +{ + +} + +LayoutSaverInstantiator::~LayoutSaverInstantiator() +{ + +} + +bool LayoutSaverInstantiator::saveToFile(const QString &jsonFilename) +{ + return LayoutSaver::saveToFile(jsonFilename); +} + +bool LayoutSaverInstantiator::restoreFromFile(const QString &jsonFilename) +{ + return LayoutSaver::restoreFromFile(jsonFilename); +} diff --git a/src/private/quick/LayoutSaverInstantiator_p.h b/src/private/quick/LayoutSaverInstantiator_p.h new file mode 100644 index 00000000..fe76907a --- /dev/null +++ b/src/private/quick/LayoutSaverInstantiator_p.h @@ -0,0 +1,45 @@ +/* + 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 KD_LAYOUT_SAVER_INSTANTIATOR_P_H +#define KD_LAYOUT_SAVER_INSTANTIATOR_P_H + +#include "LayoutSaver.h" + +#include + +class QQuickItem; + +namespace KDDockWidgets { + + +/** + * @brief A QObject wrapper around LayoutSaver so it can be used in QML. + * Use it from QML, like: LayoutSaver { id: saver } + * For C++, just use KDDockWidgets::LayoutSaver directly + */ +class DOCKS_EXPORT LayoutSaverInstantiator + : public QObject + , public LayoutSaver +{ + Q_OBJECT +public: + explicit LayoutSaverInstantiator(QObject *parent = nullptr); + ~LayoutSaverInstantiator() override; + + Q_INVOKABLE bool saveToFile(const QString &jsonFilename); + Q_INVOKABLE bool restoreFromFile(const QString &jsonFilename); +}; + +} + +#endif diff --git a/src/private/quick/LayoutSaverQuick.cpp b/src/private/quick/LayoutSaverQuick.cpp deleted file mode 100644 index cefd16a3..00000000 --- a/src/private/quick/LayoutSaverQuick.cpp +++ /dev/null @@ -1,24 +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 "LayoutSaver.h" - -// TODO: Temporary, until LayoutSaver.cpp is ported to QtQuick - -using namespace KDDockWidgets; - -LayoutSaver::LayoutSaver(RestoreOptions) : d(nullptr) {} -LayoutSaver::~LayoutSaver() {} - -bool LayoutSaver::saveToFile(const QString &) { return false; } -bool LayoutSaver::restoreFromFile(const QString &) { return false; } - -bool LayoutSaver::restoreInProgress() { return false; } diff --git a/src/private/quick/QmlTypes.cpp b/src/private/quick/QmlTypes.cpp index 7a1d9f6f..d8b2f602 100644 --- a/src/private/quick/QmlTypes.cpp +++ b/src/private/quick/QmlTypes.cpp @@ -18,6 +18,7 @@ #include "indicators/ClassicIndicators_p.h" #include "quick/DockWidgetInstantiator_p.h" #include "quick/MainWindowInstantiator_p.h" +#include "quick/LayoutSaverInstantiator_p.h" #include #include @@ -27,6 +28,7 @@ void KDDockWidgets::registerQmlTypes() qmlRegisterType("com.kdab.dockwidgets", 1, 0, "DropAreaWithCentralFrame"); qmlRegisterType("com.kdab.dockwidgets", 1, 0, "MainWindowLayout"); qmlRegisterType("com.kdab.dockwidgets", 1, 0, "DockWidget"); + qmlRegisterType("com.kdab.dockwidgets", 1, 0, "LayoutSaver"); qmlRegisterUncreatableType("com.kdab.dockwidgets", 1, 0, "TitleBar", QStringLiteral("Enum access only")); qmlRegisterUncreatableType("com.kdab.dockwidgets", 1, 0, "DropIndicatorOverlayInterface", QStringLiteral("Enum access only"));