skins: SkinManager + hot-swap (F7), classic/nes a data/skins/
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
#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;
|
||||
};
|
||||
Reference in New Issue
Block a user