From 837be34333bc1b7d85649418366f26d64a6d6b2c Mon Sep 17 00:00:00 2001 From: Frank Reininghaus Date: Fri, 5 Jul 2013 19:42:39 +0200 Subject: [PATCH] Keep the "item size hints" of moved items It's quite expensive to re-calculate them, so we should better just move them to the correct position, rather than throwing them away. REVIEW: 111399 --- src/kitemviews/kitemlistview.cpp | 2 +- .../private/kitemlistsizehintresolver.cpp | 14 +++++++++----- src/kitemviews/private/kitemlistsizehintresolver.h | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index 2ea6657a5a..347a4e6ea1 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -1165,7 +1165,7 @@ void KItemListView::slotItemsRemoved(const KItemRangeList& itemRanges) void KItemListView::slotItemsMoved(const KItemRange& itemRange, const QList& movedToIndexes) { - m_sizeHintResolver->itemsMoved(itemRange.index, itemRange.count); + m_sizeHintResolver->itemsMoved(itemRange, movedToIndexes); m_layouter->markAsDirty(); if (m_controller) { diff --git a/src/kitemviews/private/kitemlistsizehintresolver.cpp b/src/kitemviews/private/kitemlistsizehintresolver.cpp index 5db87f34db..e44630243b 100644 --- a/src/kitemviews/private/kitemlistsizehintresolver.cpp +++ b/src/kitemviews/private/kitemlistsizehintresolver.cpp @@ -114,13 +114,17 @@ void KItemListSizeHintResolver::itemsRemoved(const KItemRangeList& itemRanges) } } -void KItemListSizeHintResolver::itemsMoved(int index, int count) +void KItemListSizeHintResolver::itemsMoved(const KItemRange& range, const QList& movedToIndexes) { - while (count) { - m_sizeHintCache[index] = QSizeF(); - ++index; - --count; + QVector newSizeHintCache(m_sizeHintCache); + + const int movedRangeEnd = range.index + range.count; + for (int i = range.index; i < movedRangeEnd; ++i) { + const int newIndex = movedToIndexes.at(i); + newSizeHintCache[newIndex] = m_sizeHintCache.at(i); } + + m_sizeHintCache = newSizeHintCache; } void KItemListSizeHintResolver::itemsChanged(int index, int count, const QSet& roles) diff --git a/src/kitemviews/private/kitemlistsizehintresolver.h b/src/kitemviews/private/kitemlistsizehintresolver.h index 5ec5f4a215..486f9b6313 100644 --- a/src/kitemviews/private/kitemlistsizehintresolver.h +++ b/src/kitemviews/private/kitemlistsizehintresolver.h @@ -40,7 +40,7 @@ public: void itemsInserted(const KItemRangeList& itemRanges); void itemsRemoved(const KItemRangeList& itemRanges); - void itemsMoved(int index, int count); + void itemsMoved(const KItemRange& range, const QList& movedToIndexes); void itemsChanged(int index, int count, const QSet& roles); void clearCache();