diff options
author | Bea Lam <bea.lam@nokia.com> | 2012-01-05 09:59:30 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-01-09 07:14:31 +0100 |
commit | 6b6d99c1a218f1c46ae0151a01575de6092ba9a7 (patch) | |
tree | d68e19b73691d4119f13358b29ca17cbd084c80b /src/quick | |
parent | 95e720d1b63312e50be3df467973d098c4527b7d (diff) |
Fix positioning issues and change content y repositioning behaviour
Refactor the code for re-positioning the visibleItems.first() in
QSGItemView::applyModelChanges() and fix various positioning issues.
The positioning behaviour for removing items at the start of the view
has changed. This action will no longer cause the content y to move
down; previously the content y would always move down unless another
item was moving backwards to the first visible position. This will make
it easier to implement built-in removal transitions for the views, since
removed items cannot be animated if the content y jumps down past them.
Additionally, moving items from before a GridView should not cause the
top item in the view to move upwards and out of the view.
This also adds additional remove tests and fixes the
tst_QQuickGridView::moved() test which wasn't waiting for the polish
event after setting the content y, which caused some of the tests to
pass even though their test data was wrong.
Change-Id: Idad11a73a18f88208e73a52111ed839458e05f2d
Reviewed-by: Martin Jones <martin.jones@nokia.com>
Diffstat (limited to 'src/quick')
-rw-r--r-- | src/quick/items/qquickgridview.cpp | 47 | ||||
-rw-r--r-- | src/quick/items/qquickitemview.cpp | 185 | ||||
-rw-r--r-- | src/quick/items/qquickitemview_p_p.h | 17 | ||||
-rw-r--r-- | src/quick/items/qquicklistview.cpp | 44 |
4 files changed, 151 insertions, 142 deletions
diff --git a/src/quick/items/qquickgridview.cpp b/src/quick/items/qquickgridview.cpp index 582f46251d..b29c61fdd7 100644 --- a/src/quick/items/qquickgridview.cpp +++ b/src/quick/items/qquickgridview.cpp @@ -173,7 +173,7 @@ public: virtual void repositionPackageItemAt(QQuickItem *item, int index); virtual void resetItemPosition(FxViewItem *item, FxViewItem *toItem); virtual void resetFirstItemPosition(); - virtual void moveItemBy(FxViewItem *item, qreal forwards, qreal backwards); + virtual void adjustFirstItem(qreal forwards, qreal backwards); virtual void createHighlight(); virtual void updateHighlight(); @@ -181,7 +181,7 @@ public: virtual void setPosition(qreal pos); virtual void layoutVisibleItems(); - bool applyInsertionChange(const QDeclarativeChangeSet::Insert &, FxViewItem *, InsertionsResult *); + virtual bool applyInsertionChange(const QDeclarativeChangeSet::Insert &insert, ChangeResult *changeResult, bool *newVisibleItemsFirst, QList<FxViewItem *> *addedItems); virtual bool needsRefillForAddedOrRemovedIndex(int index) const; virtual qreal headerSize() const; @@ -598,11 +598,14 @@ void QQuickGridViewPrivate::resetFirstItemPosition() item->setPosition(0, 0); } -void QQuickGridViewPrivate::moveItemBy(FxViewItem *item, qreal forwards, qreal backwards) +void QQuickGridViewPrivate::adjustFirstItem(qreal forwards, qreal backwards) { + if (!visibleItems.count()) + return; + int moveCount = (forwards / rowSize()) - (backwards / rowSize()); - FxGridItemSG *gridItem = static_cast<FxGridItemSG*>(item); + FxGridItemSG *gridItem = static_cast<FxGridItemSG*>(visibleItems.first()); gridItem->setPosition(gridItem->colPos(), gridItem->rowPos() + ((moveCount / columns) * rowSize())); } @@ -783,8 +786,7 @@ void QQuickGridViewPrivate::initializeCurrentItem() { if (currentItem && currentIndex >= 0) { FxGridItemSG *gridItem = static_cast<FxGridItemSG*>(currentItem); - if (gridItem) - gridItem->setPosition(colPosAt(currentIndex), rowPosAt(currentIndex)); + gridItem->setPosition(colPosAt(currentIndex), rowPosAt(currentIndex)); } } @@ -1768,7 +1770,7 @@ void QQuickGridView::moveCurrentIndexRight() } } -bool QQuickGridViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::Insert &change, FxViewItem *firstVisible, InsertionsResult *insertResult) +bool QQuickGridViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::Insert &change, ChangeResult *insertResult, bool *newVisibleItemsFirst, QList<FxViewItem *> *addedItems) { Q_Q(QQuickGridView); @@ -1828,8 +1830,8 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::In item->index += count; } - int prevAddedCount = insertResult->addedItems.count(); - if (firstVisible && rowPos < firstVisible->position()) { + int prevVisibleCount = visibleItems.count(); + if (insertResult->visiblePos.isValid() && rowPos < insertResult->visiblePos) { // Insert items before the visible item. int insertionIdx = index; int i = count - 1; @@ -1838,15 +1840,12 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::In while (i >= 0) { if (rowPos > from && insertionIdx < visibleIndex) { // item won't be visible, just note the size for repositioning - insertResult->sizeAddedBeforeVisible += rowSize(); + insertResult->sizeChangesBeforeVisiblePos += rowSize(); } else { // item is before first visible e.g. in cache buffer FxViewItem *item = 0; - if (change.isMove() && (item = currentChanges.removedItems.take(change.moveKey(modelIndex + i)))) { - if (item->index > modelIndex + i) - insertResult->movedBackwards.append(item); + if (change.isMove() && (item = currentChanges.removedItems.take(change.moveKey(modelIndex + i)))) item->index = modelIndex + i; - } if (!item) item = createItem(modelIndex + i); if (!item) @@ -1854,10 +1853,9 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::In item->item->setVisible(true); visibleItems.insert(insertionIdx, item); - if (!change.isMove()) { - insertResult->addedItems.append(item); - insertResult->sizeAddedBeforeVisible += rowSize(); - } + if (!change.isMove()) + addedItems->append(item); + insertResult->sizeChangesBeforeVisiblePos += rowSize(); } if (--colNum < 0 ) { @@ -1873,11 +1871,8 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::In int to = buffer+tempPos+size()-1; while (i < count && rowPos <= to + rowSize()*(columns - (colPos/colSize()))/qreal(columns)) { FxViewItem *item = 0; - if (change.isMove() && (item = currentChanges.removedItems.take(change.moveKey(modelIndex + i)))) { - if (item->index > modelIndex + i) - insertResult->movedBackwards.append(item); + if (change.isMove() && (item = currentChanges.removedItems.take(change.moveKey(modelIndex + i)))) item->index = modelIndex + i; - } if (!item) item = createItem(modelIndex + i); if (!item) @@ -1885,8 +1880,12 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::In item->item->setVisible(true); visibleItems.insert(index, item); + if (index == 0) + *newVisibleItemsFirst = true; if (!change.isMove()) - insertResult->addedItems.append(item); + addedItems->append(item); + insertResult->sizeChangesAfterVisiblePos += rowSize(); + if (++colNum >= columns) { colNum = 0; rowPos += rowSize(); @@ -1899,7 +1898,7 @@ bool QQuickGridViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::In updateVisibleIndex(); - return insertResult->addedItems.count() > prevAddedCount; + return visibleItems.count() > prevVisibleCount; } bool QQuickGridViewPrivate::needsRefillForAddedOrRemovedIndex(int modelIndex) const diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index 879c02f4cb..8f46661078 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -75,7 +75,7 @@ void QQuickItemViewChangeSet::applyChanges(const QDeclarativeChangeSet &changeSe pendingChanges.apply(changeSet); int moveId = -1; - int moveOffset; + int moveOffset = 0; foreach (const QDeclarativeChangeSet::Remove &r, changeSet.removes()) { itemCount -= r.count; @@ -1221,7 +1221,6 @@ void QQuickItemViewPrivate::updateCurrent(int modelIndex) { Q_Q(QQuickItemView); applyPendingChanges(); - if (!q->isComponentComplete() || !isValid() || modelIndex < 0 || modelIndex >= model->count()) { if (currentItem) { currentItem->attached->setIsCurrentItem(false); @@ -1425,57 +1424,25 @@ bool QQuickItemViewPrivate::applyModelChanges() updateUnrequestedIndexes(); moveReason = QQuickItemViewPrivate::Other; - int prevCount = itemCount; + FxViewItem *prevVisibleItemsFirst = visibleItems.count() ? visibleItems.first() : 0; + int prevItemCount = itemCount; + int prevVisibleItemsCount = visibleItems.count(); bool visibleAffected = false; bool viewportChanged = !currentChanges.pendingChanges.removes().isEmpty() || !currentChanges.pendingChanges.inserts().isEmpty(); - FxViewItem *firstVisible = firstVisibleItem(); - FxViewItem *origVisibleItemsFirst = visibleItems.count() ? visibleItems.first() : 0; - int firstItemIndex = firstVisible ? firstVisible->index : -1; - qreal removedBeforeFirstVisibleBy = 0; + FxViewItem *prevFirstVisible = firstVisibleItem(); + QDeclarativeNullableValue<qreal> prevFirstVisiblePos; + if (prevFirstVisible) + prevFirstVisiblePos = prevFirstVisible->position(); const QVector<QDeclarativeChangeSet::Remove> &removals = currentChanges.pendingChanges.removes(); + ChangeResult removalResult(prevFirstVisiblePos); + int removedCount = 0; for (int i=0; i<removals.count(); i++) { itemCount -= removals[i].count; - - // Remove the items from the visible list, skipping anything already marked for removal - QList<FxViewItem*>::Iterator it = visibleItems.begin(); - while (it != visibleItems.end()) { - FxViewItem *item = *it; - if (item->index == -1 || item->index < removals[i].index) { - // already removed, or before removed items - if (!visibleAffected && item->index < removals[i].index) - visibleAffected = true; - ++it; - } else if (item->index >= removals[i].index + removals[i].count) { - // after removed items - item->index -= removals[i].count; - ++it; - } else { - // removed item - visibleAffected = true; - if (!removals[i].isMove()) - item->attached->emitRemove(); - - if (item->attached->delayRemove() && !removals[i].isMove()) { - item->index = -1; - QObject::connect(item->attached, SIGNAL(delayRemoveChanged()), q, SLOT(destroyRemoved()), Qt::QueuedConnection); - ++it; - } else { - if (firstVisible && item->position() < firstVisible->position() && item != visibleItems.first()) - removedBeforeFirstVisibleBy += item->size(); - if (removals[i].isMove()) { - currentChanges.removedItems.insert(removals[i].moveKey(item->index), item); - } else { - if (item == firstVisible) - firstVisible = 0; - currentChanges.removedItems.insertMulti(QDeclarativeChangeSet::MoveKey(), item); - } - it = visibleItems.erase(it); - } - } - } + if (applyRemovalChange(removals[i], &removalResult, &removedCount)) + visibleAffected = true; if (!visibleAffected && needsRefillForAddedOrRemovedIndex(removals[i].index)) visibleAffected = true; } @@ -1483,59 +1450,47 @@ bool QQuickItemViewPrivate::applyModelChanges() updateVisibleIndex(); const QVector<QDeclarativeChangeSet::Insert> &insertions = currentChanges.pendingChanges.inserts(); - InsertionsResult insertResult; - bool allInsertionsBeforeVisible = true; - + ChangeResult insertionResult(prevFirstVisiblePos); + bool newVisibleItemsFirst = false; + QList<FxViewItem *> newItems; for (int i=0; i<insertions.count(); i++) { bool wasEmpty = visibleItems.isEmpty(); - if (applyInsertionChange(insertions[i], firstVisible, &insertResult)) + if (applyInsertionChange(insertions[i], &insertionResult, &newVisibleItemsFirst, &newItems)) visibleAffected = true; if (!visibleAffected && needsRefillForAddedOrRemovedIndex(insertions[i].index)) visibleAffected = true; - if (insertions[i].index >= visibleIndex) - allInsertionsBeforeVisible = false; if (wasEmpty && !visibleItems.isEmpty()) resetFirstItemPosition(); itemCount += insertions[i].count; } - for (int i=0; i<insertResult.addedItems.count(); ++i) - insertResult.addedItems.at(i)->attached->emitAdd(); - - // if the first visible item has moved, ensure another one takes its place - // so that we avoid shifting all content forwards - // (if an item is removed from before the first visible, the first visible should not move upwards) - bool movedBackToFirstVisible = false; - if (firstVisible && firstItemIndex >= 0) { - for (int i=0; i<insertResult.movedBackwards.count(); i++) { - if (insertResult.movedBackwards[i]->index == firstItemIndex) { - // an item has moved backwards up to the first visible's position - resetItemPosition(insertResult.movedBackwards[i], firstVisible); - insertResult.movedBackwards.removeAt(i); - movedBackToFirstVisible = true; - break; + for (int i=0; i<newItems.count(); i++) + newItems.at(i)->attached->emitAdd(); + + // reposition visibleItems.first() correctly so that the content y doesn't jump + if (visibleItems.count() && removedCount != prevVisibleItemsCount) { + if (newVisibleItemsFirst && prevVisibleItemsFirst) + resetItemPosition(visibleItems.first(), prevVisibleItemsFirst); + + if (prevFirstVisible && prevVisibleItemsFirst == prevFirstVisible + && prevFirstVisible != visibleItems.first()) { + // the previous visibleItems.first() was also the first visible item, and it has been + // moved/removed, so move the new visibleItems.first() to the pos of the previous one + if (!newVisibleItemsFirst) + resetItemPosition(visibleItems.first(), prevFirstVisible); + + } else if (prevFirstVisiblePos.isValid()) { + qreal moveForwardsBy = 0; + qreal moveBackwardsBy = 0; + + // shift visibleItems.first() relative to the number of added/removed items + if (visibleItems.first()->position() > prevFirstVisiblePos) { + moveForwardsBy = insertionResult.sizeChangesAfterVisiblePos; + moveBackwardsBy = removalResult.sizeChangesAfterVisiblePos; + } else if (visibleItems.first()->position() < prevFirstVisiblePos) { + moveForwardsBy = removalResult.sizeChangesBeforeVisiblePos; + moveBackwardsBy = insertionResult.sizeChangesBeforeVisiblePos; } - } - if (!movedBackToFirstVisible && !allInsertionsBeforeVisible) { - // first visible item has moved forward, another visible item takes its place - FxViewItem *item = visibleItem(firstItemIndex); - if (item) - resetItemPosition(item, firstVisible); - } - } - - // Ensure we don't cause an ugly list scroll - if (firstVisible && visibleItems.count() && visibleItems.first() != firstVisible) { - // ensure first item is placed at correct postion if moving backward - // since it will be used to position all subsequent items - if (insertResult.movedBackwards.count() && origVisibleItemsFirst) - resetItemPosition(visibleItems.first(), origVisibleItemsFirst); - - // correct the first item position (unless it has already been fixed) - if (!movedBackToFirstVisible) { - qreal moveBackwardsBy = insertResult.sizeAddedBeforeVisible; - for (int i=0; i<insertResult.movedBackwards.count(); i++) - moveBackwardsBy += insertResult.movedBackwards[i]->size(); - moveItemBy(visibleItems.first(), removedBeforeFirstVisibleBy, moveBackwardsBy); + adjustFirstItem(moveForwardsBy, moveBackwardsBy); } } @@ -1558,7 +1513,7 @@ bool QQuickItemViewPrivate::applyModelChanges() currentChanges.reset(); updateSections(); - if (prevCount != itemCount) + if (prevItemCount != itemCount) emit q->countChanged(); if (!visibleAffected) @@ -1570,6 +1525,58 @@ bool QQuickItemViewPrivate::applyModelChanges() return visibleAffected; } +bool QQuickItemViewPrivate::applyRemovalChange(const QDeclarativeChangeSet::Remove &removal, ChangeResult *insertResult, int *removedCount) +{ + Q_Q(QQuickItemView); + bool visibleAffected = false; + + QList<FxViewItem*>::Iterator it = visibleItems.begin(); + while (it != visibleItems.end()) { + FxViewItem *item = *it; + if (item->index == -1 || item->index < removal.index) { + // already removed, or before removed items + if (!visibleAffected && item->index < removal.index) + visibleAffected = true; + ++it; + } else if (item->index >= removal.index + removal.count) { + // after removed items + item->index -= removal.count; + ++it; + } else { + // removed item + visibleAffected = true; + if (!removal.isMove()) + item->attached->emitRemove(); + + if (item->attached->delayRemove() && !removal.isMove()) { + item->index = -1; + QObject::connect(item->attached, SIGNAL(delayRemoveChanged()), q, SLOT(destroyRemoved()), Qt::QueuedConnection); + ++it; + } else { + if (insertResult->visiblePos.isValid()) { + if (item->position() < insertResult->visiblePos) { + // sizeRemovedBeforeFirstVisible measures the size between the visibleItems.first() + // and the firstVisible, so don't count it if removing visibleItems.first() + if (item != visibleItems.first()) + insertResult->sizeChangesBeforeVisiblePos += item->size(); + } else { + insertResult->sizeChangesAfterVisiblePos += item->size(); + } + } + if (removal.isMove()) { + currentChanges.removedItems.insert(removal.moveKey(item->index), item); + } else { + // track item so it is released later + currentChanges.removedItems.insertMulti(QDeclarativeChangeSet::MoveKey(), item); + (*removedCount)++; + } + it = visibleItems.erase(it); + } + } + } + return visibleAffected; +} + /* This may return 0 if the item is being created asynchronously. When the item becomes available, refill() will be called and the item diff --git a/src/quick/items/qquickitemview_p_p.h b/src/quick/items/qquickitemview_p_p.h index cfceca670a..a81aa6f54d 100644 --- a/src/quick/items/qquickitemview_p_p.h +++ b/src/quick/items/qquickitemview_p_p.h @@ -99,12 +99,13 @@ class QQuickItemViewPrivate : public QQuickFlickablePrivate public: QQuickItemViewPrivate(); - struct InsertionsResult { - QList<FxViewItem *> addedItems; - QList<FxViewItem *> movedBackwards; - qreal sizeAddedBeforeVisible; + struct ChangeResult { + QDeclarativeNullableValue<qreal> visiblePos; + qreal sizeChangesBeforeVisiblePos; + qreal sizeChangesAfterVisiblePos; - InsertionsResult() : sizeAddedBeforeVisible(0) {} + ChangeResult(const QDeclarativeNullableValue<qreal> &p) + : visiblePos(p), sizeChangesBeforeVisiblePos(0), sizeChangesAfterVisiblePos(0) {} }; enum BufferMode { NoBuffer = 0x00, BufferBefore = 0x01, BufferAfter = 0x02 }; @@ -145,6 +146,7 @@ public: void positionViewAtIndex(int index, int mode); void applyPendingChanges(); bool applyModelChanges(); + bool applyRemovalChange(const QDeclarativeChangeSet::Remove &removal, ChangeResult *changeResult, int *removedCount); void checkVisible() const; @@ -236,11 +238,12 @@ protected: virtual void repositionPackageItemAt(QQuickItem *item, int index) = 0; virtual void resetItemPosition(FxViewItem *item, FxViewItem *toItem) = 0; virtual void resetFirstItemPosition() = 0; - virtual void moveItemBy(FxViewItem *item, qreal forwards, qreal backwards) = 0; + virtual void adjustFirstItem(qreal forwards, qreal backwards) = 0; virtual void layoutVisibleItems() = 0; virtual void changedVisibleIndex(int newIndex) = 0; - virtual bool applyInsertionChange(const QDeclarativeChangeSet::Insert &, FxViewItem *, InsertionsResult *) = 0; + virtual bool applyInsertionChange(const QDeclarativeChangeSet::Insert &insert, ChangeResult *changeResult, bool *newVisibleItemsFirst, QList<FxViewItem *> *newItems) = 0; + virtual bool needsRefillForAddedOrRemovedIndex(int) const { return false; } virtual void initializeViewItem(FxViewItem *) {} diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp index b2e9c614bc..e2c428838b 100644 --- a/src/quick/items/qquicklistview.cpp +++ b/src/quick/items/qquicklistview.cpp @@ -95,7 +95,7 @@ public: virtual void repositionPackageItemAt(QQuickItem *item, int index); virtual void resetItemPosition(FxViewItem *item, FxViewItem *toItem); virtual void resetFirstItemPosition(); - virtual void moveItemBy(FxViewItem *item, qreal forwards, qreal backwards); + virtual void adjustFirstItem(qreal forwards, qreal backwards); virtual void createHighlight(); virtual void updateHighlight(); @@ -103,7 +103,7 @@ public: virtual void setPosition(qreal pos); virtual void layoutVisibleItems(); - bool applyInsertionChange(const QDeclarativeChangeSet::Insert &, FxViewItem *firstVisible, InsertionsResult *); + virtual bool applyInsertionChange(const QDeclarativeChangeSet::Insert &insert, ChangeResult *changeResult, bool *newVisibleItemsFirst, QList<FxViewItem *> *addedItems); virtual void updateSections(); QQuickItem *getSectionItem(const QString §ion); @@ -747,10 +747,12 @@ void QQuickListViewPrivate::resetFirstItemPosition() item->setPosition(0); } -void QQuickListViewPrivate::moveItemBy(FxViewItem *item, qreal forwards, qreal backwards) +void QQuickListViewPrivate::adjustFirstItem(qreal forwards, qreal backwards) { + if (!visibleItems.count()) + return; qreal diff = forwards - backwards; - static_cast<FxListItemSG*>(item)->setPosition(item->position() + diff); + static_cast<FxListItemSG*>(visibleItems.first())->setPosition(visibleItems.first()->position() + diff); } void QQuickListViewPrivate::createHighlight() @@ -2374,7 +2376,7 @@ void QQuickListView::updateSections() } } -bool QQuickListViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::Insert &change, FxViewItem *firstVisible, InsertionsResult *insertResult) +bool QQuickListViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::Insert &change, ChangeResult *insertResult, bool *newVisibleItemsFirst, QList<FxViewItem *> *addedItems) { int modelIndex = change.index; int count = change.count; @@ -2414,8 +2416,8 @@ bool QQuickListViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::In : visibleItems.last()->endPosition()+spacing; } - int prevAddedCount = insertResult->addedItems.count(); - if (firstVisible && pos < firstVisible->position()) { + int prevVisibleCount = visibleItems.count(); + if (insertResult->visiblePos.isValid() && pos < insertResult->visiblePos) { // Insert items before the visible item. int insertionIdx = index; int i = 0; @@ -2424,26 +2426,24 @@ bool QQuickListViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::In for (i = count-1; i >= 0; --i) { if (pos > from && insertionIdx < visibleIndex) { // item won't be visible, just note the size for repositioning - insertResult->sizeAddedBeforeVisible += averageSize + spacing; + insertResult->sizeChangesBeforeVisiblePos += averageSize + spacing; pos -= averageSize + spacing; } else { // item is before first visible e.g. in cache buffer FxViewItem *item = 0; - if (change.isMove() && (item = currentChanges.removedItems.take(change.moveKey(modelIndex + i)))) { - if (item->index > modelIndex + i) - insertResult->movedBackwards.append(item); + if (change.isMove() && (item = currentChanges.removedItems.take(change.moveKey(modelIndex + i)))) item->index = modelIndex + i; - } if (!item) item = createItem(modelIndex + i); if (!item) return false; visibleItems.insert(insertionIdx, item); - if (!change.isMove()) { - insertResult->addedItems.append(item); - insertResult->sizeAddedBeforeVisible += item->size(); - } + if (insertionIdx == 0) + *newVisibleItemsFirst = true; + if (!change.isMove()) + addedItems->append(item); + insertResult->sizeChangesBeforeVisiblePos += item->size() + spacing; pos -= item->size() + spacing; } index++; @@ -2453,19 +2453,19 @@ bool QQuickListViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::In int to = buffer+tempPos+size(); for (i = 0; i < count && pos <= to; ++i) { FxViewItem *item = 0; - if (change.isMove() && (item = currentChanges.removedItems.take(change.moveKey(modelIndex + i)))) { - if (item->index > modelIndex + i) - insertResult->movedBackwards.append(item); + if (change.isMove() && (item = currentChanges.removedItems.take(change.moveKey(modelIndex + i)))) item->index = modelIndex + i; - } if (!item) item = createItem(modelIndex + i); if (!item) return false; visibleItems.insert(index, item); + if (index == 0) + *newVisibleItemsFirst = true; if (!change.isMove()) - insertResult->addedItems.append(item); + addedItems->append(item); + insertResult->sizeChangesAfterVisiblePos += item->size() + spacing; pos += item->size() + spacing; ++index; } @@ -2479,7 +2479,7 @@ bool QQuickListViewPrivate::applyInsertionChange(const QDeclarativeChangeSet::In updateVisibleIndex(); - return insertResult->addedItems.count() > prevAddedCount; + return visibleItems.count() > prevVisibleCount; } |