aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSanthosh Kumar <santhosh.kumar.selvaraj@qt.io>2024-02-27 18:08:58 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2024-03-05 15:42:02 +0000
commitf282b3f108a1f74bae69a52d13e3bc3186c19ef3 (patch)
treeae2cfae4c73692a4388e47a42f0127123a0d246c
parentfc729207b29d0a4d4b8789d5a641a481fcb9fa1a (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.cpp26
-rw-r--r--src/quicklayouts/qquicklayout_p.h22
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();