diff --git a/src/gui/image/qiconloader.cpp b/src/gui/image/qiconloader.cpp index e02fa73ba83..982b9a26b49 100644 --- a/src/gui/image/qiconloader.cpp +++ b/src/gui/image/qiconloader.cpp @@ -441,7 +441,8 @@ QDebug operator<<(QDebug debug, const std::unique_ptr &e QThemeIconInfo QIconLoader::findIconHelper(const QString &themeName, const QString &iconName, - QStringList &visited) const + QStringList &visited, + DashRule rule) const { qCDebug(lcIconLoader) << "Finding icon" << iconName << "in theme" << themeName << "skipping" << visited; @@ -464,10 +465,10 @@ QThemeIconInfo QIconLoader::findIconHelper(const QString &themeName, const QStringList contentDirs = theme.contentDirs(); QStringView iconNameFallback(iconName); - bool searchingGenericFallback = false; + bool searchingGenericFallback = m_iconName.length() > iconName.length(); // Iterate through all icon's fallbacks in current theme - while (info.entries.empty()) { + if (info.entries.empty()) { const QString svgIconName = iconNameFallback + ".svg"_L1; const QString pngIconName = iconNameFallback + ".png"_L1; @@ -527,16 +528,7 @@ QThemeIconInfo QIconLoader::findIconHelper(const QString &themeName, if (!info.entries.empty()) { info.iconName = iconNameFallback.toString(); - break; } - - // If it's possible - find next fallback for the icon - const int indexOfDash = iconNameFallback.lastIndexOf(u'-'); - if (indexOfDash == -1) - break; - - iconNameFallback.truncate(indexOfDash); - searchingGenericFallback = true; } if (info.entries.empty()) { @@ -551,13 +543,25 @@ QThemeIconInfo QIconLoader::findIconHelper(const QString &themeName, const QString parentTheme = parents.at(i).trimmed(); if (!visited.contains(parentTheme)) // guard against recursion - info = findIconHelper(parentTheme, iconName, visited); + info = findIconHelper(parentTheme, iconName, visited, QIconLoader::NoFallBack); if (!info.entries.empty()) // success break; } } + if (rule == QIconLoader::FallBack && info.entries.empty()) { + // If it's possible - find next fallback for the icon + const int indexOfDash = iconNameFallback.lastIndexOf(u'-'); + if (indexOfDash != -1) { + qCDebug(lcIconLoader) << "Did not find matching icons in all themes;" + << "trying dash fallback"; + iconNameFallback.truncate(indexOfDash); + QStringList _visited; + info = findIconHelper(themeName, iconNameFallback.toString(), _visited, QIconLoader::FallBack); + } + } + return info; } @@ -605,13 +609,14 @@ QThemeIconInfo QIconLoader::loadIcon(const QString &name) const { qCDebug(lcIconLoader) << "Loading icon" << name; + m_iconName = name; QThemeIconInfo iconInfo; QStringList visitedThemes; if (!themeName().isEmpty()) - iconInfo = findIconHelper(themeName(), name, visitedThemes); + iconInfo = findIconHelper(themeName(), name, visitedThemes, QIconLoader::FallBack); if (iconInfo.entries.empty() && !fallbackThemeName().isEmpty()) - iconInfo = findIconHelper(fallbackThemeName(), name, visitedThemes); + iconInfo = findIconHelper(fallbackThemeName(), name, visitedThemes, QIconLoader::FallBack); if (iconInfo.entries.empty()) iconInfo = lookupFallbackIcon(name); diff --git a/src/gui/image/qiconloader_p.h b/src/gui/image/qiconloader_p.h index cf42e28a481..3cfa9381d1a 100644 --- a/src/gui/image/qiconloader_p.h +++ b/src/gui/image/qiconloader_p.h @@ -187,9 +187,11 @@ public: QIconEngine *iconEngine(const QString &iconName) const; private: + enum DashRule { FallBack, NoFallBack }; QThemeIconInfo findIconHelper(const QString &themeName, const QString &iconName, - QStringList &visited) const; + QStringList &visited, + DashRule rule) const; QThemeIconInfo lookupFallbackIcon(const QString &iconName) const; uint m_themeKey; @@ -202,6 +204,7 @@ private: mutable QStringList m_iconDirs; mutable QHash themeList; mutable QStringList m_fallbackDirs; + mutable QString m_iconName; }; QT_END_NAMESPACE