qtquick: Override min size for FrameQuick
Fixes constriants not propagating from dock widget to frame
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user