]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kfileitemmodelrolesupdater.cpp
Tell translators to leave the ' alone
[dolphin.git] / src / kitemviews / kfileitemmodelrolesupdater.cpp
index b9c6ccd29526d26cea1f3fa65f9574f162015120..a603a94dab77d750a83606fcf6e71ddf900e0055 100644 (file)
@@ -27,6 +27,7 @@
 #endif
 
 #include <QApplication>
+#include <QIcon>
 #include <QPainter>
 #include <QElapsedTimer>
 #include <QTimer>
@@ -66,6 +67,7 @@ KFileItemModelRolesUpdater::KFileItemModelRolesUpdater(KFileItemModel* model, QO
     m_resolvableRoles(),
     m_enabledPlugins(),
     m_localFileSizePreviewLimit(0),
+    m_scanDirectories(true),
     m_pendingSortRoleItems(),
     m_pendingIndexes(),
     m_pendingPreviewItems(),
@@ -316,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;
@@ -494,7 +506,7 @@ void KFileItemModelRolesUpdater::slotGotPreview(const KFileItem& item, const QPi
 
     QPixmap scaledPixmap = pixmap;
 
-    if (!pixmap.hasAlpha()
+    if (!pixmap.hasAlpha() && !pixmap.isNull()
         && m_iconSize.width()  > KIconLoader::SizeSmallMedium
         && m_iconSize.height() > KIconLoader::SizeSmallMedium) {
         if (m_enlargeSmallPreviews) {
@@ -525,7 +537,7 @@ void KFileItemModelRolesUpdater::slotGotPreview(const KFileItem& item, const QPi
                 KPixmapModifier::applyFrame(scaledPixmap, m_iconSize);
             }
         }
-    } else {
+    } else if (!pixmap.isNull()) {
         KPixmapModifier::scale(scaledPixmap, m_iconSize * qApp->devicePixelRatio());
         scaledPixmap.setDevicePixelRatio(qApp->devicePixelRatio());
     }
@@ -538,12 +550,14 @@ void KFileItemModelRolesUpdater::slotGotPreview(const KFileItem& item, const QPi
     // It is more efficient to do it here, as KIconLoader::drawOverlays()
     // assumes that an overlay will be drawn and has some additional
     // setup time.
-    for (const QString& overlay : overlays) {
-        if (!overlay.isEmpty()) {
-            // There is at least one overlay, draw all overlays above m_pixmap
-            // and cancel the check
-            KIconLoader::global()->drawOverlays(overlays, scaledPixmap, KIconLoader::Desktop);
-            break;
+    if (!scaledPixmap.isNull()) {
+        for (const QString& overlay : overlays) {
+            if (!overlay.isEmpty()) {
+                // There is at least one overlay, draw all overlays above m_pixmap
+                // and cancel the check
+                KIconLoader::global()->drawOverlays(overlays, scaledPixmap, KIconLoader::Desktop);
+                break;
+            }
         }
     }
 
@@ -762,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);
         }
     }
 }
@@ -942,14 +958,19 @@ void KFileItemModelRolesUpdater::updateChangedItems()
 
     QList<int> visibleChangedIndexes;
     QList<int> invisibleChangedIndexes;
+    visibleChangedIndexes.reserve(m_changedItems.size());
+    invisibleChangedIndexes.reserve(m_changedItems.size());
 
-    for (const KFileItem& item : qAsConst(m_changedItems)) {
+    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);
@@ -996,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);
@@ -1040,7 +1063,9 @@ bool KFileItemModelRolesUpdater::applyResolvedRoles(int index, ResolveHint hint)
             data = rolesData(item);
         }
 
-        data.insert("iconName", item.iconName());
+        if (!item.iconName().isEmpty()) {
+            data.insert("iconName", item.iconName());
+        }
 
         if (m_clearPreviews) {
             data.insert("iconPixmap", QPixmap());
@@ -1068,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
         }
@@ -1140,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) {
@@ -1165,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);
     }
 
@@ -1184,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;
     }