┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/kitemviews/kitemlistview.cpp
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2011-09-27 20:42:58 +0200
committerPeter Penz <[email protected]>2011-09-27 20:45:16 +0200
commitec38f1cdb641f0b277100edd92b268ec856e2ece (patch)
tree0df979cecbed0a23b2ddb10c99ccd6f1d90109c4 /src/kitemviews/kitemlistview.cpp
parent34a20cec096eaee4eb09f7b2cbec7aa47f7ee4a0 (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.cpp51
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;