]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kfileitemlistview.cpp
make sure we use valid icons
[dolphin.git] / src / kitemviews / kfileitemlistview.cpp
index 73d6c72e9b5579b83f5fb6c5c6c4fc78c03941b4..6086eb8a270e283682166e2594870faabf08db8f 100644 (file)
@@ -17,6 +17,8 @@
 #include <QGraphicsView>
 #include <QPainter>
 #include <QTimer>
+#include <QIcon>
+#include <QMimeDatabase>
 
 // #define KFILEITEMLISTVIEW_DEBUG
 
@@ -168,7 +170,15 @@ QPixmap KFileItemListView::createDragPixmap(const KItemSet& indexes) const
         QPixmap pixmap = model()->data(index).value("iconPixmap").value<QPixmap>();
         if (pixmap.isNull()) {
             QIcon icon = QIcon::fromTheme(model()->data(index).value("iconName").toString());
-            pixmap = icon.pixmap(size, size);
+            if (icon.isNull()) {
+                icon = QIcon::fromTheme("unknown");
+            }
+            if (!icon.isNull()) {
+                pixmap = icon.pixmap(size, size);
+            } else {
+                pixmap = QPixmap(size, size);
+                pixmap.fill(Qt::transparent);
+            }
         } else {
             KPixmapModifier::scale(pixmap, QSize(size, size) * dpr);
         }
@@ -205,7 +215,12 @@ void KFileItemListView::initializeItemListWidget(KItemListWidget* item)
         KFileItemModel* fileItemModel = static_cast<KFileItemModel*>(model());
 
         const KFileItem fileItem = fileItemModel->fileItem(item->index());
-        data.insert("iconName", fileItem.iconName());
+        QString iconName = fileItem.iconName();
+        if (!QIcon::hasThemeIcon(iconName)) {
+            QMimeDatabase mimeDb;
+            iconName = mimeDb.mimeTypeForName(fileItem.mimetype()).genericIconName();
+        }
+        data.insert("iconName", iconName);
         item->setData(data, {"iconName"});
     }
 }
@@ -388,7 +403,8 @@ void KFileItemListView::applyRolesToModel()
 
     // KFileItemModel does not distinct between "visible" and "invisible" roles.
     // Add all roles that are mandatory for having a working KFileItemListView:
-    QSet<QByteArray> roles = visibleRoles().toSet();
+    const auto visibleRoles = this->visibleRoles();
+    auto roles = QSet<QByteArray>(visibleRoles.constBegin(), visibleRoles.constEnd());
     roles.insert("iconPixmap");
     roles.insert("iconName");
     roles.insert("text");