diff options
author | Santhosh Kumar <santhosh.kumar.selvaraj@qt.io> | 2023-11-30 12:52:36 +0100 |
---|---|---|
committer | Santhosh Kumar <santhosh.kumar.selvaraj@qt.io> | 2024-02-22 22:45:13 +0100 |
commit | dd72694b6046d98a64bd99361ed9cb4613af78f8 (patch) | |
tree | 6c1e7b2579356cfef3a57de74607ae9f7450ce54 /src/quicklayouts | |
parent | 9ee160941064f2c18f5a2197bf85c6e8af979826 (diff) |
Adapt layouts to take advantage of new size policy information
The size policy been defined for QQuickItem and its subclasses (as
part of task QTBUG-117597). This commit adds code so that Qt Quick
Layouts will effectively use them.
It also have an opt-out code path by testing for
QGuiApplication::testAttribute(Qt::AA_QtQuickDontUseDefaultSizePolicy)
Task-number: QTBUG-117597
Pick-to: 6.7
Change-Id: I624509a77a870d72a5c4ce96505516bf30801559
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
Diffstat (limited to 'src/quicklayouts')
-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..dfb277075e 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_QtQuickDontUseDefaultSizePolicy)) { + 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 5e1694a4dc..e92aacdbcd 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_QtQuickDontUseDefaultSizePolicy)) + itemPriv = QQuickItemPrivate::get(item()); + return itemPriv; + } + Q_SIGNALS: void minimumWidthChanged(); void minimumHeightChanged(); |