┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2011-11-04 23:31:11 +0100
committerPeter Penz <[email protected]>2011-11-04 23:34:39 +0100
commit49d75cfe45860df18e34964a0d30196708935df8 (patch)
treea1531314480283ef956d94a824d8763b85d53cf5 /src
parenteadbf920b5dffdf2d1548240c25ec2eaf835aad5 (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.cpp2
-rw-r--r--src/kitemviews/kitemlistsizehintresolver.cpp10
-rw-r--r--src/kitemviews/kitemlistsizehintresolver_p.h5
-rw-r--r--src/kitemviews/kitemlistview.cpp28
-rw-r--r--src/kitemviews/kitemmodelbase.h6
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;
/**