feat(menu): submenú Controls i bloqueig de polling amb menú obert

This commit is contained in:
JailDesigner committed 2026-04-22 19:05:36 +02:00
1 parent 350625dec0
commit fb40d0effb
8 files changed
+229 -7

No files matched your search

+19
View File
@@ -72,6 +72,7 @@ class ServiceMenu {
INT_RANGE, // L/R descent/ascent per step, clamp a [min,max]
SUBMENU, // RETURN/R: push la pàgina construïda per `pushSub`
ACTION, // RETURN: dispara `action`
KEY_BIND, // Mostra el nom d'una tecla; RETURN captura-ne de nova.
};
Kind kind{Kind::TOGGLE};
// Per a tots els Kind menys LABEL, `label_key` és una clau de Locale.
@@ -97,6 +98,12 @@ class ServiceMenu {
std::function<void()> push_sub;
std::function<void()> action;
// Per a KEY_BIND: getter que retorna l'scancode actual i setter
// opcional que el muta. Si `set_scancode` és buit, l'item es veu
// però la captura queda deshabilitada (placeholder).
std::function<SDL_Scancode()> get_scancode;
std::function<void(SDL_Scancode)> set_scancode;
// Si està buit, l'item sempre és visible. Si retorna false, l'item
// es salta tant al render com a la navegació (cursor salta).
std::function<bool()> visible;
@@ -166,6 +173,15 @@ class ServiceMenu {
std::string text,
std::function<bool()> visible = {}) -> Item;
// Item de vinculació de tecla. Mostra el nom de l'scancode al costat
// dret. Si `setter` és buit, l'item surt com a informatiu (no captura).
// Quan el setter sigui operatiu, RETURN entrarà en mode captura i la
// pròxima tecla que es premi sobreescriurà la vinculació.
[[nodiscard]] static auto makeKeyBind(
std::string label_key,
std::function<SDL_Scancode()> getter,
std::function<void(SDL_Scancode)> setter = {}) -> Item;
// --- Navegació i estat ---
void pushPage(Page page);
void popPage();
@@ -184,6 +200,9 @@ class ServiceMenu {
[[nodiscard]] static auto buildRoot() -> Page;
[[nodiscard]] static auto buildVideo() -> Page;
[[nodiscard]] static auto buildAudio() -> Page;
[[nodiscard]] static auto buildControls() -> Page;
[[nodiscard]] static auto buildKeyboardControls() -> Page;
[[nodiscard]] static auto buildGamepadControls() -> Page;
[[nodiscard]] static auto buildSystem() -> Page;
// Helpers privats d'items de vídeo: aïllen la lògica de