From 22437e75c6370ce8a51e2c989e1e83d0f883e68a Mon Sep 17 00:00:00 2001 From: Sergio Martins Date: Sun, 22 Nov 2020 15:40:37 +0000 Subject: [PATCH] qtquick: Override min size for FrameQuick Fixes constriants not propagating from dock widget to frame --- src/private/quick/FrameQuick.cpp | 16 ++++++++++++++++ src/private/quick/FrameQuick_p.h | 7 +++++++ src/private/quick/qml/Frame.qml | 3 ++- tests/tst_docks.cpp | 24 ++++++++++++++++++++++-- 4 files changed, 47 insertions(+), 3 deletions(-) diff --git a/src/private/quick/FrameQuick.cpp b/src/private/quick/FrameQuick.cpp index 3fc96ced..ec29857d 100644 --- a/src/private/quick/FrameQuick.cpp +++ b/src/private/quick/FrameQuick.cpp @@ -162,6 +162,22 @@ void FrameQuick::setStackLayout(QQuickItem *stackLayout) m_stackLayout = stackLayout; } +QSize FrameQuick::minimumSize() const +{ + const QSize contentsSize = dockWidgetsMinSize(); + return contentsSize + QSize(0, nonContentsHeight()); +} + +QSize FrameQuick::maximumSize() const +{ + return Frame::maximumSize(); +} + +int FrameQuick::nonContentsHeight() const +{ + return m_visualItem->property("nonContentsHeight").toInt(); +} + DockWidgetModel::DockWidgetModel(QObject *parent) : QAbstractListModel(parent) { diff --git a/src/private/quick/FrameQuick_p.h b/src/private/quick/FrameQuick_p.h index 8e8ea512..27f520fa 100644 --- a/src/private/quick/FrameQuick_p.h +++ b/src/private/quick/FrameQuick_p.h @@ -36,6 +36,12 @@ public: ~FrameQuick() override; DockWidgetModel *dockWidgetModel() const; + /// @reimp + QSize minimumSize() const override; + + /// @reimp + QSize maximumSize() const override; + protected: void removeWidget_impl(DockWidgetBase *) override; int indexOfDockWidget_impl(DockWidgetBase *) override; @@ -52,6 +58,7 @@ protected: Q_SIGNALS: void tabTitlesChanged(); private: + int nonContentsHeight() const; QQuickItem *m_stackLayout = nullptr; QQuickItem *m_visualItem = nullptr; DockWidgetBase *m_currentDockWidget = nullptr; diff --git a/src/private/quick/qml/Frame.qml b/src/private/quick/qml/Frame.qml index 0dce0ff3..c19e03bc 100644 --- a/src/private/quick/qml/Frame.qml +++ b/src/private/quick/qml/Frame.qml @@ -17,7 +17,8 @@ Rectangle { id: root property QtObject frameCpp readonly property QtObject titleBarCpp: frameCpp ? frameCpp.titleBar : null - + readonly property int nonContentsHeight: (titleBar.visible ? titleBar.height : 0) + + (tabbar.visible ? tabbar.height : 0) color: "cyan" anchors.fill: parent diff --git a/tests/tst_docks.cpp b/tests/tst_docks.cpp index 87854a73..f71e2442 100644 --- a/tests/tst_docks.cpp +++ b/tests/tst_docks.cpp @@ -6095,20 +6095,40 @@ void TestDocks::tst_propagateSizeHonoursMinSize() min1 = widgetMinLength(dock1, Qt::Vertical); QVERIFY(dock1->height() >= min1); } + void TestDocks::tst_constraintsPropagateUp() { // Mostly for QtQuick, which doesn't have any layouts, so we need to make the propagation // Manually in DockWidgetQuick::minimumSize(), in FrameQuick, etc. EnsureTopLevelsDeleted e; + const int minWidth = 500; const int minHeight = 400; - auto guestWidget = new MyWidget2(QSize(400, minHeight)); + const QSize minSz = { minWidth, minHeight }; + auto guestWidget = new MyWidget2(QSize(minWidth, minHeight)); auto dock1 = createDockWidget("dock1", guestWidget); + auto dock2= createDockWidget("dock2", new MyWidget2(QSize(minWidth, minHeight))); + QCOMPARE(widgetMinLength(guestWidget, Qt::Vertical), minHeight); + QCOMPARE(widgetMinLength(guestWidget, Qt::Horizontal), minWidth); + QCOMPARE(dock1->minimumWidth(), minWidth); QCOMPARE(dock1->minimumHeight(), minHeight); + QCOMPARE(dock1->minimumSize(), minSz); + + auto frame1 = dock1->frame(); + + QVERIFY(qAbs(widgetMinLength(frame1, Qt::Vertical) - minHeight) < 10); //10px for styling differences + QVERIFY(qAbs(widgetMinLength(frame1, Qt::Horizontal) - minWidth) < 10); //10px for styling differences + + // Add dock2 side-by side, so the Frame now has a title bar. + auto oldFw2 = dock2->window(); + dock1->addDockWidgetToContainingWindow(dock2, Location_OnLeft); + TitleBar *tb = dock1->titleBar(); + QVERIFY(tb->isVisible()); + QVERIFY(qAbs(widgetMinLength(frame1, Qt::Vertical) - (minHeight + tb->height())) < 10); delete dock1->window(); - + delete oldFw2; } void TestDocks::tst_constraintsAfterPlaceholder()