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 <axel.spoerl@qt.io>
(cherry picked from commit 0534a93ef04f38cf6dfc0d6c03827325d651a64c)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Mike Chen 2024-01-15 21:03:55 +08:00 committed by Qt Cherry-pick Bot
parent 6affa9890d
commit 7b38b5e369
2 changed files with 24 additions and 16 deletions

View File

@ -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);

View File

@ -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