diff options
| -rw-r--r-- | src/kitemviews/kfileitemmodelrolesupdater.cpp | 54 | ||||
| -rw-r--r-- | src/kitemviews/kfileitemmodelrolesupdater.h | 11 |
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; |
