diff --git a/autotests/CMakeLists.txt b/autotests/CMakeLists.txt index 18dedada7..1ae30108f 100644 --- a/autotests/CMakeLists.txt +++ b/autotests/CMakeLists.txt @@ -58,3 +58,9 @@ ecm_add_test( LINK_LIBRARIES neochat Qt::Test TEST_NAME actionshandlertest ) + +ecm_add_test( + windowcontrollertest.cpp + LINK_LIBRARIES neochat Qt::Test + TEST_NAME windowcontrollertest +) diff --git a/autotests/windowcontrollertest.cpp b/autotests/windowcontrollertest.cpp new file mode 100644 index 000000000..3f760e539 --- /dev/null +++ b/autotests/windowcontrollertest.cpp @@ -0,0 +1,102 @@ +// SPDX-FileCopyrightText: 2023 James Graham +// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL + +#include +#include +#include + +#include +#include +#include + +#include "windowcontroller.h" + +class WindowControllerTest : public QObject +{ + Q_OBJECT + +private Q_SLOTS: + void nullWindow(); + void geometry(); + void showAndRaise(); + void toggle(); + + void cleanup(); +}; + +// Basically don't crash when no window is set. +void WindowControllerTest::nullWindow() +{ + auto &instance = WindowController::instance(); + QCOMPARE(instance.window(), nullptr); + + instance.restoreGeometry(); + instance.saveGeometry(); + instance.showAndRaiseWindow({}); + instance.toggleWindow(); +} + +void WindowControllerTest::geometry() +{ + auto &instance = WindowController::instance(); + + QWindow window; + window.setGeometry(0, 0, 200, 200); + instance.setWindow(&window); + QCOMPARE(instance.window(), &window); + + instance.saveGeometry(); + const auto stateConfig = KSharedConfig::openStateConfig(); + KConfigGroup windowGroup = stateConfig->group(QStringLiteral("Window")); + QCOMPARE(KWindowConfig::hasSavedWindowSize(windowGroup), true); + + window.setGeometry(0, 0, 400, 400); + QCOMPARE(window.geometry(), QRect(0, 0, 400, 400)); + instance.restoreGeometry(); + QCOMPARE(window.geometry(), QRect(0, 0, 200, 200)); +} + +void WindowControllerTest::showAndRaise() +{ + auto &instance = WindowController::instance(); + QWindow window; + instance.setWindow(&window); + QCOMPARE(window.isVisible(), false); + + instance.showAndRaiseWindow({}); + QCOMPARE(window.isVisible(), true); +} + +void WindowControllerTest::cleanup() +{ + auto &instance = WindowController::instance(); + instance.setWindow(nullptr); + QCOMPARE(instance.window(), nullptr); +} + +void WindowControllerTest::toggle() +{ + auto &instance = WindowController::instance(); + QWindow window; + instance.setWindow(&window); + QCOMPARE(window.isVisible(), false); + instance.toggleWindow(); + QCOMPARE(window.isVisible(), true); + instance.toggleWindow(); + QCOMPARE(window.isVisible(), false); + + // A window is classed as visible by qt when minimized but to the user this is not visible. + // So in this case we expect to show it even though visibility is technically true. + window.setVisibility(QWindow::Minimized); + QCOMPARE(window.windowState(), Qt::WindowMinimized); + QCOMPARE(window.isVisible(), true); + instance.toggleWindow(); + QCOMPARE(window.windowState(), Qt::WindowNoState); + QCOMPARE(window.isVisible(), true); + instance.toggleWindow(); + QCOMPARE(window.windowState(), Qt::WindowNoState); + QCOMPARE(window.isVisible(), false); +} + +QTEST_MAIN(WindowControllerTest) +#include "windowcontrollertest.moc" diff --git a/src/windowcontroller.cpp b/src/windowcontroller.cpp index 97237d02c..b83cde861 100644 --- a/src/windowcontroller.cpp +++ b/src/windowcontroller.cpp @@ -56,6 +56,9 @@ void WindowController::saveGeometry() void WindowController::showAndRaiseWindow(const QString &startupId) { + if (m_window == nullptr) { + return; + } if (!m_window->isVisible()) { m_window->show(); restoreGeometry(); @@ -104,6 +107,9 @@ void WindowController::setBlur(QQuickItem *item, bool blur) void WindowController::toggleWindow() { + if (m_window == nullptr) { + return; + } if (window()->isVisible()) { if (window()->windowStates() & Qt::WindowMinimized) { window()->showNormal();