]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kfileitemmodelrolesupdater.cpp
Merge branch 'release/21.04'
[dolphin.git] / src / kitemviews / kfileitemmodelrolesupdater.cpp
index 05eabbe5e2c8da1a711de22b3058300e55d91d70..a603a94dab77d750a83606fcf6e71ddf900e0055 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,15 +776,17 @@ 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);
             }
 
+            disconnect(m_model, &KFileItemModel::itemsChanged,
+                       this,    &KFileItemModelRolesUpdater::slotItemsChanged);
             m_model->setData(index, data);
+            connect(m_model, &KFileItemModel::itemsChanged,
+                       this,    &KFileItemModelRolesUpdater::slotItemsChanged);
         }
     }
 }
@@ -945,16 +958,19 @@ void KFileItemModelRolesUpdater::updateChangedItems()
 
     QList<int> visibleChangedIndexes;
     QList<int> invisibleChangedIndexes;
+    visibleChangedIndexes.reserve(m_changedItems.size());
+    invisibleChangedIndexes.reserve(m_changedItems.size());
 
-    QMutableSetIterator<KFileItem> it(m_changedItems);
-    while (it.hasNext()) {
-        const KFileItem item = it.next();
+    auto changedItemsIt = m_changedItems.begin();
+    while (changedItemsIt != m_changedItems.end()) {
+        const auto& item = *changedItemsIt;
         const int index = m_model->index(item);
 
         if (index < 0) {
-            m_changedItems.remove(item);
+            changedItemsIt = m_changedItems.erase(changedItemsIt);
             continue;
         }
+        ++changedItemsIt;
 
         if (index >= m_firstVisibleIndex && index <= m_lastVisibleIndex) {
             visibleChangedIndexes.append(index);
@@ -1001,7 +1017,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 +1063,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 +1093,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
         }
@@ -1147,7 +1167,9 @@ QList<int> KFileItemModelRolesUpdater::indexesToResolve() const
     const int count = m_model->count();
 
     QList<int> result;
-    result.reserve(ResolveAllItemsLimit);
+    result.reserve(qMin(count, (m_lastVisibleIndex - m_firstVisibleIndex + 1) +
+                               ResolveAllItemsLimit +
+                               (2 * m_maximumVisibleItems)));
 
     // Add visible items.
     for (int i = m_firstVisibleIndex; i <= m_lastVisibleIndex; ++i) {
@@ -1172,14 +1194,14 @@ QList<int> KFileItemModelRolesUpdater::indexesToResolve() const
     }
 
     // Add items on the last page.
-    const int beginLastPage = qMax(qMin(endExtendedVisibleRange + 1, count - 1), count - m_maximumVisibleItems);
+    const int beginLastPage = qMax(endExtendedVisibleRange + 1, count - m_maximumVisibleItems);
     for (int i = beginLastPage; i < count; ++i) {
         result.append(i);
     }
 
     // Add items on the first page.
-    const int endFirstPage = qMin(qMax(beginExtendedVisibleRange - 1, 0), m_maximumVisibleItems);
-    for (int i = 0; i <= endFirstPage; ++i) {
+    const int endFirstPage = qMin(beginExtendedVisibleRange, m_maximumVisibleItems);
+    for (int i = 0; i < endFirstPage; ++i) {
         result.append(i);
     }
 
@@ -1191,7 +1213,7 @@ QList<int> KFileItemModelRolesUpdater::indexesToResolve() const
         --remainingItems;
     }
 
-    for (int i = beginExtendedVisibleRange - 1; i > endFirstPage && remainingItems > 0; --i) {
+    for (int i = beginExtendedVisibleRange - 1; i >= endFirstPage && remainingItems > 0; --i) {
         result.append(i);
         --remainingItems;
     }