summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMike Chen <chenke@deepin.org>2024-01-15 21:03:55 +0800
committerMike Chen <chenke@deepin.org>2024-01-17 21:23:09 +0800
commit0534a93ef04f38cf6dfc0d6c03827325d651a64c (patch)
tree8ad47024c7593278e40ae03db41c917168ebf0e1 /src
parentd651cdb9885353af1ea0647733f0c002bf2d168b (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.cpp35
-rw-r--r--src/gui/image/qiconloader_p.h5
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