From 57493c555666f0867f0879bf55eedcf593fa34d8 Mon Sep 17 00:00:00 2001 From: Eugene Shalygin Date: Tue, 2 May 2017 11:38:04 +0200 Subject: [PATCH] Add QFileIconProvider implementation using mime database If built-in QFileIconProvider does not seem to work, use custom implementation which queries mime database. --- src/gui/torrentcontentmodel.cpp | 49 ++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/src/gui/torrentcontentmodel.cpp b/src/gui/torrentcontentmodel.cpp index c69d7dbda..df668be61 100644 --- a/src/gui/torrentcontentmodel.cpp +++ b/src/gui/torrentcontentmodel.cpp @@ -37,6 +37,9 @@ #include #include #include +#else +#include +#include #endif #include "guiiconprovider.h" @@ -85,6 +88,49 @@ namespace return QIcon(iconPixmap); } }; +#else + /** + * @brief Tests whether QFileIconProvider actually works + * + * Some QPA plugins do not implement QPlatformTheme::fileIcon(), and + * QFileIconProvider::icon() returns empty icons as the result. Here we ask it for + * two icons for probably absent files and when both icons are null, we assume that + * the current QPA plugin does not implement QPlatformTheme::fileIcon(). + */ + bool doesQFileIconProviderWork() + { + QFileIconProvider provider; + const char PSEUDO_UNIQUE_FILE_NAME[] = "/tmp/qBittorrent-test-QFileIconProvider-845eb448-7ad5-4cdb-b764-b3f322a266a9"; + QIcon testIcon1 = provider.icon(QFileInfo( + QLatin1String(PSEUDO_UNIQUE_FILE_NAME) + QLatin1String(".pdf"))); + QIcon testIcon2 = provider.icon(QFileInfo( + QLatin1String(PSEUDO_UNIQUE_FILE_NAME) + QLatin1String(".png"))); + + return (!testIcon1.isNull() || !testIcon2.isNull()); + } + + class MimeFileIconProvider: public UnifiedFileIconProvider + { + using QFileIconProvider::icon; + QIcon icon(const QFileInfo &info) const override + { + const QMimeType mimeType = m_db.mimeTypeForFile(info, QMimeDatabase::MatchExtension); + QIcon res = QIcon::fromTheme(mimeType.iconName()); + if (!res.isNull()) { + return res; + } + + res = QIcon::fromTheme(mimeType.genericIconName()); + if (!res.isNull()) { + return res; + } + + return UnifiedFileIconProvider::icon(info); + } + + private: + QMimeDatabase m_db; + }; #endif } @@ -95,7 +141,8 @@ TorrentContentModel::TorrentContentModel(QObject *parent) #ifdef Q_OS_WIN m_fileIconProvider = new WinShellFileIconProvider(); #else - m_fileIconProvider = new QFileIconProvider(); + static bool doesBuiltInProviderWork = doesQFileIconProviderWork(); + m_fileIconProvider = doesBuiltInProviderWork ? new QFileIconProvider() : new MimeFileIconProvider(); #endif }