From 7b38b5e369f45132cc83732cc5852538ad6075e8 Mon Sep 17 00:00:00 2001 From: Mike Chen Date: Mon, 15 Jan 2024 21:03:55 +0800 Subject: [PATCH] Make sure hicolor is searched before dash fallbacks Search full icon name from hicolor before dash fallback Pick-to: 6.6 Fixes: QTBUG-121030 Change-Id: I3e3ee142c33466203639f32857fce3ea1946a9f7 Reviewed-by: Axel Spoerl (cherry picked from commit 0534a93ef04f38cf6dfc0d6c03827325d651a64c) Reviewed-by: Qt Cherry-pick Bot --- src/gui/image/qiconloader.cpp | 35 ++++++++++++++++++++--------------- src/gui/image/qiconloader_p.h | 5 ++++- 2 files changed, 24 insertions(+), 16 deletions(-) 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