diff options
author | Mike Chen <chenke@deepin.org> | 2024-01-15 21:03:55 +0800 |
---|---|---|
committer | Mike Chen <chenke@deepin.org> | 2024-01-17 21:23:09 +0800 |
commit | 0534a93ef04f38cf6dfc0d6c03827325d651a64c (patch) | |
tree | 8ad47024c7593278e40ae03db41c917168ebf0e1 /src | |
parent | d651cdb9885353af1ea0647733f0c002bf2d168b (diff) |
Make sure hicolor is searched before dash fallbacks
Search full icon name from hicolor before dash fallback
Pick-to: 6.7 6.6
Fixes: QTBUG-121030
Change-Id: I3e3ee142c33466203639f32857fce3ea1946a9f7
Reviewed-by: Axel Spoerl <axel.spoerl@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/gui/image/qiconloader.cpp | 35 | ||||
-rw-r--r-- | 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 e02fa73ba8..982b9a26b4 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<QIconLoaderEngineEntry> &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 cf42e28a48..3cfa9381d1 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 <QString, QIconTheme> themeList; mutable QStringList m_fallbackDirs; + mutable QString m_iconName; }; QT_END_NAMESPACE |