#pragma once #include #include // Para string #include // Para unordered_map #include // Para vector // Entrada de tecla cargada desde keys.yaml struct KeyEntry { std::string id; // Identificador usado en código (ej. "grid", "tile_picker") std::string display_key; // Texto para mostrar en HELP KEYS (ej. "G", "T") std::string desc; // Descripción corta SDL_Keycode keycode{SDLK_UNKNOWN}; // Tecla SDL asignada std::string action; // (Opcional) Nombre de InputAction para scope GLOBAL }; // Grupo de teclas por ámbito struct KeyConfigScope { std::string name; // "GLOBAL", "EDITOR", "MINIMAP", "DEBUG" std::vector entries; std::unordered_map index; // id → posición en entries }; // Registro centralizado de teclas — fuente única de verdad (keys.yaml) class KeyConfig { public: // Singleton static void init(const std::string& yaml_path); static void destroy(); static auto get() -> KeyConfig*; // Consulta la SDL_Keycode asignada a un id dentro de un scope [[nodiscard]] auto key(const std::string& scope, const std::string& id) const -> SDL_Keycode; // Aplica las teclas del scope GLOBAL al sistema de Input (Input::bindKey) void applyGlobalBindings() const; // Acceso a scopes para HELP KEYS y para aplicar bindings globales [[nodiscard]] auto getScopes() const -> const std::vector&; [[nodiscard]] auto getScope(const std::string& name) const -> const KeyConfigScope*; private: static KeyConfig* instance_; KeyConfig() = default; ~KeyConfig() = default; void load(const std::string& yaml_path); std::vector scopes_; std::unordered_map scope_index_; // nombre → posición en scopes_ };