diff options
| author | Peter Penz <[email protected]> | 2011-11-04 23:31:11 +0100 |
|---|---|---|
| committer | Peter Penz <[email protected]> | 2011-11-04 23:34:39 +0100 |
| commit | 49d75cfe45860df18e34964a0d30196708935df8 (patch) | |
| tree | a1531314480283ef956d94a824d8763b85d53cf5 /src | |
| parent | eadbf920b5dffdf2d1548240c25ec2eaf835aad5 (diff) | |
Fix layout-issues when sorting by roles that are changed
When sorting is enabled for a role that gets changed e.g. because
a value like the MIME-type is determined asynchronously, then the
layout might get messed up.
slotItemsMoved() has been adjusted to invalidate the sizehint-cache
and to update the group-headers.
BUG: 285542
FIXED-IN: 4.8.0
Diffstat (limited to 'src')
| -rw-r--r-- | src/kitemviews/kfileitemmodel.cpp | 2 | ||||
| -rw-r--r-- | src/kitemviews/kitemlistsizehintresolver.cpp | 10 | ||||
| -rw-r--r-- | src/kitemviews/kitemlistsizehintresolver_p.h | 5 | ||||
| -rw-r--r-- | src/kitemviews/kitemlistview.cpp | 28 | ||||
| -rw-r--r-- | src/kitemviews/kitemmodelbase.h | 6 |
5 files changed, 36 insertions, 15 deletions
diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index afc6decee..c0c442e23 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -88,7 +88,7 @@ KFileItemModel::KFileItemModel(KDirLister* dirLister, QObject* parent) : // for a lot of items within a quite small timeslot. To prevent expensive resortings the // resorting is postponed until the timer has been exceeded. m_resortAllItemsTimer = new QTimer(this); - m_resortAllItemsTimer->setInterval(1000); + m_resortAllItemsTimer->setInterval(500); m_resortAllItemsTimer->setSingleShot(true); connect(m_resortAllItemsTimer, SIGNAL(timeout()), this, SLOT(resortAllItems())); diff --git a/src/kitemviews/kitemlistsizehintresolver.cpp b/src/kitemviews/kitemlistsizehintresolver.cpp index 00eb79bdd..0520fac04 100644 --- a/src/kitemviews/kitemlistsizehintresolver.cpp +++ b/src/kitemviews/kitemlistsizehintresolver.cpp @@ -60,11 +60,13 @@ void KItemListSizeHintResolver::itemsRemoved(int index, int count) m_sizeHintCache.erase(begin, end); } -void KItemListSizeHintResolver::itemsMoved(int from, int to, int count) +void KItemListSizeHintResolver::itemsMoved(int index, int count) { - Q_UNUSED(from); - Q_UNUSED(to); - Q_UNUSED(count); + while (count) { + m_sizeHintCache[index] = QSizeF(); + ++index; + --count; + } } void KItemListSizeHintResolver::itemsChanged(int index, int count, const QSet<QByteArray>& roles) diff --git a/src/kitemviews/kitemlistsizehintresolver_p.h b/src/kitemviews/kitemlistsizehintresolver_p.h index f4f65eccb..1345e0321 100644 --- a/src/kitemviews/kitemlistsizehintresolver_p.h +++ b/src/kitemviews/kitemlistsizehintresolver_p.h @@ -28,6 +28,9 @@ class KItemListView; +/** + * @brief Calculates and caches the sizehints of items in KItemListView. + */ class LIBDOLPHINPRIVATE_EXPORT KItemListSizeHintResolver { public: @@ -37,7 +40,7 @@ public: void itemsInserted(int index, int count); void itemsRemoved(int index, int count); - void itemsMoved(int from, int to, int count); + void itemsMoved(int index, int count); void itemsChanged(int index, int count, const QSet<QByteArray>& roles); void clearCache(); diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index b11fe905d..7976f397b 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -708,7 +708,6 @@ void KItemListView::slotItemsInserted(const KItemRangeList& itemRanges) if (!hasMultipleRanges) { doLayout(Animation, index, count); - update(); } } @@ -789,7 +788,6 @@ void KItemListView::slotItemsRemoved(const KItemRangeList& itemRanges) m_layouter->markAsDirty(); if (!hasMultipleRanges) { doLayout(Animation, index, -count); - update(); } } @@ -804,6 +802,13 @@ void KItemListView::slotItemsRemoved(const KItemRangeList& itemRanges) void KItemListView::slotItemsMoved(const KItemRange& itemRange, const QList<int>& movedToIndexes) { + m_sizeHintResolver->itemsMoved(itemRange.index, itemRange.count); + m_layouter->markAsDirty(); + + if (m_controller) { + m_controller->selectionManager()->itemsMoved(itemRange, movedToIndexes); + } + const int firstVisibleMovedIndex = qMax(firstVisibleIndex(), itemRange.index); const int lastVisibleMovedIndex = qMin(lastVisibleIndex(), itemRange.index + itemRange.count - 1); @@ -811,12 +816,14 @@ void KItemListView::slotItemsMoved(const KItemRange& itemRange, const QList<int> KItemListWidget* widget = m_visibleItems.value(index); if (widget) { updateWidgetProperties(widget, index); + if (m_grouped) { + updateGroupHeaderForWidget(widget); + } + initializeItemListWidget(widget); } } - if (m_controller) { - m_controller->selectionManager()->itemsMoved(itemRange, movedToIndexes); - } + doLayout(NoAnimation, 0, 0); } void KItemListView::slotItemsChanged(const KItemRangeList& itemRanges, @@ -854,9 +861,6 @@ void KItemListView::slotItemsChanged(const KItemRangeList& itemRanges, // in modified group headers updateVisibleGroupHeaders(); doLayout(NoAnimation, 0, 0); - if (!m_layoutTimer->isActive()) { - m_layoutTimer->start(); - } } } } @@ -1328,7 +1332,11 @@ void KItemListView::doLayout(LayoutAnimationHint hint, int changedIndex, int cha widget->setVisible(true); if (widget->size() != itemBounds.size()) { - m_animation->start(widget, KItemListViewAnimation::ResizeAnimation, itemBounds.size()); + if (animate) { + m_animation->start(widget, KItemListViewAnimation::ResizeAnimation, itemBounds.size()); + } else { + widget->resize(itemBounds.size()); + } } } @@ -1484,6 +1492,8 @@ void KItemListView::updateWidgetProperties(KItemListWidget* widget, int index) void KItemListView::updateGroupHeaderForWidget(KItemListWidget* widget) { + Q_ASSERT(m_grouped); + const int index = widget->index(); if (!m_layouter->isFirstGroupItem(index)) { // The widget does not represent the first item of a group diff --git a/src/kitemviews/kitemmodelbase.h b/src/kitemviews/kitemmodelbase.h index 693ffb763..edca15bd1 100644 --- a/src/kitemviews/kitemmodelbase.h +++ b/src/kitemviews/kitemmodelbase.h @@ -108,6 +108,12 @@ public: */ virtual QString roleDescription(const QByteArray& role) const; + /** + * @return List of group headers. Each list-item consists of the index of the item + * that represents the first item of a group and a value represented + * as QVariant. The value is shown by an instance of KItemListGroupHeader. + * Per default an empty list is returned. + */ virtual QList<QPair<int, QVariant> > groups() const; /** |
