diff options
author | Santhosh Kumar <santhosh.kumar.selvaraj@qt.io> | 2024-02-27 18:08:58 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2024-03-05 15:42:02 +0000 |
commit | f282b3f108a1f74bae69a52d13e3bc3186c19ef3 (patch) | |
tree | ae2cfae4c73692a4388e47a42f0127123a0d246c | |
parent | fc729207b29d0a4d4b8789d5a641a481fcb9fa1a (diff) |
Use Qt::AA_QtQuickUseDefaultSizePolicy to apply size policy for layout
The default size policy that need to be applied for quick items within
the layout has been changed as opt-in. This further require layout to
consider Qt::AA_QtQuickUseDefaultSizePolicy attribute and the same
been tested for set before applying those size policies.
Task-number: QTBUG-117597
Change-Id: Idbd27f8cd1ffbfe7631e953c787234f9f1e5b0e2
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
(cherry picked from commit b60b1e17a2d0dc6f263dc0c788f0a6bf14e6d0de)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/quicklayouts/qquicklayout.cpp | 26 | ||||
-rw-r--r-- | src/quicklayouts/qquicklayout_p.h | 22 |
2 files changed, 38 insertions, 10 deletions
diff --git a/src/quicklayouts/qquicklayout.cpp b/src/quicklayouts/qquicklayout.cpp index 5a6b30ff38..eb4a8f0c51 100644 --- a/src/quicklayouts/qquicklayout.cpp +++ b/src/quicklayouts/qquicklayout.cpp @@ -303,15 +303,16 @@ void QQuickLayoutAttached::setMaximumImplicitSize(const QSizeF &sz) If this property is \c true, the item will be as wide as possible while respecting the given constraints. If the property is \c false, the item will have a fixed width set to the preferred width. - The default is \c false, except for layouts themselves, which default to \c true. + The default depends on implicit (built-in) size policy of item. \sa fillHeight */ void QQuickLayoutAttached::setFillWidth(bool fill) { + bool oldFillWidth = fillWidth(); m_isFillWidthSet = true; - if (m_fillWidth != fill) { - m_fillWidth = fill; + m_fillWidth = fill; + if (oldFillWidth != fill) { invalidateItem(); emit fillWidthChanged(); } @@ -323,15 +324,16 @@ void QQuickLayoutAttached::setFillWidth(bool fill) If this property is \c true, the item will be as tall as possible while respecting the given constraints. If the property is \c false, the item will have a fixed height set to the preferred height. - The default is \c false, except for layouts themselves, which default to \c true. + The default depends on implicit (built-in) size policy of the item. \sa fillWidth */ void QQuickLayoutAttached::setFillHeight(bool fill) { + bool oldFillHeight = fillHeight(); m_isFillHeightSet = true; - if (m_fillHeight != fill) { - m_fillHeight = fill; + m_fillHeight = fill; + if (oldFillHeight != fill) { invalidateItem(); emit fillHeightChanged(); } @@ -1255,7 +1257,15 @@ void QQuickLayout::effectiveSizeHints_helper(QQuickItem *item, QSizeF *cachedSiz */ QLayoutPolicy::Policy QQuickLayout::effectiveSizePolicy_helper(QQuickItem *item, Qt::Orientation orientation, QQuickLayoutAttached *info) { - bool fillExtent = false; + bool fillExtent([&]{ + QLayoutPolicy::Policy policy{QLayoutPolicy::Fixed}; + if (item && QGuiApplication::testAttribute(Qt::AA_QtQuickUseDefaultSizePolicy)) { + QLayoutPolicy sizePolicy = QQuickItemPrivate::get(item)->sizePolicy(); + policy = (orientation == Qt::Horizontal) ? sizePolicy.horizontalPolicy() : sizePolicy.verticalPolicy(); + } + return (policy == QLayoutPolicy::Preferred); + }()); + bool isSet = false; if (info) { if (orientation == Qt::Horizontal) { @@ -1268,8 +1278,8 @@ QLayoutPolicy::Policy QQuickLayout::effectiveSizePolicy_helper(QQuickItem *item, } if (!isSet && qobject_cast<QQuickLayout*>(item)) fillExtent = true; - return fillExtent ? QLayoutPolicy::Preferred : QLayoutPolicy::Fixed; + return fillExtent ? QLayoutPolicy::Preferred : QLayoutPolicy::Fixed; } void QQuickLayout::_q_dumpLayoutTree() const diff --git a/src/quicklayouts/qquicklayout_p.h b/src/quicklayouts/qquicklayout_p.h index 2b08f1bc32..4038f64fe7 100644 --- a/src/quicklayouts/qquicklayout_p.h +++ b/src/quicklayouts/qquicklayout_p.h @@ -23,6 +23,7 @@ #include <private/qquickitem_p.h> #include <QtQuick/private/qquickitemchangelistener_p.h> #include <QtGui/private/qlayoutpolicy_p.h> +#include <QtGui/qguiapplication.h> QT_BEGIN_NAMESPACE @@ -211,11 +212,19 @@ public: void setMinimumImplicitSize(const QSizeF &sz); void setMaximumImplicitSize(const QSizeF &sz); - bool fillWidth() const { return m_fillWidth; } + bool fillWidth() const { + if (auto *itemPriv = itemForSizePolicy(m_isFillWidthSet)) + return (itemPriv->sizePolicy().horizontalPolicy() == QLayoutPolicy::Preferred); + return m_fillWidth; + } void setFillWidth(bool fill); bool isFillWidthSet() const { return m_isFillWidthSet; } - bool fillHeight() const { return m_fillHeight; } + bool fillHeight() const { + if (auto *itemPriv = itemForSizePolicy(m_isFillHeightSet)) + return (itemPriv->sizePolicy().verticalPolicy() == QLayoutPolicy::Preferred); + return m_fillHeight; + } void setFillHeight(bool fill); bool isFillHeightSet() const { return m_isFillHeightSet; } @@ -303,6 +312,15 @@ public: return false; } + QQuickItemPrivate *itemForSizePolicy(bool isFillSet) const + { + QQuickItemPrivate *itemPriv = nullptr; + if (!isFillSet && qobject_cast<QQuickItem *>(item()) && + QGuiApplication::testAttribute(Qt::AA_QtQuickUseDefaultSizePolicy)) + itemPriv = QQuickItemPrivate::get(item()); + return itemPriv; + } + Q_SIGNALS: void minimumWidthChanged(); void minimumHeightChanged(); |