53 lines
2.1 KiB
C++
53 lines
2.1 KiB
C++
#pragma once
|
|
|
|
#include <SDL3/SDL.h>
|
|
|
|
#include <string>
|
|
#include <unordered_map>
|
|
#include <vector>
|
|
|
|
// KeyConfig: font única de veritat per a les tecles d'UI/sistema.
|
|
//
|
|
// Llegeix els valors per defecte des de `data/input/keys.yaml` (recurs read-only)
|
|
// i opcionalment aplica overrides des d'un fitxer de l'usuari (per a remapejos
|
|
// fets des del menú de servei). Els callers consulten per `id` (ex. "menu_toggle").
|
|
//
|
|
// Les tecles de moviment del jugador NO viuen ací — es queden a Options::keys_game.
|
|
|
|
struct KeyEntry {
|
|
std::string id;
|
|
std::string code; // nom SDL del scancode tal com apareix al YAML
|
|
std::string desc;
|
|
SDL_Scancode scancode{SDL_SCANCODE_UNKNOWN};
|
|
SDL_Scancode default_scancode{SDL_SCANCODE_UNKNOWN};
|
|
};
|
|
|
|
namespace KeyConfig {
|
|
// Inicialitza KeyConfig llegint defaults des d'un recurs (via ResourceHelper)
|
|
// i opcionalment sobreposant overrides des d'un fitxer de disc.
|
|
void init(const std::string& defaults_resource_path,
|
|
const std::string& user_overrides_disk_path);
|
|
void destroy();
|
|
|
|
// Consulta el scancode actual associat a un id. Torna SDL_SCANCODE_UNKNOWN si no existix.
|
|
[[nodiscard]] auto scancode(const std::string& id) -> SDL_Scancode;
|
|
|
|
// Punter estable al scancode d'un id — útil per a Menu::ItemKind::KeyBind.
|
|
// Torna nullptr si l'id no existix.
|
|
[[nodiscard]] auto scancodePtr(const std::string& id) -> SDL_Scancode*;
|
|
|
|
// Estableix el scancode d'un id. No persistix per si sol — cal cridar saveOverrides().
|
|
void setScancode(const std::string& id, SDL_Scancode sc);
|
|
|
|
// True si el scancode coincidix amb alguna tecla d'UI registrada.
|
|
// Usat pel Director per a evitar que tecles d'UI activen `key_pressed_` al joc.
|
|
[[nodiscard]] auto isGuiKey(SDL_Scancode sc) -> bool;
|
|
|
|
// Llistat complet de les entrades (per a HELP / debug / iteració).
|
|
[[nodiscard]] auto entries() -> const std::vector<KeyEntry>&;
|
|
|
|
// Persistix al fitxer d'overrides les entrades que difereixen del default.
|
|
// Si no s'ha proporcionat user_overrides_disk_path al init, és no-op.
|
|
auto saveOverrides() -> bool;
|
|
} // namespace KeyConfig
|