feat(controls): redefinició de tecles i botons del mando des del menú de servei

This commit is contained in:
JailDesigner committed 2026-04-29 19:54:47 +02:00
1 parent 4739354875
commit 37fdcb4751
15 files changed
+1169 -80

No files matched your search

+37
View File
@@ -3,11 +3,13 @@
#include <SDL3/SDL.h>
#include <cstddef>
#include <cstdint>
#include <functional>
#include <memory>
#include <string>
#include <vector>
#include "core/input/define_buttons.hpp"
#include "core/rendering/surface.hpp" // Palette
class Text;
@@ -56,6 +58,21 @@ class ServiceMenu {
// false; és el caller qui decideix obrir-lo amb la hotkey.
auto handleEvent(const SDL_Event& ev) -> bool;
// True mentre estem esperant que l'usuari pulse una tecla per assignar
// a l'item KEY_BIND seleccionat. El Director redirigeix els KEY_DOWN
// a `captureKey` mentre dura — replica `Menu::isCapturing` d'AEE.
[[nodiscard]] auto isCapturing() const -> bool { return capturing_; }
// Aplica l'scancode capturat a l'item seleccionat (si encara és KEY_BIND
// i té setter). ESCAPE cancel·la sense assignar.
void captureKey(SDL_Scancode sc);
// Arranca el sub-mòdul `DefineButtons` per al mando indicat. El menú
// queda "obert" però els events del mando es redirigeixen al sub-mòdul
// fins que acabi la seqüència o l'usuari pulse ESC. Replica el patró
// `define_buttons_->enable(...)` de coffee_crisis_arcade_edition.
void startDefineButtons(SDL_Gamepad* pad, const std::string& name, const std::string& path);
private:
// --- Struct d'un item d'una pàgina ---
//
@@ -185,6 +202,11 @@ class ServiceMenu {
// --- Navegació i estat ---
void pushPage(Page page);
void popPage();
// Tractament del bloc d'events de gamepad (BUTTON_DOWN). Extret a
// mètode propi per a mantenir la complexitat cognitiva d'`handleEvent`
// sota el llindar de clang-tidy.
void handleGamepadButtonDown(const SDL_GamepadButtonEvent& ev);
[[nodiscard]] auto top() -> Page&;
[[nodiscard]] auto topConst() const -> const Page&;
[[nodiscard]] static auto isItemVisible(const Item& item) -> bool;
@@ -211,6 +233,14 @@ class ServiceMenu {
[[nodiscard]] static auto makeShaderTypeItem() -> Item;
[[nodiscard]] static auto makeShaderPresetItem() -> Item;
// Fàbrica genèrica per a un KEY_BIND vinculat a una acció del jugador
// `player_id`. Llegeix d'`Options::controls().keyboard_p*` i delega
// la mutació a `Options::setKeyboardBinding(...)` (persisteix).
[[nodiscard]] static auto makeKeyboardItem(
const std::string& label_key,
int player_id,
std::uint8_t action) -> Item;
// --- Render ---
// "Visible" inclou l'animació de tancament: retorna true mentre la caixa
// encara ha de dibuixar-se, encara que open_ siga false.
@@ -232,4 +262,11 @@ class ServiceMenu {
float animated_h_{0.0F}; // Alçada suavitzada cap a `targetBoxHeight`.
bool transition_active_{false}; // Push/pop de pàgina en curs.
float transition_progress_{0.0F}; // 0 → 1 durant la transició de pàgina.
bool capturing_{false}; // True mentre esperem una tecla per a un KEY_BIND.
// Sub-mòdul de captura de botons del mando. Quan està actiu absorbeix
// tots els events de mando (BUTTON_DOWN/UP, AXIS_MOTION) i, en acabar,
// persisteix la nova configuració via `GamepadBindings`. Replica el
// patró `define_buttons_` de coffee_crisis_arcade_edition.
DefineButtons define_buttons_;
};