diff options
Diffstat (limited to 'src/imports/layouts/qquicklayout.cpp')
-rw-r--r-- | src/imports/layouts/qquicklayout.cpp | 61 |
1 files changed, 31 insertions, 30 deletions
diff --git a/src/imports/layouts/qquicklayout.cpp b/src/imports/layouts/qquicklayout.cpp index df64b593d9..7d51ec3ca9 100644 --- a/src/imports/layouts/qquicklayout.cpp +++ b/src/imports/layouts/qquicklayout.cpp @@ -95,6 +95,8 @@ QQuickLayoutAttached::QQuickLayoutAttached(QObject *parent) m_maximumWidth(std::numeric_limits<qreal>::infinity()), m_maximumHeight(std::numeric_limits<qreal>::infinity()), m_defaultMargins(0), + m_fallbackWidth(-1), + m_fallbackHeight(-1), m_row(-1), m_column(-1), m_rowSpan(1), @@ -767,6 +769,12 @@ bool QQuickLayout::shouldIgnoreItem(QQuickItem *child, QQuickLayoutAttached *&in return ignoreItem; } +void QQuickLayout::checkAnchors(QQuickItem *item) const +{ + if (QQuickItemPrivate::get(item)->_anchors) + qmlWarning(item) << "Detected anchors on an item that is part of a layout. This is undefined behavior."; +} + void QQuickLayout::itemChange(ItemChange change, const ItemChangeData &value) { if (change == ItemChildAddedChange) { @@ -1049,39 +1057,32 @@ void QQuickLayout::effectiveSizeHints_helper(QQuickItem *item, QSizeF *cachedSiz prefHeight = qCeil(item->implicitHeight()); // If that fails, make an ultimate fallback to width/height - - if (!info && (prefWidth < 0 || prefHeight < 0)) - info = attachedLayoutObject(item); - - if (useFallbackToWidthOrHeight && info) { - /* This block is a bit hacky, but if we want to support using width/height - as preferred size hints in layouts, (which we think most people expect), - we only want to use the initial width. - This is because the width will change due to layout rearrangement, and the preferred - width should return the same value, regardless of the current width. - We therefore store the width in the implicitWidth attached property. - Since the layout listens to changes of implicitWidth, (it will - basically cause an invalidation of the layout), we have to disable that - notification while we set the implicit width (and height). - - Only use this fallback the first time the size hint is queried. Otherwise, we might - end up picking a width that is different than what was specified in the QML. + if (useFallbackToWidthOrHeight && !prefS.isValid()) { + /* If we want to support using width/height as preferred size hints in + layouts, (which we think most people expect), we only want to use the + initial width. + This is because the width will change due to layout rearrangement, + and the preferred width should return the same value, regardless of + the current width. + We therefore store this initial width in the attached layout object + and reuse it if needed rather than querying the width another time. + That means we need to ensure that an Layout attached object is available + by creating one if necessary. */ - if (prefWidth < 0 || prefHeight < 0) { - item->blockSignals(true); - if (prefWidth < 0) { - prefWidth = item->width(); - item->setImplicitWidth(prefWidth); - } - if (prefHeight < 0) { - prefHeight = item->height(); - item->setImplicitHeight(prefHeight); - } - item->blockSignals(false); - } - } + if (!info) + info = attachedLayoutObject(item); + auto updatePreferredSizes = [](qreal &cachedSize, qreal &attachedSize, qreal size) { + if (cachedSize < 0) { + if (attachedSize < 0) + attachedSize = size; + cachedSize = attachedSize; + } + }; + updatePreferredSizes(prefWidth, info->m_fallbackWidth, item->width()); + updatePreferredSizes(prefHeight, info->m_fallbackHeight, item->height()); + } // Normalize again after the implicit hints have been gathered expandSize(prefS, minS); |