qtquick: Override min size for FrameQuick

Fixes constriants not propagating from dock widget to frame
This commit is contained in:
Sergio Martins
2020-11-22 15:40:37 +00:00
parent 801e49de9d
commit 22437e75c6
4 changed files with 47 additions and 3 deletions

View File

@@ -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)
{

View File

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

View File

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

View File

@@ -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()