From eda483436bb9513e7afc059ffcabc129305bc435 Mon Sep 17 00:00:00 2001 From: Frank Reininghaus Date: Thu, 20 Jun 2013 19:18:22 +0200 Subject: Try to do at least a "fast" icon loading for all items If all icons for the visible items could be loaded in 200 ms, we continue loading icons without mime type determination for all items until the 200 ms are over. This reduces the risk that the user ever sees "unknown" icons. REVIEW: 111011 --- src/kitemviews/kfileitemmodelrolesupdater.cpp | 54 +++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) (limited to 'src/kitemviews/kfileitemmodelrolesupdater.cpp') 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))); } +void KFileItemModelRolesUpdater::updateAllIconsFast(int timeout) +{ + if (timeout <= 0) { + return; + } + + QElapsedTimer timer; + timer.start(); + + disconnect(m_model, SIGNAL(itemsChanged(KItemRangeList,QSet)), + this, SLOT(slotItemsChanged(KItemRangeList,QSet))); + + 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 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)), + this, SLOT(slotItemsChanged(KItemRangeList,QSet))); +} + void KFileItemModelRolesUpdater::startPreviewJob() { m_state = PreviewJobRunning; -- cgit v1.3