KItemListSizeHintResolver::KItemListSizeHintResolver(const KItemListView* itemListView) :
m_itemListView(itemListView),
- m_sizeHintCache()
+ m_sizeHintCache(),
+ m_needsResolving(false)
{
}
{
}
-QSizeF KItemListSizeHintResolver::sizeHint(int index) const
+QSizeF KItemListSizeHintResolver::sizeHint(int index)
{
- QSizeF size = m_sizeHintCache.at(index);
- if (size.isEmpty()) {
- size = m_itemListView->itemSizeHint(index);
- m_sizeHintCache[index] = size;
- }
- return size;
+ updateCache();
+ return m_sizeHintCache.at(index);
}
void KItemListSizeHintResolver::itemsInserted(const KItemRangeList& itemRanges)
}
}
+ m_needsResolving = true;
+
Q_ASSERT(m_sizeHintCache.count() == m_itemListView->model()->count());
}
}
}
-void KItemListSizeHintResolver::itemsMoved(int index, int count)
+void KItemListSizeHintResolver::itemsMoved(const KItemRange& range, const QList<int>& movedToIndexes)
{
- while (count) {
- m_sizeHintCache[index] = QSizeF();
- ++index;
- --count;
+ QVector<QSizeF> newSizeHintCache(m_sizeHintCache);
+
+ const int movedRangeEnd = range.index + range.count;
+ for (int i = range.index; i < movedRangeEnd; ++i) {
+ const int newIndex = movedToIndexes.at(i - range.index);
+ newSizeHintCache[newIndex] = m_sizeHintCache.at(i);
}
+
+ m_sizeHintCache = newSizeHintCache;
}
void KItemListSizeHintResolver::itemsChanged(int index, int count, const QSet<QByteArray>& roles)
++index;
--count;
}
+
+ m_needsResolving = true;
}
void KItemListSizeHintResolver::clearCache()
{
- const int count = m_sizeHintCache.count();
- for (int i = 0; i < count; ++i) {
- m_sizeHintCache[i] = QSizeF();
+ m_sizeHintCache.fill(QSizeF());
+ m_needsResolving = true;
+}
+
+void KItemListSizeHintResolver::updateCache()
+{
+ if (m_needsResolving) {
+ m_itemListView->calculateItemSizeHints(m_sizeHintCache);
+ m_needsResolving = false;
}
}