split the selection panel into one card per kind of selection
This commit is contained in:
55
src/ui/BuildingIconCache.h
Normal file
55
src/ui/BuildingIconCache.h
Normal file
@@ -0,0 +1,55 @@
|
||||
#pragma once
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
|
||||
#include <QByteArray>
|
||||
#include <QPixmap>
|
||||
#include <QString>
|
||||
|
||||
// Rasterizes and caches the per-building chip SVGs (REQ-UI-BUILD-ICON). A chip is a
|
||||
// rounded colored background bearing a white line glyph, loaded from a directory with
|
||||
// one file per building named after the building's id (e.g. "belt.svg"). Shared by the
|
||||
// build button bar and the selection panel's card header (REQ-UI-SELECTION-CARD) so the
|
||||
// rasterization is not duplicated.
|
||||
//
|
||||
// A missing icon file is not an error: hasIcon() returns false for it and the caller
|
||||
// falls back (a name caption on a build button, a bare title in the panel header).
|
||||
class BuildingIconCache
|
||||
{
|
||||
public:
|
||||
// iconDir is the directory holding the "<id>.svg" chip files (typically
|
||||
// "<configDir>/../icons/buildings").
|
||||
explicit BuildingIconCache(const QString& iconDir);
|
||||
|
||||
// True if a chip SVG file exists for the given icon name. Loads the file's bytes on
|
||||
// first query and remembers the result (including absence) so repeated calls are
|
||||
// cheap. The name is a building id for the building buttons, but need not be one --
|
||||
// the Deconstruct button's "deconstruct" chip goes through the same path.
|
||||
bool hasIcon(const std::string& iconName);
|
||||
|
||||
// The chip rasterized to a transparent sizePx*sizePx pixmap at the device pixel
|
||||
// ratio, cached per (name, size). Returns a null pixmap when the file is missing.
|
||||
QPixmap getChip(const std::string& iconName, int sizePx);
|
||||
|
||||
// As getChip(), but with the chip background recolored grey and the glyph left
|
||||
// alone, for a build button the player cannot currently afford
|
||||
// (REQ-UI-BUILD-DISABLED).
|
||||
QPixmap getGreyChip(const std::string& iconName, int sizePx);
|
||||
|
||||
private:
|
||||
// Raw SVG bytes for an icon name, loading and caching them on first access. An
|
||||
// absent file caches an empty QByteArray so it is not retried.
|
||||
const QByteArray& getSvg(const std::string& iconName);
|
||||
// The same SVG with its background fill replaced by grey, cached alongside.
|
||||
const QByteArray& getGreySvg(const std::string& iconName);
|
||||
// Shared rasterize-and-cache step. cacheKey distinguishes the normal and grey
|
||||
// variants of one icon name within the single pixmap cache.
|
||||
QPixmap getPixmap(const std::string& cacheKey, const QByteArray& svg, int sizePx);
|
||||
|
||||
QString m_iconDir;
|
||||
std::map<std::string, QByteArray> m_svgByName;
|
||||
std::map<std::string, QByteArray> m_greySvgByName;
|
||||
std::map<std::pair<std::string, int>, QPixmap> m_pixmapCache;
|
||||
};
|
||||
Reference in New Issue
Block a user