diff options
author | Volker Krause <vkrause@kde.org> | 2022-02-14 18:12:24 +0100 |
---|---|---|
committer | Volker Krause <vkrause@kde.org> | 2022-02-24 16:43:05 +0000 |
commit | f446af2aa592997f6bc4aa3b5559cf477f9259f8 (patch) | |
tree | 884ce1c859da42351fd9b286680d5d15e916b6d8 /autotests | |
parent | 1067eed52a8a1a93581744a5c9d4fc9f8a7d3661 (diff) | |
download | kconfig-f446af2aa592997f6bc4aa3b5559cf477f9259f8.tar.gz kconfig-f446af2aa592997f6bc4aa3b5559cf477f9259f8.tar.bz2 |
Add KWindowStateSaver
This is basically the C++ counter-part to
https://invent.kde.org/frameworks/kconfig/-/merge_requests/94
and allows to easily retrofit window size persistence on existing windows/
dialogs, replacing e.g. code like
https://invent.kde.org/pim/pimcommon/-/blob/master/src/pimcommon/widgets/kpimprintpreviewdialog.cpp.
This is a bit more complicated than one might expect, as KWindowConfig
works with QWindows, but that's something freshly created QWidget windows/
dialogs don't have yet. Additionally, we are in a library here that doesn't
depend on Qt::Widgets. To overcome this we move the widget-dependent code
(basically just a call to QWidget::windowHandle()) to inline template code
(and thus into the consumer), use std::function's type erasure to pass it
into the library code, and an event filter on the widget to wait for the
QWindow to become available.
Diffstat (limited to 'autotests')
-rw-r--r-- | autotests/CMakeLists.txt | 5 | ||||
-rw-r--r-- | autotests/kwindowstatesavertest.cpp | 90 |
2 files changed, 95 insertions, 0 deletions
diff --git a/autotests/CMakeLists.txt b/autotests/CMakeLists.txt index 7b5a73b1..458f8f97 100644 --- a/autotests/CMakeLists.txt +++ b/autotests/CMakeLists.txt @@ -82,3 +82,8 @@ if (NOT CMAKE_CROSSCOMPILING) add_subdirectory(kconfig_compiler) endif() endif() + +find_package(Qt${QT_MAJOR_VERSION} OPTIONAL_COMPONENTS Widgets) +if (TARGET Qt${QT_MAJOR_VERSION}::Widgets) + ecm_add_test(kwindowstatesavertest.cpp LINK_LIBRARIES KF5::ConfigGui Qt${QT_MAJOR_VERSION}::Test Qt${QT_MAJOR_VERSION}::Widgets) +endif() diff --git a/autotests/kwindowstatesavertest.cpp b/autotests/kwindowstatesavertest.cpp new file mode 100644 index 00000000..a8b67218 --- /dev/null +++ b/autotests/kwindowstatesavertest.cpp @@ -0,0 +1,90 @@ +/* + SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org> + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "kwindowstatesaver.h" +#include "kconfiggroup.h" +#include "ksharedconfig.h" + +#include <QSignalSpy> +#include <QStandardPaths> +#include <QTest> + +#include <QFontDialog> + +class KWindowStateSaverTest : public QObject +{ + Q_OBJECT +private Q_SLOTS: + void initTestCase(); + void testTopLevelDialog(); + void testSubDialog(); +}; + +void KWindowStateSaverTest::initTestCase() +{ + QStandardPaths::setTestModeEnabled(true); +} + +void KWindowStateSaverTest::testTopLevelDialog() +{ + auto cfg = KSharedConfig::openStateConfig(); + cfg->deleteGroup("topLevelDialogTest"); + QSize dlgSize(720, 720); + + { + QFontDialog dlg; + new KWindowStateSaver(&dlg, "topLevelDialogTest"); + dlg.show(); + QTest::qWait(10); // give the window time to show up, so we simulate a user-triggered resize + dlg.resize(dlgSize); + QTest::qWait(500); // give the state saver time to trigger + QCOMPARE(dlg.size(), dlgSize); + } + + QVERIFY(cfg->hasGroup("topLevelDialogTest")); + + { + QFontDialog dlg; + new KWindowStateSaver(&dlg, "topLevelDialogTest"); + dlg.show(); + QTest::qWait(100); // give the window time to show up properly + QCOMPARE(dlg.size(), dlgSize); + } +} + +void KWindowStateSaverTest::testSubDialog() +{ + QWidget mainWindow; + mainWindow.show(); + QTest::qWait(10); + + auto cfg = KSharedConfig::openStateConfig(); + cfg->deleteGroup("subDialogTest"); + QSize dlgSize(700, 500); + + { + auto dlg = new QFontDialog(&mainWindow); + new KWindowStateSaver(dlg, "subDialogTest"); + dlg->show(); + QTest::qWait(10); // give the window time to show up, so we simulate a user-triggered resize + dlg->resize(dlgSize); + QTest::qWait(500); // give the state saver time to trigger + QCOMPARE(dlg->size(), dlgSize); + delete dlg; + } + + QVERIFY(cfg->hasGroup("subDialogTest")); + + { + auto dlg = new QFontDialog(&mainWindow); + new KWindowStateSaver(dlg, "subDialogTest"); + dlg->show(); + QTest::qWait(100); // give the window time to show up properly + QCOMPARE(dlg->size(), dlgSize); + } +} + +QTEST_MAIN(KWindowStateSaverTest) +#include "kwindowstatesavertest.moc" |