diff --git a/src/private/FloatingWindow.cpp b/src/private/FloatingWindow.cpp index 8c7987c7..9cc01cab 100644 --- a/src/private/FloatingWindow.cpp +++ b/src/private/FloatingWindow.cpp @@ -488,6 +488,8 @@ bool FloatingWindow::event(QEvent *ev) } else if (ev->type() == QEvent::StatusTip && parent()) { // show status tips in the main window return parent()->event(ev); + } else if (ev->type() == QEvent::LayoutRequest) { + updateSizeConstraints(); } return QWidgetAdapter::event(ev); @@ -562,6 +564,10 @@ void FloatingWindow::updateSizeConstraints() { // Doing a delayed call to make sure the layout has completled any ongoing operation. QMetaObject::invokeMethod(this, [this] { + // Not simply using layout's max-size support because + // 1) that's not portable to QtQuick + // 2) QStackedLayout (from tab-widget) doesn't propagate size constraints up + // Doing it manually instead. setMaximumSize(maxSizeHint()); }, Qt::QueuedConnection); } diff --git a/tests/tst_docks.cpp b/tests/tst_docks.cpp index cf112565..5ad2f8fb 100644 --- a/tests/tst_docks.cpp +++ b/tests/tst_docks.cpp @@ -228,6 +228,7 @@ private Q_SLOTS: void tst_titlebar_getter(); void tst_raise(); void tst_addingOptionHiddenTabbed(); + void tst_maxSizedFloatingWindow(); void tst_maxSizedHonouredAfterRemoved(); void tst_addDockWidgetAsTabToDockWidget(); void tst_close(); @@ -6407,6 +6408,42 @@ void TestDocks::tst_flagDoubleClick() } } +void TestDocks::tst_maxSizedFloatingWindow() +{ + // Tests that FloatingWindows get a proper max-size, if its dock widget has one + EnsureTopLevelsDeleted e; + auto dock1 = new DockWidgetType("dock1"); + auto dock2 = new DockWidgetType("dock2"); + auto w = new MyWidget("foo"); + w->setMinimumSize(120, 100); + w->setMaximumSize(300, 300); + dock1->setWidget(w); + + dock1->show(); + dock2->show(); + + auto window1 = dock1->window(); + auto window2 = dock2->window(); + Testing::waitForEvent(window1, QEvent::LayoutRequest); + + QVERIFY(window1->maximumSize().width() < 500); + QVERIFY(window1->maximumSize().height() < 500); + QVERIFY(window2->maximumSize().width() > 500); + QVERIFY(window2->maximumSize().height() > 500); + + // Adding side-by-side, we don't honour max size (yet) + dock1->addDockWidgetToContainingWindow(dock2, Location_OnBottom); + Testing::waitForEvent(window1, QEvent::LayoutRequest); + QVERIFY(window1->maximumSize().width() > 500); + QVERIFY(window1->maximumSize().height() > 500); + + // Close dw2, we have a single dock widget again, we honour max-size + dock2->close(); + Testing::waitForEvent(window1, QEvent::LayoutRequest); + QVERIFY(window1->maximumSize().width() < 500); + QVERIFY(window1->maximumSize().height() < 500); +} + void TestDocks::tst_maxSizedHonouredAfterRemoved() { EnsureTopLevelsDeleted e;