]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kfileitemmodelrolesupdater.cpp
Allow folder creation on desktop via F10 shortcut
[dolphin.git] / src / kitemviews / kfileitemmodelrolesupdater.cpp
index b9c6ccd29526d26cea1f3fa65f9574f162015120..f27c421b4051ddb16d386d91a51dc4fb3c9197fe 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;
+            }
         }
     }
 
@@ -943,7 +957,9 @@ void KFileItemModelRolesUpdater::updateChangedItems()
     QList<int> visibleChangedIndexes;
     QList<int> invisibleChangedIndexes;
 
-    for (const KFileItem& item : qAsConst(m_changedItems)) {
+    // 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) {
@@ -996,7 +1012,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 +1058,9 @@ bool KFileItemModelRolesUpdater::applyResolvedRoles(int index, ResolveHint hint)
             data = rolesData(item);
         }
 
-        data.insert("iconName", item.iconName());
+        if (QIcon::hasThemeIcon(item.iconName())) {
+            data.insert("iconName", item.iconName());
+        }
 
         if (m_clearPreviews) {
             data.insert("iconPixmap", QPixmap());
@@ -1065,11 +1085,13 @@ QHash<QByteArray, QVariant> KFileItemModelRolesUpdater::rolesData(const KFileIte
     const bool getIsExpandableRole = m_roles.contains("isExpandable");
 
     if ((getSizeRole || getIsExpandableRole) && item.isDir()) {
-        if (item.isLocalFile()) {
+        if (item.isLocalFile() && !item.isSlow()) {
             // 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
         }