Files
coffee-crisis/source/core/resources/skin_manager.hpp
T

67 lines
2.8 KiB
C++

#pragma once
#include <string>
#include <vector>
// Gestor de skins. Una "skin" és un set complet de gràfics (PNGs + .ani)
// emmagatzemat sota `data/skins/<id>/gfx/`. El SkinManager:
//
// * descobreix les skins disponibles escanejant `data/skins/*/skin.yaml`,
// * recorda quina skin està activa (`current_id_`),
// * composa els paths perquè Asset/Resource sàpiguen on llegir.
//
// L'arrencada típica és: Director crida `init(executable_path, asset_prefix)`
// (escaneja manifests) i acte seguit `setCurrent(Options::settings.skin)`.
// Després registra els assets via `Asset::addSkinAware("balloon1.png", ...)`
// que utilitza internament `gfxPath()` del SkinManager.
//
// Per al canvi en calent, Resource crida `setCurrent(new_id)`, després
// `Asset::onSkinChanged()` per a actualitzar paths registrats, i recarrega
// cada Texture via `reLoadFromPath`.
class SkinManager {
public:
struct SkinInfo {
std::string id; // Carpeta dins data/skins/ (ex: "classic")
std::string display_name; // Etiqueta visible a la UI (ex: "Classic")
std::string gfx_dir; // Subcarpeta amb els gfx (default: "gfx")
};
// executable_path: acabat amb '/' (típicament SDL_GetBasePath()).
// asset_prefix: prefix relatiu per a paths registrats a Asset
// (ex: "" en Linux/Win, "/../Resources" dins el bundle de macOS).
static void init(const std::string &executable_path, const std::string &asset_prefix);
static void destroy();
static auto get() -> SkinManager *;
void scan();
[[nodiscard]] auto available() const -> const std::vector<SkinInfo> & { return skins_; }
[[nodiscard]] auto current() const -> const std::string & { return current_id_; }
[[nodiscard]] auto currentDisplayName() const -> std::string;
[[nodiscard]] auto displayNameOf(const std::string &id) const -> std::string;
[[nodiscard]] auto exists(const std::string &id) const -> bool;
void setCurrent(const std::string &id);
// Compon el path relatiu d'un gràfic dins la skin activa, amb el format
// que Asset::add espera (relatiu amb prefix de plataforma):
// "<asset_prefix>/data/skins/<id>/<gfx_dir>/<basename>"
[[nodiscard]] auto gfxPath(const std::string &basename) const -> std::string;
// Cíclic. Si només hi ha una skin, retorna la mateixa.
[[nodiscard]] auto nextSkinId() const -> std::string;
[[nodiscard]] auto prevSkinId() const -> std::string;
private:
SkinManager(std::string executable_path, std::string asset_prefix);
[[nodiscard]] auto gfxDirOf(const std::string &id) const -> std::string;
std::string executable_path_; // Acabat amb '/' (per a scan filesystem)
std::string asset_prefix_; // PREFIX per a paths registrats
std::vector<SkinInfo> skins_;
std::string current_id_{"classic"};
static SkinManager *instance;
};