aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMartin Jones <martin.jones@nokia.com>2012-03-07 15:26:33 +1000
committerQt by Nokia <qt-info@nokia.com>2012-03-07 08:42:21 +0100
commitb1a301884bb88ff62268437f436d6f0fc38efe2b (patch)
tree8278b5519a599d96dfdd85a755f746378eb43f45 /src
parent22a53bcd69d39a5ea128d53231e9e51455a98cc4 (diff)
ListView can freeze if flicked beyond its bounds.
If the delegate's size changes in componentComplete and all items are flicked out of view, an incorrect jump calculation in addVisibleItems() resulted in a new delegate being created in the wrong position, and retriggering the jump calculation, which resulted in a new delegate being created in the wrong position, and retriggering the jump... Also fixed currentItem visibility. Change-Id: Iad5f211c4fc5eed9c009d51a0ce3b58181a7b36e Reviewed-by: Bea Lam <bea.lam@nokia.com>
Diffstat (limited to 'src')
-rw-r--r--src/quick/items/qquickgridview.cpp4
-rw-r--r--src/quick/items/qquicklistview.cpp27
2 files changed, 17 insertions, 14 deletions
diff --git a/src/quick/items/qquickgridview.cpp b/src/quick/items/qquickgridview.cpp
index 45fbc9f93e..a78ab4c4e5 100644
--- a/src/quick/items/qquickgridview.cpp
+++ b/src/quick/items/qquickgridview.cpp
@@ -1884,6 +1884,10 @@ void QQuickGridView::viewportMoved()
FxGridItemSG *item = static_cast<FxGridItemSG*>(d->visibleItems.at(i));
item->item->setVisible(item->rowPos() + d->rowSize() >= from && item->rowPos() <= to);
}
+ if (d->currentItem) {
+ FxGridItemSG *item = static_cast<FxGridItemSG*>(d->currentItem);
+ item->item->setVisible(item->rowPos() + d->rowSize() >= from && item->rowPos() <= to);
+ }
if (d->hData.flicking || d->vData.flicking || d->hData.moving || d->vData.moving)
d->moveReason = QQuickGridViewPrivate::Mouse;
diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp
index 5e9a685cf5..a2f687c86b 100644
--- a/src/quick/items/qquicklistview.cpp
+++ b/src/quick/items/qquicklistview.cpp
@@ -615,20 +615,17 @@ bool QQuickListViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, bool d
// We've jumped more than a page. Estimate which items are now
// visible and fill from there.
int count = (fillFrom - itemEnd) / (averageSize + spacing);
- for (int i = 0; i < visibleItems.count(); ++i)
- releaseItem(visibleItems.at(i));
- visibleItems.clear();
- modelIndex += count;
- if (modelIndex >= model->count()) {
- count -= modelIndex - model->count() + 1;
- modelIndex = model->count() - 1;
- } else if (modelIndex < 0) {
- count -= modelIndex;
- modelIndex = 0;
- }
- visibleIndex = modelIndex;
- visiblePos = itemEnd + count * (averageSize + spacing);
- itemEnd = visiblePos;
+ int newModelIdx = qBound(0, modelIndex + count, model->count());
+ count = newModelIdx - modelIndex;
+ if (count) {
+ for (int i = 0; i < visibleItems.count(); ++i)
+ releaseItem(visibleItems.at(i));
+ visibleItems.clear();
+ modelIndex = newModelIdx;
+ visibleIndex = modelIndex;
+ visiblePos = itemEnd + count * (averageSize + spacing);
+ itemEnd = visiblePos;
+ }
}
bool changed = false;
@@ -2553,6 +2550,8 @@ void QQuickListView::viewportMoved()
FxViewItem *item = static_cast<FxListItemSG*>(d->visibleItems.at(i));
item->item->setVisible(item->endPosition() >= from && item->position() <= to);
}
+ if (d->currentItem)
+ d->currentItem->item->setVisible(d->currentItem->endPosition() >= from && d->currentItem->position() <= to);
if (d->hData.flicking || d->vData.flicking || d->hData.moving || d->vData.moving)
d->moveReason = QQuickListViewPrivate::Mouse;