aboutsummaryrefslogtreecommitdiffstats
path: root/src/quicklayouts/qquicklayout.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/quicklayouts/qquicklayout.cpp')
-rw-r--r--src/quicklayouts/qquicklayout.cpp20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/quicklayouts/qquicklayout.cpp b/src/quicklayouts/qquicklayout.cpp
index 3da13ba10a..0dd0d27eed 100644
--- a/src/quicklayouts/qquicklayout.cpp
+++ b/src/quicklayouts/qquicklayout.cpp
@@ -948,12 +948,30 @@ void QQuickLayout::itemChange(ItemChange change, const ItemChangeData &value)
void QQuickLayout::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)
{
Q_D(QQuickLayout);
+ qCDebug(lcQuickLayouts) << "QQuickLayout::geometryChange"
+ << oldGeometry << "-->" << newGeometry;
+
QQuickItem::geometryChange(newGeometry, oldGeometry);
+
if ((invalidated() && !qobject_cast<QQuickLayout *>(parentItem())) ||
d->m_disableRearrange || !isReady())
return;
- qCDebug(lcQuickLayouts) << "QQuickLayout::geometryChange" << newGeometry << oldGeometry;
+ // The geometryChange call above might recursively update the
+ // geometry of this layout, via item change listeners, in which
+ // case the recursive call has already rearranged the layout for
+ // the new size. We don't want to rearrange here based on the old
+ // 'new geometry', as that would revert the most up to date layout.
+ const qreal w = d->width.valueBypassingBindings();
+ const qreal h = d->height.valueBypassingBindings();
+ const QSizeF currentSize(w, h);
+ if (currentSize != newGeometry.size()) {
+ qCDebug(lcQuickLayouts) << "QQuickItem::geometryChange resulted"
+ << "in size change from" << newGeometry.size() << "to"
+ << currentSize << "; layout should already be up to date.";
+ return;
+ }
+
rearrange(newGeometry.size());
}