]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kfileitemmodelrolesupdater.cpp
fix folder size calculation on FUSE and network file systems
[dolphin.git] / src / kitemviews / kfileitemmodelrolesupdater.cpp
index 05eabbe5e2c8da1a711de22b3058300e55d91d70..42788d2fe6553b83629820b4451b7a500850f216 100644 (file)
@@ -67,6 +67,7 @@ KFileItemModelRolesUpdater::KFileItemModelRolesUpdater(KFileItemModel* model, QO
     m_resolvableRoles(),
     m_enabledPlugins(),
     m_localFileSizePreviewLimit(0),
+    m_scanDirectories(true),
     m_pendingSortRoleItems(),
     m_pendingIndexes(),
     m_pendingPreviewItems(),
@@ -317,6 +318,16 @@ qlonglong KFileItemModelRolesUpdater::localFileSizePreviewLimit() const
     return m_localFileSizePreviewLimit;
 }
 
+void KFileItemModelRolesUpdater::setScanDirectories(bool enabled)
+{
+    m_scanDirectories = enabled;
+}
+
+bool KFileItemModelRolesUpdater::scanDirectories() const
+{
+    return m_scanDirectories;
+}
+
 void KFileItemModelRolesUpdater::slotItemsInserted(const KItemRangeList& itemRanges)
 {
     QElapsedTimer timer;
@@ -765,9 +776,7 @@ void KFileItemModelRolesUpdater::slotDirectoryContentsCountReceived(const QStrin
 
             if (getSizeRole) {
                 data.insert("count", count);
-                if (size != -1) {
-                    data.insert("size", QVariant::fromValue(size));
-                }
+                data.insert("size", QVariant::fromValue(size));
             }
             if (getIsExpandableRole) {
                 data.insert("isExpandable", count > 0);
@@ -946,9 +955,9 @@ void KFileItemModelRolesUpdater::updateChangedItems()
     QList<int> visibleChangedIndexes;
     QList<int> invisibleChangedIndexes;
 
-    QMutableSetIterator<KFileItem> it(m_changedItems);
-    while (it.hasNext()) {
-        const KFileItem item = it.next();
+    // Iterate over a const copy because items are deleted within the loop
+    const auto changedItems = m_changedItems;
+    for (const KFileItem &item : changedItems) {
         const int index = m_model->index(item);
 
         if (index < 0) {
@@ -1001,7 +1010,9 @@ void KFileItemModelRolesUpdater::applySortRole(int index)
         data.insert("type", item.mimeComment());
     } else if (m_model->sortRole() == "size" && item.isLocalFile() && item.isDir()) {
         const QString path = item.localPath();
-        m_directoryContentsCounter->scanDirectory(path);
+        if (m_scanDirectories) {
+            m_directoryContentsCounter->scanDirectory(path);
+        }
     } else {
         // Probably the sort role is a baloo role - just determine all roles.
         data = rolesData(item);
@@ -1045,7 +1056,7 @@ bool KFileItemModelRolesUpdater::applyResolvedRoles(int index, ResolveHint hint)
             data = rolesData(item);
         }
 
-        if (QIcon::hasThemeIcon(item.iconName())) {
+        if (!item.iconName().isEmpty()) {
             data.insert("iconName", item.iconName());
         }
 
@@ -1075,8 +1086,10 @@ QHash<QByteArray, QVariant> KFileItemModelRolesUpdater::rolesData(const KFileIte
         if (item.isLocalFile()) {
             // Tell m_directoryContentsCounter that we want to count the items
             // inside the directory. The result will be received in slotDirectoryContentsCountReceived.
-            const QString path = item.localPath();
-            m_directoryContentsCounter->scanDirectory(path);
+            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
         }