diff options
-rw-r--r-- | src/quick/util/qdeclarativelistcompositor.cpp | 35 | ||||
-rw-r--r-- | tests/auto/declarative/qdeclarativelistcompositor/tst_qdeclarativelistcompositor.cpp | 17 |
2 files changed, 33 insertions, 19 deletions
diff --git a/src/quick/util/qdeclarativelistcompositor.cpp b/src/quick/util/qdeclarativelistcompositor.cpp index d73d76e386..e43a8a771f 100644 --- a/src/quick/util/qdeclarativelistcompositor.cpp +++ b/src/quick/util/qdeclarativelistcompositor.cpp @@ -872,9 +872,7 @@ void QDeclarativeListCompositor::listItemsRemoved( { QT_DECLARATIVE_TRACE_LISTCOMPOSITOR(<< list << *removals) - for (iterator it(m_ranges.next, 0, Default, m_groupCount); - *it != &m_ranges && !removals->isEmpty(); - *it = it->next) { + for (iterator it(m_ranges.next, 0, Default, m_groupCount); *it != &m_ranges; *it = it->next) { if (it->list != list || it->flags == CacheFlag) { it.incrementIndexes(it->count); continue; @@ -920,21 +918,20 @@ void QDeclarativeListCompositor::listItemsRemoved( translatedRemoval.moveId = ++moveId; movedFlags->append(MovedFlags(moveId, it->flags & ~AppendFlag)); - removal = removals->insert(removal, QDeclarativeChangeSet::Remove( - removal->index, removeCount, translatedRemoval.moveId)); - ++removal; - insertion = insertions->insert(insertion, QDeclarativeChangeSet::Insert( - insertion->index, removeCount, translatedRemoval.moveId)); - ++insertion; - - removal->count -= removeCount; - insertion->index += removeCount; - insertion->count -= removeCount; - if (removal->count == 0) { - removal = removals->erase(removal); - insertion = insertions->erase(insertion); - --removal; - --insertion; + if (removeCount < removal->count) { + removal = removals->insert(removal, QDeclarativeChangeSet::Remove( + removal->index, removeCount, translatedRemoval.moveId)); + ++removal; + insertion = insertions->insert(insertion, QDeclarativeChangeSet::Insert( + insertion->index, removeCount, translatedRemoval.moveId)); + ++insertion; + + removal->count -= removeCount; + insertion->index += removeCount; + insertion->count -= removeCount; + } else { + removal->moveId = translatedRemoval.moveId; + insertion->moveId = translatedRemoval.moveId; } } else { if (offset > 0) { @@ -989,7 +986,7 @@ void QDeclarativeListCompositor::listItemsRemoved( it->previous->count += it->count; it->previous->flags = it->flags; it.incrementIndexes(it->count); - *it = erase(*it); + *it = erase(*it)->previous; removed = true; } } diff --git a/tests/auto/declarative/qdeclarativelistcompositor/tst_qdeclarativelistcompositor.cpp b/tests/auto/declarative/qdeclarativelistcompositor/tst_qdeclarativelistcompositor.cpp index ed786ebc35..43ae2f6c7e 100644 --- a/tests/auto/declarative/qdeclarativelistcompositor/tst_qdeclarativelistcompositor.cpp +++ b/tests/auto/declarative/qdeclarativelistcompositor/tst_qdeclarativelistcompositor.cpp @@ -1490,6 +1490,23 @@ void tst_qdeclarativelistcompositor::listItemsMoved_data() << IndexArray(defaultIndexes) << IndexArray() << IndexArray(); + } { static const int cacheIndexes[] = {/*A*/0,1,2,3}; + static const int defaultIndexes[] = {/*A*/0,1,2,3}; + static const int selectionIndexes[] = {/*A*/3}; + QTest::newRow("Move selection") + << (RangeList() + << Range(a, 0, 2, C::PrependFlag | C::DefaultFlag | C::CacheFlag) + << Range(a, 2, 1, C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag) + << Range(a, 3, 1, C::AppendFlag | C::PrependFlag | C::DefaultFlag | C::CacheFlag)) + << a << 2 << 3 << 1 + << (RemoveList() + << Remove(0, 0, 2, 2, 1, C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag, 0)) + << (InsertList() + << Insert(0, 0, 3, 3, 1, C::PrependFlag | SelectionFlag | C::DefaultFlag | C::CacheFlag, 0)) + << IndexArray(cacheIndexes) + << IndexArray(defaultIndexes) + << IndexArray() + << IndexArray(selectionIndexes); } } |