[Icons] Render lock and dropdown glyphs through the icon engine

Both generators rendered the sentinel SVG to a fixed height x height pixmap
at DPR 1. The pre-migration path rendered larger and let QIcon scale it, so
on a 2x display the games-list lock (13px) and the banner dropdown arrow
(24px) came back crisp; the new path hands the widget a DPR-1 bitmap that
gets upscaled and blurred.

- The games list asks the themed engine for `icons/lock` directly, so the
  item view paints it at the device pixel ratio and the lock also follows
  HighlightedText on a selected row.
- The dropdown goes through `loadThemedIcon(...).pixmap(size, dpr)`, which
  keeps the glyph's aspect ratio and renders at the requested ratio.
- LockPixmapGenerator has no consumer left, so it and its cache are gone.
This commit is contained in:
Lukas Brübach 2026-11-01 17:59:19 +01:00
parent 005a2cc131
commit a7d93ad089
4 changed files with 15 additions and 42 deletions

View file

@ -4,6 +4,7 @@
#include "theme_icon.h"
#include "theme_manager.h"
#include <QApplication>
#include <QBrush>
#include <QByteArray>
#include <QChar>
@ -435,39 +436,19 @@ QIcon UserLevelPixmapGenerator::generateIconWithColorOverride(int height,
QMap<QString, QIcon> UserLevelPixmapGenerator::iconCache;
QPixmap LockPixmapGenerator::generatePixmap(int height)
{
int key = height;
if (pmCache.contains(key)) {
return pmCache.value(key);
}
const QString resolved = themeManager->assetPath(QStringLiteral("icons/lock"));
QPixmap pixmap = loadSentinelSvgPixmap(resolved, QPalette::WindowText, QSize(height, height));
if (pixmap.isNull()) {
pixmap = tryLoadImage(QStringLiteral("theme:") + resolved, QSize(height, height), true);
}
pmCache.insert(key, pixmap);
return pixmap;
}
QMap<int, QPixmap> LockPixmapGenerator::pmCache;
QPixmap DropdownIconPixmapGenerator::generatePixmap(int height, bool expanded)
{
QString key = QString::number(expanded) + ":" + QString::number(height);
const QString key = QString::number(expanded) + ":" + QString::number(height);
if (pmCache.contains(key)) {
return pmCache.value(key);
}
// Render through the themed icon engine: it keeps the glyph's aspect ratio,
// follows the palette, and renders at the device pixel ratio instead of
// handing a DPR-1 bitmap to a label that would upscale and blur it on a 2x
// display.
const QString prefix = QStringLiteral("icons/") + (expanded ? "dropdown_expanded" : "dropdown_collapsed");
const QString resolved = themeManager->assetPath(prefix);
QPixmap pixmap = loadSentinelSvgPixmap(resolved, QPalette::WindowText, QSize(height, height));
if (pixmap.isNull()) {
pixmap = tryLoadImage(QStringLiteral("theme:") + resolved, QSize(height, height), true);
}
const QPixmap pixmap = loadThemedIcon(prefix).pixmap(QSize(height, height), qApp->devicePixelRatio());
pmCache.insert(key, pixmap);
return pixmap;
}
@ -539,7 +520,6 @@ void clearPixmapGeneratorCaches()
PingPixmapGenerator::clear();
CountryPixmapGenerator::clear();
UserLevelPixmapGenerator::clear();
LockPixmapGenerator::clear();
DropdownIconPixmapGenerator::clear();
ManaSymbolPixmapGenerator::clear();
}