┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/kitemviews/kfileitemmodelrolesupdater.cpp54
-rw-r--r--src/kitemviews/kfileitemmodelrolesupdater.h11
2 files changed, 65 insertions, 0 deletions
diff --git a/src/kitemviews/kfileitemmodelrolesupdater.cpp b/src/kitemviews/kfileitemmodelrolesupdater.cpp
index 28024fd68..bfb4e644e 100644
--- a/src/kitemviews/kfileitemmodelrolesupdater.cpp
+++ b/src/kitemviews/kfileitemmodelrolesupdater.cpp
@@ -88,6 +88,8 @@ KFileItemModelRolesUpdater::KFileItemModelRolesUpdater(KFileItemModel* model, QO
m_resolvableRoles(),
m_enabledPlugins(),
m_pendingSortRoleItems(),
+ m_hasUnknownIcons(false),
+ m_firstIndexWithoutIcon(0),
m_pendingIndexes(),
m_pendingPreviewItems(),
m_previewJob(),
@@ -328,6 +330,10 @@ void KFileItemModelRolesUpdater::slotItemsInserted(const KItemRangeList& itemRan
QElapsedTimer timer;
timer.start();
+ const int firstInsertedIndex = itemRanges.first().index;
+ m_firstIndexWithoutIcon = qMin(m_firstIndexWithoutIcon, firstInsertedIndex);
+ m_hasUnknownIcons = true;
+
// Determine the sort role synchronously for as many items as possible.
if (m_resolvableRoles.contains(m_model->sortRole())) {
int insertedCount = 0;
@@ -364,6 +370,11 @@ void KFileItemModelRolesUpdater::slotItemsRemoved(const KItemRangeList& itemRang
const bool allItemsRemoved = (m_model->count() == 0);
+ if (m_hasUnknownIcons) {
+ const int firstRemovedIndex = itemRanges.first().index;
+ m_firstIndexWithoutIcon = qMin(m_firstIndexWithoutIcon, firstRemovedIndex);
+ }
+
if (!m_watchedDirs.isEmpty()) {
// Don't let KDirWatch watch for removed items
if (allItemsRemoved) {
@@ -445,6 +456,11 @@ void KFileItemModelRolesUpdater::slotItemsMoved(const KItemRange& itemRange, QLi
Q_UNUSED(itemRange);
Q_UNUSED(movedToIndexes);
+ if (m_hasUnknownIcons) {
+ const int firstMovedIndex = itemRange.index;
+ m_firstIndexWithoutIcon = qMin(m_firstIndexWithoutIcon, firstMovedIndex);
+ }
+
// The visible items might have changed.
startUpdating();
}
@@ -812,6 +828,13 @@ void KFileItemModelRolesUpdater::startUpdating()
// Determine the icons for the visible items synchronously.
updateVisibleIcons();
+ // Try to do at least a fast icon loading (without determining the
+ // mime type) for all items, to reduce the risk that the user sees
+ // "unknown" icons when scrolling.
+ if (m_hasUnknownIcons) {
+ updateAllIconsFast(MaxBlockTimeout - timer.elapsed());
+ }
+
// A detailed update of the items in and near the visible area
// only makes sense if sorting is finished.
if (m_state == ResolvingSortRole) {
@@ -886,6 +909,37 @@ void KFileItemModelRolesUpdater::updateVisibleIcons()
this, SLOT(slotItemsChanged(KItemRangeList,QSet<QByteArray>)));
}
+void KFileItemModelRolesUpdater::updateAllIconsFast(int timeout)
+{
+ if (timeout <= 0) {
+ return;
+ }
+
+ QElapsedTimer timer;
+ timer.start();
+
+ disconnect(m_model, SIGNAL(itemsChanged(KItemRangeList,QSet<QByteArray>)),
+ this, SLOT(slotItemsChanged(KItemRangeList,QSet<QByteArray>)));
+
+ const int count = m_model->count();
+ while (m_firstIndexWithoutIcon < count && timer.elapsed() < timeout) {
+ if (!m_model->data(m_firstIndexWithoutIcon).contains("iconName")) {
+ const KFileItem item = m_model->fileItem(m_firstIndexWithoutIcon);
+ QHash<QByteArray, QVariant> data;
+ data.insert("iconName", item.iconName());
+ m_model->setData(m_firstIndexWithoutIcon, data);
+ }
+ ++m_firstIndexWithoutIcon;
+ }
+
+ if (m_firstIndexWithoutIcon == count) {
+ m_hasUnknownIcons = false;
+ }
+
+ connect(m_model, SIGNAL(itemsChanged(KItemRangeList,QSet<QByteArray>)),
+ this, SLOT(slotItemsChanged(KItemRangeList,QSet<QByteArray>)));
+}
+
void KFileItemModelRolesUpdater::startPreviewJob()
{
m_state = PreviewJobRunning;
diff --git a/src/kitemviews/kfileitemmodelrolesupdater.h b/src/kitemviews/kfileitemmodelrolesupdater.h
index 605c36f81..20ce21cfa 100644
--- a/src/kitemviews/kfileitemmodelrolesupdater.h
+++ b/src/kitemviews/kfileitemmodelrolesupdater.h
@@ -233,6 +233,12 @@ private:
void updateVisibleIcons();
/**
+ * Tries to load at least preliminary icons (without determining the
+ * mime type) for all items for \a timeout milliseconds.
+ */
+ void updateAllIconsFast(int timeout);
+
+ /**
* Creates previews for the items starting from the first item in
* m_pendingPreviewItems.
* @see slotGotPreview()
@@ -320,6 +326,11 @@ private:
// Items for which the sort role still has to be determined.
QSet<KFileItem> m_pendingSortRoleItems;
+ // Determines if the next call of startUpdating() will try to do a fast
+ // icon loading (i.e., without determining the mime type) for all items.
+ bool m_hasUnknownIcons;
+ int m_firstIndexWithoutIcon;
+
// Indexes of items which still have to be handled by
// resolveNextPendingRoles().
QList<int> m_pendingIndexes;