From ac50bb1b85ccd3e08053e1284be50847d32688dc Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Fri, 9 Dec 2011 12:55:32 +1000 Subject: Ensure items in ListView and GridViews viewport are visible. Unrequested items and items in the cache buffer are hidden by the views. Make these items visible again if they enter the viewport due to a relayout. Change-Id: I574d1513e88c31c3c01a4a20ac77c21111279d3e Reviewed-by: Bea Lam --- src/quick/items/qquickgridview.cpp | 5 +++++ src/quick/items/qquickitemview.cpp | 1 + src/quick/items/qquicklistview.cpp | 13 +++++++++---- 3 files changed, 15 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/quick/items/qquickgridview.cpp b/src/quick/items/qquickgridview.cpp index 605e37e29f..b33f7d2a4d 100644 --- a/src/quick/items/qquickgridview.cpp +++ b/src/quick/items/qquickgridview.cpp @@ -542,6 +542,9 @@ void QQuickGridViewPrivate::updateViewport() void QQuickGridViewPrivate::layoutVisibleItems() { if (visibleItems.count()) { + const qreal from = isContentFlowReversed() ? -position() - size() : position(); + const qreal to = isContentFlowReversed() ? -position() : position() + size(); + FxGridItemSG *firstItem = static_cast(visibleItems.first()); qreal rowPos = firstItem->rowPos(); qreal colPos = firstItem->colPos(); @@ -549,6 +552,7 @@ void QQuickGridViewPrivate::layoutVisibleItems() if (colPos != col * colSize()) { colPos = col * colSize(); firstItem->setPosition(colPos, rowPos); + firstItem->item->setVisible(rowPos + rowSize() >= from && rowPos <= to); } for (int i = 1; i < visibleItems.count(); ++i) { FxGridItemSG *item = static_cast(visibleItems.at(i)); @@ -558,6 +562,7 @@ void QQuickGridViewPrivate::layoutVisibleItems() } colPos = col * colSize(); item->setPosition(colPos, rowPos); + item->item->setVisible(rowPos + rowSize() >= from && rowPos <= to); } } } diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index edbe2a5d06..340206b9dc 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -1651,6 +1651,7 @@ void QQuickItemViewPrivate::releaseItem(FxViewItem *item) itemPrivate->removeItemChangeListener(this, QQuickItemPrivate::Geometry); if (model->release(item->item) == 0) { // item was not destroyed, and we no longer reference it. + item->item->setVisible(false); unrequestedItems.insert(item->item, model->indexOf(item->item, q)); } delete item; diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp index 88a38553ac..ab568dd04a 100644 --- a/src/quick/items/qquicklistview.cpp +++ b/src/quick/items/qquicklistview.cpp @@ -692,12 +692,18 @@ void QQuickListViewPrivate::visibleItemsChanged() void QQuickListViewPrivate::layoutVisibleItems() { if (!visibleItems.isEmpty()) { - bool fixedCurrent = currentItem && (*visibleItems.constBegin())->item == currentItem->item; - qreal sum = (*visibleItems.constBegin())->size(); - qreal pos = (*visibleItems.constBegin())->position() + (*visibleItems.constBegin())->size() + spacing; + const qreal from = isContentFlowReversed() ? -position() - size() : position(); + const qreal to = isContentFlowReversed() ? -position() : position() + size(); + + FxViewItem *firstItem = *visibleItems.constBegin(); + bool fixedCurrent = currentItem && firstItem->item == currentItem->item; + qreal sum = firstItem->size(); + qreal pos = firstItem->position() + firstItem->size() + spacing; + firstItem->item->setVisible(firstItem->endPosition() >= from && firstItem->position() <= to); for (int i=1; i < visibleItems.count(); ++i) { FxListItemSG *item = static_cast(visibleItems.at(i)); item->setPosition(pos); + item->item->setVisible(item->endPosition() >= from && item->position() <= to); pos += item->size() + spacing; sum += item->size(); fixedCurrent = fixedCurrent || (currentItem && item->item == currentItem->item); @@ -2373,7 +2379,6 @@ bool QQuickListViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::In int modelIndex = change.index; int count = change.count; - qreal tempPos = isRightToLeft() ? -position()-size() : position(); int index = visibleItems.count() ? mapFromModel(modelIndex) : 0; -- cgit v1.2.3