#pragma once #include #include #include #include #include #include // Rasterizes and caches per-item icon SVGs (REQ-UI-ITEM-ICON). Item icons are // self-contained, full-color SVGs loaded from a directory, one file per item type // named after the item's id (e.g. "iron_ore.svg"). Shared by the recipe-selection // dialog (REQ-UI-RECIPE-ICON) and the game world's belt/port item rendering 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 colored square in the world, a name caption in the dialog). class ItemIconCache { public: // iconDir is the directory holding the ".svg" icon files // (typically "/../icons/items"). explicit ItemIconCache(const QString& iconDir); // True if an icon SVG file exists for the given item id. Loads the file's bytes // on first query and remembers the result (including absence) so repeated calls // are cheap. bool hasIcon(const std::string& itemId); // Returns the item's icon rasterized to a transparent sizePx*sizePx pixmap, // cached per (item id, size) so it is rendered once and reused across frames and // only re-rasterized when the target size changes (REQ-UI-ITEM-ICON). Returns a // null pixmap if the item has no icon file (callers should gate on hasIcon()). QPixmap getPixmap(const std::string& itemId, int sizePx); private: // Returns the raw SVG bytes for an item id, 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& itemId); QString m_iconDir; std::map m_svgById; std::map, QPixmap> m_pixmapCache; };