Listas de selección múltiple con agrupaciones - Spectre Console Series
Spectre Console es una biblioteca .NET que permite transformar aplicaciones de consola C# simples en herramientas interactivas y visualmente ricas. En lugar de pantallas estáticas en blanco y negro, puede animar a los usuarios con colores, diseños y opciones interactivas. En este artículo, nos adentraremos en una de sus funciones de entrada más potentes -los avisos de selección múltiple- y, concretamente, en cómo utilizar los grupos de elección.
Para ello, vamos a seguir el tutorial de Tim Corey de su vídeo "Listas de selección múltiple con agrupaciones - Spectre Console Series". Tim explica, muestra código y lo ejecuta, para que puedas ver cómo implementarlo en tu propio proyecto. A continuación, en cada título se indica el momento aproximado del vídeo en el que aparece el tema, para que puedas acceder directamente a él.
Introducción al indicador de selección múltiple
Al principio del vídeo, Tim Corey recuerda a los espectadores que Spectre Console permite "convertir tus aplicaciones de consola de C# en aplicaciones visualmente atractivas e informativas" (0:02). Su serie aborda la biblioteca pieza por pieza en trozos de diez minutos. Este vídeo en concreto se centra en pedir al usuario que elija una o varias opciones de una lista o de varias listas utilizando el indicador de selección múltiple (0:18).
Configuración de una consulta de selección múltiple sencilla
Tim comienza mostrando dos listas que ya tiene en su código:
List<string> usualNames = new() {
"Tim Corey",
"Sue Storm",
"Bilbo Baggins",
"John Doe",
"Princess Donut",
"Steve Rogers"
};
List<string> familyNames = new() {
"Charity",
"Jon",
"Chris"
};
List<string> usualNames = new() {
"Tim Corey",
"Sue Storm",
"Bilbo Baggins",
"John Doe",
"Princess Donut",
"Steve Rogers"
};
List<string> familyNames = new() {
"Charity",
"Jon",
"Chris"
};
(You can see these on screen at about 0:38.)
Crea una List
Tim subraya que cada opción será un objeto de cadena y que la consulta devolverá una matriz o lista de las opciones seleccionadas por el usuario (1:20-1:26).
A continuación, añade un título personalizado para orientar al usuario:
.Title("Which are your favorite placeholder names?")
.Title("Which are your favorite placeholder names?")
Esto establece un encabezado claro en la parte superior del aviso (1:31-1:50).
Añadir texto de instrucciones para guiar al usuario
Tim no se limita a un título. También añade un texto de instrucciones para indicar al usuario cómo interactuar con el mensaje (1:50).
Escribe algo como
.InstructionsText("(Press <space> to toggle, <enter> to accept)")
.InstructionsText("(Press <space> to toggle, <enter> to accept)")
En el minuto 1:56 explica que incluso puedes darle formato con colores u otros estilos: Spectre Console admite la personalización del color de acento, de modo que tus instrucciones podrían aparecer en verde, azul, amarillo, gris o rojo para resaltar las partes clave.
Lo importante es decirle al usuario: presione la barra espaciadora para alternar elementos, pulse intro para aceptar su respuesta (2:12). De este modo, se facilita la escritura al usuario.
Añadir opciones y mostrar los resultados
A continuación, Tim añade los datos reales. Al principio, lo simplifica con una lista. Utiliza .AddChoices(usualNames) (2:24-2:34).
A continuación, escribe un sencillo bucle foreach para devolver las selecciones del usuario a la consola (2:38-2:52):
foreach (var name in favoriteNames)
{
Console.WriteLine(name);
}
foreach (var name in favoriteNames)
{
Console.WriteLine(name);
}
No se preocupa por el formato, sólo por mostrar que el indicador de selección múltiple funciona (2:53-3:00).
Tim ejecuta el programa en el terminal (3:00). El aviso muestra su lista de nombres. Utiliza la barra espaciadora para elegir algunos elementos -como "Tim Corey" y "Sue Storm"-, pulsa Intro y la consola imprime las opciones elegidas (3:07-3:15). Aquí se muestra la versión de trabajo más sencilla.

