diff options
author | Martin Jones <martin.jones@nokia.com> | 2011-02-10 05:31:40 (GMT) |
---|---|---|
committer | Martin Jones <martin.jones@nokia.com> | 2011-02-10 06:32:41 (GMT) |
commit | db8462b107ad3dbf13c1eed43588fb1d9420f4ad (patch) | |
tree | e854eecbeffee9e93cafaf3c5fd183d33fd0f00d /src | |
parent | 32b68e009da38a2c85ceacce72c919606331522c (diff) | |
download | Qt-db8462b107ad3dbf13c1eed43588fb1d9420f4ad.zip Qt-db8462b107ad3dbf13c1eed43588fb1d9420f4ad.tar.gz Qt-db8462b107ad3dbf13c1eed43588fb1d9420f4ad.tar.bz2 |
PathView items were not correctly updated when rootIndex changed.
PathView got confused because it queried the model when removing
items due to the rootIndex change. This caused new items to be added
since the model->count() was not zero (it was the count for the new
rootIndex). Calculate the PathView modelCount similarly to the other
views (rather than querying the model) and correctly handle the
modelCount being set to zero.
Change-Id: I9e4fb27c14aa8c77ad37ff01d95c123f909db20d
Task-number: QTBUG-16366
Reviewed-by: Bea Lam
Diffstat (limited to 'src')
-rw-r--r-- | src/declarative/graphicsitems/qdeclarativepathview.cpp | 44 |
1 files changed, 28 insertions, 16 deletions
diff --git a/src/declarative/graphicsitems/qdeclarativepathview.cpp b/src/declarative/graphicsitems/qdeclarativepathview.cpp index 050a9ca..269d3b7 100644 --- a/src/declarative/graphicsitems/qdeclarativepathview.cpp +++ b/src/declarative/graphicsitems/qdeclarativepathview.cpp @@ -1455,17 +1455,18 @@ void QDeclarativePathView::itemsInserted(int modelIndex, int count) if (!d->isValid() || !isComponentComplete()) return; - d->itemCache += d->items; - d->items.clear(); - if (modelIndex <= d->currentIndex) { - d->currentIndex += count; - emit currentIndexChanged(); - } else if (d->offset != 0) { - d->offset += count; - d->offsetAdj += count; + if (d->modelCount) { + d->itemCache += d->items; + d->items.clear(); + if (modelIndex <= d->currentIndex) { + d->currentIndex += count; + emit currentIndexChanged(); + } else if (d->offset != 0) { + d->offset += count; + d->offsetAdj += count; + } } - - d->modelCount = d->model->count(); + d->modelCount += count; if (d->flicking || d->moving) { d->regenerate(); d->updateCurrent(); @@ -1502,18 +1503,29 @@ void QDeclarativePathView::itemsRemoved(int modelIndex, int count) d->itemCache += d->items; d->items.clear(); + bool changedOffset = false; if (modelIndex > d->currentIndex) { if (d->offset >= count) { + changedOffset = true; d->offset -= count; d->offsetAdj -= count; } } - d->modelCount = d->model->count(); - d->regenerate(); - d->updateCurrent(); - if (!d->modelCount) + d->modelCount -= count; + if (!d->modelCount) { + while (d->itemCache.count()) + d->releaseItem(d->itemCache.takeLast()); + d->offset = 0; + changedOffset = true; + d->tl.reset(d->moveOffset); update(); + } else { + d->regenerate(); + d->updateCurrent(); + } + if (changedOffset) + emit offsetChanged(); if (currentChanged) emit currentIndexChanged(); emit countChanged(); @@ -1601,7 +1613,7 @@ void QDeclarativePathView::movementEnding() int QDeclarativePathViewPrivate::calcCurrentIndex() { int current = -1; - if (model && items.count()) { + if (modelCount && model && items.count()) { offset = qmlMod(offset, modelCount); if (offset < 0) offset += modelCount; @@ -1617,7 +1629,7 @@ void QDeclarativePathViewPrivate::updateCurrent() Q_Q(QDeclarativePathView); if (moveReason != Mouse) return; - if (!haveHighlightRange || highlightRangeMode != QDeclarativePathView::StrictlyEnforceRange) + if (!modelCount || !haveHighlightRange || highlightRangeMode != QDeclarativePathView::StrictlyEnforceRange) return; int idx = calcCurrentIndex(); |