Also update FloatingWindow's max size when children change constraints

A dock widget can change its max size later in life, so we need
to react to that
This commit is contained in:
Sergio Martins
2021-04-20 22:52:08 +01:00
parent ec6be7d1a5
commit 06b680f603
2 changed files with 43 additions and 0 deletions

View File

@@ -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);
}

View File

@@ -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;