mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-11-06 10:03:26 -08:00
A QPixmap snapshot cannot follow palette changes, so expose a QIcon whose engine resolves the `currentColor` sentinel from the live palette on every pixmap request. Icons stay legible across light/dark switches without recreating actions or buttons. - Resolve the asset, its bytes and its intrinsic size once, and drop them on ThemeManager::themeChanged/paletteChanged. A repaint does no file I/O and no theme.cfg parse; the palette color stays part of the render cache key. - Centre the glyph on QRectF(rect).center(): QRect::center() floors and uses right = left + width - 1, which shifted every 16x16 item-view glyph up and left by a logical pixel and clipped its last row and column. - Take a raster override's intrinsic size from QImageReader instead of the 24x24 SVG default, so a non-square override reports the box it draws. - Set the device pixel ratio before inserting into the render cache, so a cache hit no longer detaches the pixmap on every paint. Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
50 lines
2 KiB
C
50 lines
2 KiB
C
/**
|
|
* @file theme_icon.h
|
|
* @ingroup Interface
|
|
*/
|
|
|
|
#ifndef THEME_ICON_H
|
|
#define THEME_ICON_H
|
|
|
|
#include <QIcon>
|
|
#include <QPalette>
|
|
#include <QPixmap>
|
|
#include <QSize>
|
|
#include <QString>
|
|
#include <QStringView>
|
|
|
|
/**
|
|
* @brief Builds a palette-aware icon from a `theme:` asset.
|
|
*
|
|
* SVG glyphs may use the `currentColor` sentinel. A plain QPixmap snapshot
|
|
* cannot follow palette changes, so this returns a QIcon whose engine resolves
|
|
* the sentinel from the current palette every time it is asked for a pixmap.
|
|
* Icons therefore stay legible when the user switches between light and dark
|
|
* themes without recreating any actions or buttons.
|
|
*
|
|
* @param prefix Asset prefix relative to the `theme:` search path, with no file
|
|
* extension (for example `icons/search`), matching themePixmap().
|
|
* @param role Palette role whose color replaces the sentinel. Selected glyphs
|
|
* use HighlightedText unless a role other than WindowText is given.
|
|
* @return An icon that follows the application palette.
|
|
*/
|
|
QIcon loadThemedIcon(QStringView prefix, QPalette::ColorRole role = QPalette::WindowText);
|
|
|
|
/**
|
|
* @brief Renders a resolved theme SVG when it carries the `currentColor` sentinel.
|
|
*
|
|
* Non-SVG assets and SVGs without the sentinel return a null pixmap so callers
|
|
* can fall back to their usual loading path (including legacy inversion).
|
|
*
|
|
* @param resolvedPath Asset path relative to the `theme:` search path, as
|
|
* returned by ThemeManager::assetPath (includes extension).
|
|
* @param role Palette role whose color replaces the sentinel.
|
|
* @param size Pixel size to render at; an empty size uses the SVG's intrinsic size.
|
|
* @return The recolored pixmap, or a null pixmap when the asset is not a
|
|
* sentinel-carrying SVG.
|
|
*/
|
|
QPixmap loadSentinelSvgPixmap(const QString &resolvedPath,
|
|
QPalette::ColorRole role = QPalette::WindowText,
|
|
const QSize &size = {});
|
|
|
|
#endif // THEME_ICON_H
|