diff options
| author | Méven Car <[email protected]> | 2023-02-12 11:21:53 +0000 |
|---|---|---|
| committer | Méven Car <[email protected]> | 2023-02-12 11:21:53 +0000 |
| commit | ba930ddb3635fe2d94d727e72aaf261513b28060 (patch) | |
| tree | 9199f7944d1b02830eb05f15a58fe1b1be1edbce /src/kitemviews/kfileitemmodelrolesupdater.cpp | |
| parent | a15def4e64dc08d508e7a511a20ad06e7e8a2e0c (diff) | |
Optimize Directory size counting
Two changes:
* Prioritise size counting for visible path
* stop the worker when switching dirs
Diffstat (limited to 'src/kitemviews/kfileitemmodelrolesupdater.cpp')
| -rw-r--r-- | src/kitemviews/kfileitemmodelrolesupdater.cpp | 40 |
1 files changed, 22 insertions, 18 deletions
diff --git a/src/kitemviews/kfileitemmodelrolesupdater.cpp b/src/kitemviews/kfileitemmodelrolesupdater.cpp index 4af4f3024..4fd126619 100644 --- a/src/kitemviews/kfileitemmodelrolesupdater.cpp +++ b/src/kitemviews/kfileitemmodelrolesupdater.cpp @@ -422,6 +422,10 @@ void KFileItemModelRolesUpdater::slotItemsRemoved(const KItemRangeList &itemRang m_hoverSequenceLoadedItems.clear(); killPreviewJob(); + + if (m_scanDirectories) { + m_directoryContentsCounter->stopWorker(); + } } else { // Only remove the items from m_finishedItems. They will be removed // from the other sets later on. @@ -537,7 +541,7 @@ void KFileItemModelRolesUpdater::slotGotPreview(const KFileItem &item, const QPi QPixmap scaledPixmap = transformPreviewPixmap(pixmap); - QHash<QByteArray, QVariant> data = rolesData(item); + QHash<QByteArray, QVariant> data = rolesData(item, index); const QStringList overlays = data["iconOverlays"].toStringList(); // Strangely KFileItem::overlays() returns empty string-values, so @@ -1210,13 +1214,10 @@ void KFileItemModelRolesUpdater::applySortRole(int index) data.insert("type", item.mimeComment()); } else if (m_model->sortRole() == "size" && item.isLocalFile() && !item.isSlow() && item.isDir()) { - const QString path = item.localPath(); - if (m_scanDirectories) { - m_directoryContentsCounter->scanDirectory(path); - } + startDirectorySizeCounting(item, index); } else { // Probably the sort role is a baloo role - just determine all roles. - data = rolesData(item); + data = rolesData(item, index); } disconnect(m_model, &KFileItemModel::itemsChanged, this, &KFileItemModelRolesUpdater::slotItemsChanged); @@ -1252,7 +1253,7 @@ bool KFileItemModelRolesUpdater::applyResolvedRoles(int index, ResolveHint hint) QHash<QByteArray, QVariant> data; if (resolveAll) { - data = rolesData(item); + data = rolesData(item, index); } if (!item.iconName().isEmpty()) { @@ -1273,7 +1274,19 @@ bool KFileItemModelRolesUpdater::applyResolvedRoles(int index, ResolveHint hint) return false; } -QHash<QByteArray, QVariant> KFileItemModelRolesUpdater::rolesData(const KFileItem &item) +void KFileItemModelRolesUpdater::startDirectorySizeCounting(const KFileItem &item, int index) +{ + // Tell m_directoryContentsCounter that we want to count the items + // inside the directory. The result will be received in slotDirectoryContentsCountReceived. + if (m_scanDirectories && item.isLocalFile()) { + const QString path = item.localPath(); + const auto priority = index >= m_firstVisibleIndex && index <= m_lastVisibleIndex ? KDirectoryContentsCounter::PathCountPriority::High + : KDirectoryContentsCounter::PathCountPriority::Normal; + m_directoryContentsCounter->scanDirectory(path, priority); + } +} + +QHash<QByteArray, QVariant> KFileItemModelRolesUpdater::rolesData(const KFileItem &item, int index) { QHash<QByteArray, QVariant> data; @@ -1281,16 +1294,7 @@ QHash<QByteArray, QVariant> KFileItemModelRolesUpdater::rolesData(const KFileIte const bool getIsExpandableRole = m_roles.contains("isExpandable"); if ((getSizeRole || getIsExpandableRole) && !item.isSlow() && item.isDir()) { - if (item.isLocalFile()) { - // Tell m_directoryContentsCounter that we want to count the items - // inside the directory. The result will be received in slotDirectoryContentsCountReceived. - if (m_scanDirectories) { - const QString path = item.localPath(); - m_directoryContentsCounter->scanDirectory(path); - } - } else if (getSizeRole) { - data.insert("size", -1); // -1 indicates an unknown number of items - } + startDirectorySizeCounting(item, index); } if (m_roles.contains("extension")) { |
