67 lines
2.8 KiB
C++
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;
|
|
};
|