diff --git a/src/plugins/coreplugin/fileiconprovider.cpp b/src/plugins/coreplugin/fileiconprovider.cpp index 1d89aeef9a238d5159d6912b18977839913221a2..ee66a5777f545213dae2f997d3537e64f69a28f4 100644 --- a/src/plugins/coreplugin/fileiconprovider.cpp +++ b/src/plugins/coreplugin/fileiconprovider.cpp @@ -74,6 +74,14 @@ public: QIcon icon(const QFileInfo &info); using QFileIconProvider::icon; + void registerIconOverlayForFilename(const QIcon &icon, const QString &filename) + { + QTC_ASSERT(!icon.isNull() && !filename.isEmpty(), return); + + const QPixmap fileIconPixmap = FileIconProvider::overlayIcon(QStyle::SP_FileIcon, icon, QSize(16, 16)); + m_filenameCache.insert(filename, fileIconPixmap); + } + void registerIconOverlayForSuffix(const QIcon &icon, const QString &suffix) { if (debug) @@ -83,7 +91,7 @@ public: const QPixmap fileIconPixmap = FileIconProvider::overlayIcon(QStyle::SP_FileIcon, icon, QSize(16, 16)); // replace old icon, if it exists - m_cache.insert(suffix, fileIconPixmap); + m_suffixCache.insert(suffix, fileIconPixmap); } void registerIconOverlayForMimeType(const QIcon &icon, const Utils::MimeType &mimeType) @@ -93,7 +101,8 @@ public: } // Mapping of file suffix to icon. - QHash<QString, QIcon> m_cache; + QHash<QString, QIcon> m_suffixCache; + QHash<QString, QIcon> m_filenameCache; QIcon m_unknownFileIcon; }; @@ -115,19 +124,27 @@ QIcon FileIconProviderImplementation::icon(const QFileInfo &fileInfo) qDebug() << "FileIconProvider::icon" << fileInfo.absoluteFilePath(); // Check for cached overlay icons by file suffix. bool isDir = fileInfo.isDir(); - QString suffix = !isDir ? fileInfo.suffix() : QString(); - if (!m_cache.isEmpty() && !isDir && !suffix.isEmpty()) { - if (m_cache.contains(suffix)) - return m_cache.value(suffix); + const QString filename = !isDir ? fileInfo.fileName() : QString(); + if (!filename.isEmpty()) { + auto it = m_filenameCache.constFind(filename); + if (it != m_filenameCache.constEnd()) + return it.value(); } - // Get icon from OS. + const QString suffix = !isDir ? fileInfo.suffix() : QString(); + if (!suffix.isEmpty()) { + auto it = m_suffixCache.constFind(suffix); + if (it != m_suffixCache.constEnd()) + return it.value(); + } + + // Get icon from OS (and cache it based on suffix!) QIcon icon; if (HostOsInfo::isWindowsHost() || HostOsInfo::isMacHost()) icon = QFileIconProvider::icon(fileInfo); else // File icons are unknown on linux systems. icon = isDir ? QFileIconProvider::icon(fileInfo) : m_unknownFileIcon; if (!isDir && !suffix.isEmpty()) - m_cache.insert(suffix, icon); + m_suffixCache.insert(suffix, icon); return icon; } @@ -199,5 +216,11 @@ void registerIconOverlayForMimeType(const char *path, const char *mimeType) mdb.mimeTypeForName(QString::fromLatin1(mimeType))); } +void registerIconOverlayForFilename(const char *path, const char *filename) +{ + instance()->registerIconOverlayForFilename(QIcon(QString::fromLatin1(path)), + QString::fromLatin1(filename)); +} + } // namespace FileIconProvider } // namespace Core diff --git a/src/plugins/coreplugin/fileiconprovider.h b/src/plugins/coreplugin/fileiconprovider.h index 5262bd26bc662fb8e09d2aaf8af2abb25d40a8a5..c31ceae33529de066d7b013b22d5ab2acc5613c5 100644 --- a/src/plugins/coreplugin/fileiconprovider.h +++ b/src/plugins/coreplugin/fileiconprovider.h @@ -45,6 +45,7 @@ CORE_EXPORT QIcon icon(QFileIconProvider::IconType type); CORE_EXPORT QPixmap overlayIcon(const QPixmap &baseIcon, const QIcon &overlayIcon); CORE_EXPORT QPixmap overlayIcon(QStyle::StandardPixmap baseIcon, const QIcon &overlayIcon, const QSize &size); CORE_EXPORT void registerIconOverlayForSuffix(const char *path, const char *suffix); +CORE_EXPORT void registerIconOverlayForFilename(const char *path, const char *filename); CORE_EXPORT void registerIconOverlayForMimeType(const char *path, const char *mimeType); CORE_EXPORT void registerIconOverlayForMimeType(const QIcon &icon, const char *mimeType);