Pasar a listas múltiples con grupos de elección
Con la configuración básica funcionando, Tim hace las cosas "un poco más interesantes" (3:22). En lugar de una sola lista, tiene dos listas: usualNames y familyNames.
Comenta la llamada original .AddChoices() e introduce .AddChoiceGroup() (3:32-3:38). Esto le permite agrupar elementos relacionados bajo una etiqueta. Escribe:
.AddChoiceGroup("The usual names", usualNames)
.AddChoiceGroup("Family names", familyNames)
.AddChoiceGroup("The usual names", usualNames)
.AddChoiceGroup("Family names", familyNames)
Ahora, cada grupo aparecerá por separado en el texto. Esta estructura es especialmente útil cuando se presentan docenas de opciones y se desea organizarlas en páginas o grupos. Aunque la transcripción no lo muestra, el indicador de selección múltiple de Spectre Console también tiene una propiedad PageSize para que pueda controlar cuántos elementos se muestran a la vez cuando hay más opciones de las que caben en una pantalla.
Cómo funciona la selección de grupos en tiempo de ejecución
Tim guarda y vuelve a ejecutar el código (4:11). El nuevo aviso muestra ambos grupos con etiquetas claras. Si mueve el cursor a la etiqueta "Los nombres habituales" y pulsa la barra espaciadora, se seleccionan todos los elementos de ese grupo a la vez (4:17-4:19).
También señala que Spectre Console gestiona automáticamente el desplazamiento si la lista es más larga que la pantalla: verás un mensaje en gris que dice "muévete hacia arriba y hacia abajo para ver más opciones" (4:25-4:31). Es el comportamiento por defecto de las listas desplegables.
Tim muestra cómo desplazarse hasta los apellidos, seleccionarlos y, a continuación, seleccionar también a una persona como Sue Storm (4:39-4:43). Cuando pulsa Intro, la consola imprime todos los nombres elegidos combinados (4:45). Esto muestra cómo la función muestra más opciones, le permite alternarlas y, a continuación, devuelve una única lista de objetos seleccionados.

Comprensión de la solicitud de selección múltiple frente a la solicitud de selección
A las 5:00 Tim resume lo que ha mostrado. La consulta de selección múltiple funciona como la consulta de selección normal, pero devuelve una lista del tipo que se introduzca (5:03-5:08).
Puede añadir texto de instrucciones como hizo él, y puede utilizar grupos de elección para organizar y, opcionalmente, seleccionar grupos enteros con una pulsación de tecla (5:14-5:18). Esto hace que los menús grandes o complejos sean mucho más manejables para el usuario.
Esto también alude a la capacidad de Spectre Console para trabajar con objetos complejos: el objeto elegido puede ser algo más que una cadena. Puede suministrar un objeto con una propiedad ChoiceLabel para controlar lo que se muestra, al tiempo que recibe de vuelta el objeto completo cuando el usuario acepta su respuesta.
Uso flexible de grupos de opciones y etiquetas
Tim también aclara que no es necesario tener dos grupos para utilizar .AddChoiceGroup() (5:20-5:24). Aunque se trate de un solo grupo, tendrá la ventaja de poder seleccionar a todo el grupo a la vez.
Muestra que se puede llamar al grupo algo como "Seleccionar todo" para que sea más genérico (5:34-5:42). Al seleccionar la entrada superior, se activarán todos los elementos inferiores (5:44-5:47). También puede utilizar el resaltado por colores -por ejemplo, haciendo que la etiqueta del grupo sea verde o azul para distinguirlo- para guiar al usuario hacia el grupo predeterminado o requerido. Esto le da mucha flexibilidad a la hora de estructurar sus indicaciones.
Resumen
Tim termina el vídeo resumiendo: así es como se hacen los avisos de selección múltiple con Spectre Console, incluida la adición de grupos de elección para la selección agrupada (5:50-5:53). Como siempre, el código fuente está en la descripción (5:57).
Puntos clave del tutorial de Tim Corey
-
La selección múltiple de Spectre Console permite a los usuarios elegir cero, uno o varios elementos de una lista.
-
Añade un título y un texto de instrucciones para guiar a los usuarios; puede utilizar colores de acento para resaltar la información necesaria.
-
Utilice .AddChoices() para una lista simple; utilice .AddChoiceGroup() para listas múltiples o agrupadas.
-
Los usuarios pulsan la barra espaciadora para alternar las selecciones y la tecla Intro para aceptar.
-
Las etiquetas de grupo se pueden cambiar para seleccionar todos los elementos a la vez.
-
El aviso puede mostrar objetos complejos con una propiedad ChoiceLabel al tiempo que devuelve el objeto subyacente.
- El tamaño de la página y el desplazamiento ayudan cuando hay más opciones de las que caben en una página.
Siguiendo el ejemplo de Tim Corey -con sus listas reales de nombres y apellidos habituales- podrá implementar rápidamente listas de selección múltiple limpias y fáciles de usar en sus propias aplicaciones de la Consola Spectre.
