diff options
author | Bea Lam <[email protected]> | 2012-04-30 12:55:45 +1000 |
---|---|---|
committer | Qt by Nokia <[email protected]> | 2012-05-01 07:34:12 +0200 |
commit | 9a107f47ea50f40ce6b9695fba0190b99f76642a (patch) | |
tree | bc033c8f9dea88344bda4833719288df587b3e31 /src/quick/items/qquicklistview.cpp | |
parent | 01eb4d93c5894dbee6210712454a28e9fe9a680f (diff) |
Fix content pos adjustment when resizing first item
If visibleItems.first() changes size in a ListView, the size change
should be made in the direction of the content flow. This was not
working correctly for layouts other than the default vertical+LTR
layout. This patch fixes the issue for other layouts and also fixes
resizing of implicitly sized delegates (e.g. positioners) within the
default layout.
Change-Id: Ib1d84ce000a3a341fe617cf644420dc5d589d577
Reviewed-by: Andrew den Exter <[email protected]>
Diffstat (limited to 'src/quick/items/qquicklistview.cpp')
-rw-r--r-- | src/quick/items/qquicklistview.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp index df50d3eb8c..bbfaeb0d1f 100644 --- a/src/quick/items/qquicklistview.cpp +++ b/src/quick/items/qquicklistview.cpp @@ -1336,9 +1336,29 @@ void QQuickListViewPrivate::itemGeometryChanged(QQuickItem *item, const QRectF & QQuickItemViewPrivate::itemGeometryChanged(item, newGeometry, oldGeometry); if (!q->isComponentComplete()) return; + if (item != contentItem && (!highlight || item != highlight->item)) { if ((orient == QQuickListView::Vertical && newGeometry.height() != oldGeometry.height()) || (orient == QQuickListView::Horizontal && newGeometry.width() != oldGeometry.width())) { + + // if visibleItems.first() has resized, adjust its pos since it is used to + // position all subsequent items + if (visibleItems.count() && item == visibleItems.first()->item) { + FxListItemSG *listItem = static_cast<FxListItemSG*>(visibleItems.first()); + if (orient == Qt::Vertical) { + qreal diff = newGeometry.height() - oldGeometry.height(); + if (verticalLayoutDirection == QQuickListView::TopToBottom && listItem->endPosition() < q->contentY()) + listItem->setPosition(listItem->position() - diff, true); + else if (verticalLayoutDirection == QQuickListView::BottomToTop && listItem->endPosition() > q->contentY()) + listItem->setPosition(listItem->position() + diff, true); + } else { + qreal diff = newGeometry.width() - oldGeometry.width(); + if (q->effectiveLayoutDirection() == Qt::LeftToRight && listItem->endPosition() < q->contentX()) + listItem->setPosition(listItem->position() - diff, true); + else if (q->effectiveLayoutDirection() == Qt::RightToLeft && listItem->endPosition() > q->contentX()) + listItem->setPosition(listItem->position() + diff, true); + } + } forceLayout = true; q->polish(); } |