/* This file is part of KDDockWidgets. SPDX-FileCopyrightText: 2019-2022 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 Here lives the tests that only apply to QtQuick #include "Platform.h" #include "kddockwidgets/KDDockWidgets.h" #include "qtquick/views/TitleBar_qtquick.h" #include "kddockwidgets/controllers/MainWindow.h" #include "../utils.h" #include "Window.h" #include #include using namespace KDDockWidgets; using namespace KDDockWidgets::Tests; using namespace KDDockWidgets::Controllers; class TestQtQuick : public QObject { Q_OBJECT public Q_SLOTS: void initTestCase(); void cleanupTestCase(); private Q_SLOTS: void tst_restoreRestoresMainWindowPosition(); void tst_hoverShowsDropIndicators(); void tst_titlebarNumDockWidgetsChanged(); }; void TestQtQuick::initTestCase() { KDDockWidgets::Platform::instance()->installMessageHandler(); } void TestQtQuick::cleanupTestCase() { KDDockWidgets::Platform::instance()->uninstallMessageHandler(); } void TestQtQuick::tst_restoreRestoresMainWindowPosition() { // Tests the ApplicationWindow {} case QQmlApplicationEngine engine(":/main2.qml"); const auto mainWindows = DockRegistry::self()->mainwindows(); QCOMPARE(mainWindows.size(), 1); MainWindow *mainWindow = mainWindows.first(); QVERIFY(mainWindow->isVisible()); QCOMPARE(mainWindow->pos(), QPoint(0, 0)); Window::Ptr window = mainWindow->view()->window(); LayoutSaver saver; const QByteArray saved = saver.serializeLayout(); const QPoint originalPos = window->framePosition(); const QPoint newPos = originalPos + QPoint(200, 200); window->setFramePosition(newPos); QCOMPARE(window->framePosition(), newPos); QVERIFY(saver.restoreLayout(saved)); QCOMPARE(window->framePosition(), originalPos); delete mainWindow; } void TestQtQuick::tst_hoverShowsDropIndicators() { // For QtQuick on Windows, there was a bug where drop indicators wouldn't be shown if // MainWindowBase wasn't the root item. EnsureTopLevelsDeleted e; QQmlApplicationEngine engine(":/main2.qml"); const auto mainWindows = DockRegistry::self()->mainwindows(); QCOMPARE(mainWindows.size(), 1); MainWindow *m = mainWindows.first(); m->window()->window()->setFramePosition(QPoint(500, 800)); auto dock0 = createDockWidget( "dock0", Platform::instance()->tests_createView({ true, {}, QSize(400, 400) })); auto floatingDockWidget = createDockWidget("floatingDockWidget", Platform::instance()->tests_createView({ true, {}, QSize(400, 400) })); m->addDockWidget(dock0, Location_OnLeft); const QPoint mainWindowCenterPos = m->mapToGlobal(m->geometry().center()); QTest::qWait(100); auto fw = floatingDockWidget->floatingWindow(); dragFloatingWindowTo(fw, mainWindowCenterPos); QCOMPARE(dock0->dptr()->group()->dockWidgetCount(), 2); } void TestQtQuick::tst_titlebarNumDockWidgetsChanged() { EnsureTopLevelsDeleted e; QQmlApplicationEngine engine(":/main2.qml"); auto dock0 = createDockWidget( "dock0", Platform::instance()->tests_createView({ true, {}, QSize(400, 400) })); const auto mainWindows = DockRegistry::self()->mainwindows(); MainWindow *m = mainWindows.first(); m->window()->window()->setFramePosition(QPoint(500, 800)); m->addDockWidget(dock0, Location_OnLeft); auto tb = dock0->titleBar(); auto tbView = static_cast(tb->view()); int numSignalEmittions = 0; connect(tbView, &Views::TitleBar_qtquick::numDockWidgetsChanged, [&numSignalEmittions] { numSignalEmittions++; }); auto dock1 = createDockWidget( "dock1", Platform::instance()->tests_createView({ true, {}, QSize(400, 400) })); dock0->addDockWidgetAsTab(dock1); QVERIFY(numSignalEmittions > 0); } int main(int argc, char *argv[]) { // Might be disabled by env var const auto frontends = Platform::instance()->frontendTypes(); if (std::find(frontends.cbegin(), frontends.cend(), FrontendType::QtQuick) == frontends.cend()) return 0; KDDockWidgets::Platform::tests_initPlatform(argc, argv, KDDockWidgets::FrontendType::QtQuick); TestQtQuick test; const int exitCode = QTest::qExec(&test, argc, argv); KDDockWidgets::Platform::tests_deinitPlatform(); return exitCode; } #include "tst_qtquick.moc"