From d5e46dff31b0a47d56557142268fcdd913b512b2 Mon Sep 17 00:00:00 2001 From: Sergio Martins Date: Sat, 18 Jun 2022 23:37:02 +0100 Subject: [PATCH] MDI: Fixed closing dock widget in MDI would close main window We only close the window when the window is a FloatingWindow and it's the last frame (cherry picked from commit 86419fd979c6c41791811f2c7ff428cde6b57731) --- src/controllers/TitleBar.cpp | 2 +- tests/qtwidgets/tst_qtwidgets.cpp | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/controllers/TitleBar.cpp b/src/controllers/TitleBar.cpp index ffa85f9c..ff49a41a 100644 --- a/src/controllers/TitleBar.cpp +++ b/src/controllers/TitleBar.cpp @@ -320,7 +320,7 @@ void TitleBar::onCloseClicked() qWarning() << Q_FUNC_INFO << "Frame with no dock widgets"; } } else { - if (m_frame->isTheOnlyFrame() && !m_frame->isInMainWindow()) { + if (m_frame->isTheOnlyFrame() && m_frame->isInFloatingWindow()) { m_frame->view()->closeRootView(); } else { m_frame->view()->close(); diff --git a/tests/qtwidgets/tst_qtwidgets.cpp b/tests/qtwidgets/tst_qtwidgets.cpp index 20ff769a..564cf962 100644 --- a/tests/qtwidgets/tst_qtwidgets.cpp +++ b/tests/qtwidgets/tst_qtwidgets.cpp @@ -35,6 +35,7 @@ #include "qtwidgets/views/MDIArea_qtwidgets.h" #include "qtwidgets/views/MainWindow_qtwidgets.h" #include "qtwidgets/views/ViewWrapper_qtwidgets.h" +#include "qtwidgets/views/DockWidget_qtwidgets.h" #include "Platform.h" #include @@ -133,6 +134,7 @@ private Q_SLOTS: void tst_mdi_mixed_with_docking2(); void tst_mdi_mixed_with_docking_setMDISize(); void tst_deleteOnClose(); + void tstCloseNestedMdi(); // But these are fine to be widget only: void tst_tabsNotClickable(); @@ -1487,6 +1489,27 @@ void TestQtWidgets::tst_deleteOnClose() saver.restoreLayout(saved); } +void TestQtWidgets::tstCloseNestedMdi() +{ + // Tests a bug where closing a mdi dock widget would close its main window too + EnsureTopLevelsDeleted e; + + auto m = createMainWindow(QSize(1000, 500), MainWindowOption_HasCentralWidget); + QPointer p = m.get(); + + auto mdi = new KDDockWidgets::Views::MDIArea_qtwidgets(); + m->setPersistentCentralView(mdi->asWrapper()); + + auto dock1 = new KDDockWidgets::Views::DockWidget_qtwidgets(QStringLiteral("MyDock1")); + dock1->setWidget(new QPushButton("1")); + + mdi->addDockWidget(dock1, {}); + + dock1->dockWidget()->titleBar()->onCloseClicked(); + QVERIFY(p); + QVERIFY(m->isVisible()); +} + void TestQtWidgets::initTestCase() { KDDockWidgets::Platform::instance()->installMessageHandler();