diff options
| author | Peter Penz <[email protected]> | 2011-09-27 20:42:58 +0200 |
|---|---|---|
| committer | Peter Penz <[email protected]> | 2011-09-27 20:45:16 +0200 |
| commit | ec38f1cdb641f0b277100edd92b268ec856e2ece (patch) | |
| tree | 0df979cecbed0a23b2ddb10c99ccd6f1d90109c4 /src/kitemviews/kitemlistview.cpp | |
| parent | 34a20cec096eaee4eb09f7b2cbec7aa47f7ee4a0 (diff) | |
Details view: Improve performance
When inserting items or when updating the item-roles there is no
need to recalculate the column-widths for all items to get an
optimized column-width.
Diffstat (limited to 'src/kitemviews/kitemlistview.cpp')
| -rw-r--r-- | src/kitemviews/kitemlistview.cpp | 51 |
1 files changed, 46 insertions, 5 deletions
diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index 6d96c0999..1224ff6bd 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -404,8 +404,9 @@ QSizeF KItemListView::itemSizeHint(int index) const return itemSize(); } -QHash<QByteArray, QSizeF> KItemListView::visibleRolesSizes() const +QHash<QByteArray, QSizeF> KItemListView::visibleRolesSizes(const KItemRangeList& itemRanges) const { + Q_UNUSED(itemRanges); return QHash<QByteArray, QSizeF>(); } @@ -604,7 +605,7 @@ void KItemListView::resizeEvent(QGraphicsSceneResizeEvent* event) void KItemListView::slotItemsInserted(const KItemRangeList& itemRanges) { - updateVisibleRoleSizes(); + updateVisibleRoleSizes(itemRanges); const bool hasMultipleRanges = (itemRanges.count() > 1); if (hasMultipleRanges) { @@ -761,7 +762,7 @@ void KItemListView::slotItemsChanged(const KItemRangeList& itemRanges, { const bool updateSizeHints = itemSizeHintUpdateRequired(roles); if (updateSizeHints) { - updateVisibleRoleSizes(); + updateVisibleRoleSizes(itemRanges); } foreach (const KItemRange& itemRange, itemRanges) { @@ -1381,13 +1382,48 @@ QHash<QByteArray, qreal> KItemListView::headerRolesWidths() const return rolesWidths; } -void KItemListView::updateVisibleRoleSizes() +void KItemListView::updateVisibleRoleSizes(const KItemRangeList& itemRanges) { if (!m_itemSize.isEmpty() || m_useHeaderWidths) { return; } - m_visibleRolesSizes = visibleRolesSizes(); + const int itemCount = m_model->count(); + int rangesItemCount = 0; + foreach (const KItemRange& range, itemRanges) { + rangesItemCount += range.count; + } + + if (itemCount == rangesItemCount) { + // The sizes of all roles need to be determined + m_visibleRolesSizes = visibleRolesSizes(itemRanges); + } else { + // Only a sub range of the roles need to be determined. + // The chances are good that the sizes of the sub ranges + // already fit into the available sizes and hence no + // expensive update might be required. + bool updateRequired = false; + + const QHash<QByteArray, QSizeF> updatedSizes = visibleRolesSizes(itemRanges); + QHashIterator<QByteArray, QSizeF> it(updatedSizes); + while (it.hasNext()) { + it.next(); + const QByteArray& role = it.key(); + const QSizeF& updatedSize = it.value(); + const QSizeF currentSize = m_visibleRolesSizes.value(role); + if (updatedSize.width() > currentSize.width() || updatedSize.height() > currentSize.height()) { + m_visibleRolesSizes.insert(role, updatedSize); + updateRequired = true; + } + } + + if (!updateRequired) { + // All the updated sizes are smaller than the current sizes and no change + // of the roles-widths is required + return; + } + } + if (m_header) { m_header->setVisibleRolesWidths(headerRolesWidths()); } @@ -1421,6 +1457,11 @@ void KItemListView::updateVisibleRoleSizes() } } +void KItemListView::updateVisibleRoleSizes() +{ + updateVisibleRoleSizes(KItemRangeList() << KItemRange(0, m_model->count())); +} + int KItemListView::calculateAutoScrollingIncrement(int pos, int range, int oldInc) { int inc = 0; |
