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:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user