From 8224d3ae9ffeaea6c3ddade9055cb19b655f2853 Mon Sep 17 00:00:00 2001 From: Carl Schwan Date: Wed, 30 Dec 2020 13:19:16 +0000 Subject: [PATCH] Save and restore window size --- qml/main.qml | 18 ++++++++++++++++++ src/controller.cpp | 14 ++++++++++++-- src/controller.h | 2 ++ src/main.cpp | 12 ++++++++++++ 4 files changed, 44 insertions(+), 2 deletions(-) diff --git a/qml/main.qml b/qml/main.qml index 456ffc91d..dbafa5dc1 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -6,6 +6,7 @@ */ import QtQuick 2.14 import QtQuick.Controls 2.14 as QQC2 +import QtQuick.Window 2.2 import QtQuick.Layouts 1.14 import org.kde.kirigami 2.12 as Kirigami @@ -34,6 +35,23 @@ Kirigami.ApplicationWindow { } } + onClosing: Controller.saveWindowGeometry(root) + + // This timer allows to batch update the window size change to reduce + // the io load and also work around the fact that x/y/width/height are + // changed when loading the page and overwrite the saved geometry from + // the previous session. + Timer { + id: saveWindowGeometryTimer + interval: 1000 + onTriggered: Controller.saveWindowGeometry(root) + } + + onWidthChanged: saveWindowGeometryTimer.restart() + onHeightChanged: saveWindowGeometryTimer.restart() + onXChanged: saveWindowGeometryTimer.restart() + onYChanged: saveWindowGeometryTimer.restart() + /** * Manage opening and close rooms */ diff --git a/src/controller.cpp b/src/controller.cpp index 737259d96..9eaf3d5d7 100644 --- a/src/controller.cpp +++ b/src/controller.cpp @@ -8,15 +8,16 @@ #ifndef Q_OS_ANDROID #include -#else +#endif #include #include -#endif +#include #include #include #include +#include #include #include #include @@ -565,6 +566,15 @@ void Controller::setActiveConnection(Connection *connection) Q_EMIT activeConnectionChanged(); } +void Controller::saveWindowGeometry(QQuickWindow *window) +{ + KConfig dataResource("data", KConfig::SimpleConfig, QStandardPaths::AppDataLocation); + KConfigGroup windowGroup(&dataResource, "Window"); + KWindowConfig::saveWindowPosition(window, windowGroup); + KWindowConfig::saveWindowSize(window, windowGroup); + dataResource.sync(); +} + NeochatDeleteDeviceJob::NeochatDeleteDeviceJob(const QString &deviceId, const Omittable &auth) : Quotient::BaseJob(HttpVerb::Delete, QStringLiteral("DeleteDeviceJob"), QStringLiteral("/_matrix/client/r0/devices/%1").arg(deviceId)) { diff --git a/src/controller.h b/src/controller.h index 6bb8e98dd..25bd56b40 100644 --- a/src/controller.h +++ b/src/controller.h @@ -21,6 +21,7 @@ class QKeySequences; #include "user.h" class NeoChatRoom; +class QQuickWindow; using namespace Quotient; @@ -118,6 +119,7 @@ public Q_SLOTS: static void playAudio(const QUrl &localFile); void changeAvatar(Quotient::Connection *conn, const QUrl &localFile); static void markAllMessagesAsRead(Quotient::Connection *conn); + void saveWindowGeometry(QQuickWindow *); }; // TODO libQuotient 0.7: Drop diff --git a/src/main.cpp b/src/main.cpp index 6643939a7..05f253a7c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -19,6 +19,7 @@ #endif #include #include +#include #include "neochat-version.h" @@ -152,6 +153,17 @@ int main(int argc, char *argv[]) } } }); + const auto rootObjects = engine.rootObjects(); + for (auto obj : rootObjects) { + auto view = qobject_cast(obj); + if (view) { + KConfig dataResource("data", KConfig::SimpleConfig, QStandardPaths::AppDataLocation); + KConfigGroup windowGroup(&dataResource, "Window"); + KWindowConfig::restoreWindowSize(view, windowGroup); + KWindowConfig::restoreWindowPosition(view, windowGroup); + break; + } + } #endif return QApplication::exec(); }