feat(service_menu): glyphs () + tanca picker al seleccionar mando

Afegim els glyphs ( i ) a VectorText (char_lparen.shp, char_rparen.shp,
arcs de 4 trams dins la caixa 20x40) perque el sufix (P1)/(P2) de la
picker de mando es renderitze net sense warnings.

A mes, al triar un mando o "SENSE MANDO" a la picker fem popPage
automatic, perque l'usuari no haja de tornar enrere a ma després
d'una assignacio.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-24 22:20:29 +02:00
parent 3dcf5c3a99
commit daa7eaf811
6 changed files with 34 additions and 7 deletions
+9
View File
@@ -0,0 +1,9 @@
# char_lparen.shp - Símbol ( (parèntesi esquerre)
# Dimensions: 20×40 (blocky display)
name: char_lparen
scale: 1.0
center: 10, 20
# Arc cap a l'esquerra aproximat amb 4 trams rectes
polyline: 14,4 8,12 6,20 8,28 14,36
+9
View File
@@ -0,0 +1,9 @@
# char_rparen.shp - Símbol ) (parèntesi dret)
# Dimensions: 20×40 (blocky display)
name: char_rparen
scale: 1.0
center: 10, 20
# Arc cap a la dreta aproximat amb 4 trams rectes
polyline: 6,4 12,12 14,20 12,28 6,36
+5 -1
View File
@@ -47,7 +47,7 @@ namespace Graphics {
}
// Cargar símbolos
const std::string SYMBOLS[] = {".", ",", "-", ":", "!", "?", "/"};
const std::string SYMBOLS[] = {".", ",", "-", ":", "!", "?", "/", "(", ")"};
for (const auto& sym : SYMBOLS) {
char c = sym[0];
std::string filename = getShapeFilename(c);
@@ -166,6 +166,10 @@ namespace Graphics {
return "font/char_question.shp";
case '/':
return "font/char_slash.shp";
case '(':
return "font/char_lparen.shp";
case ')':
return "font/char_rparen.shp";
case ' ':
return ""; // Espai es maneja sin load shape
+1 -1
View File
@@ -21,7 +21,7 @@ namespace Graphics {
// Renderizar string completo
// - text: cadena a renderizar (soporta: A-Z, a-z, 0-9, '.', ',', '-', ':',
// '!', '?', '/', ' ')
// '!', '?', '/', '(', ')', ' ')
// - position: posición inicial (esquina superior izquierda)
// - scale: factor de scale (1.0 = 20×40 px por carácter)
// - spacing: espacio entre caracteres en píxeles (a scale 1.0)
+6 -2
View File
@@ -631,8 +631,9 @@ namespace System {
.label_key = {},
.label_text = std::move(label),
.selectable = true,
.on_activate = [PI, PAD_NAME, PAD_PATH] {
.on_activate = [this, PI, PAD_NAME, PAD_PATH] {
assignPadToPlayer(PI, PAD_NAME, PAD_PATH);
popPage();
},
.get_value_text = {},
.on_change = {},
@@ -646,7 +647,10 @@ namespace System {
.label_key = "service_menu.controls_no_pad",
.label_text = {},
.selectable = true,
.on_activate = [PI] { assignPadToPlayer(PI, {}, {}); },
.on_activate = [this, PI] {
assignPadToPlayer(PI, {}, {});
popPage();
},
.get_value_text = {},
.on_change = {},
});
+4 -3
View File
@@ -109,9 +109,10 @@ namespace System {
[[nodiscard]] auto buildSystemPage() -> Page;
[[nodiscard]] auto buildControlsPage() -> Page;
// Llista de mandos detectats per a un jugador. Cada item assigna el
// pad triat (amb swap automatic si l'altre jugador ja el tenia).
// L'ultim item es "SENSE MANDO" per a desasignar.
[[nodiscard]] static auto buildPadPickerPage(int player_index) -> Page;
// pad triat (amb swap automatic si l'altre jugador ja el tenia) i
// tanca la picker amb popPage. L'ultim item es "SENSE MANDO" per a
// desasignar.
[[nodiscard]] auto buildPadPickerPage(int player_index) -> Page;
// Pagina de confirmacio "ESTAS SEGUR? NO/SI". on_yes s'executa si
// l'usuari selecciona SI; el cursor per defecte apunta a NO.
void pushConfirmPage(const std::string& title_key, std::function<void()> on_yes);