grmenu 0.1.6 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/GRmenu.rb +1834 -293
- data/README.md +430 -225
- data/data/help.txt +304 -0
- metadata +7 -3
data/README.md
CHANGED
|
@@ -1,337 +1,542 @@
|
|
|
1
|
-
|
|
1
|
+
# GRmenu (Ruby) v3.0
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**Suite TUI Profesional y Ligera para la Creacion de Interfaces de Linea de Comandos en Terminales TTY.**
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
Flechas arriba/abajo para moverte · `Enter` para elegir · `q` para salir
|
|
5
|
+
Menus interactivos por teclado, seleccion multiple con casillas de verificacion, controles deslizantes en tiempo real, renderizado de imagenes ANSI TrueColor de 24 bits, modo cromatico RGB animado a 30 FPS, modales nativos de confirmacion y texto, buscador instantaneo en vivo, cuadriculas bidimensionales, barras de progreso y banners 3D sin dependencias externas.
|
|
8
6
|
|
|
9
7
|
[](https://badge.fury.io/rb/grmenu)
|
|
10
8
|
[](LICENSE)
|
|
11
9
|
[](https://github.com/JoseEduardoGR/GRmenu)
|
|
10
|
+
[](https://www.ruby-lang.org)
|
|
11
|
+
|
|
12
|
+
---
|
|
12
13
|
|
|
13
|
-
|
|
14
|
+
## Tabla de Contenidos
|
|
15
|
+
|
|
16
|
+
1. [Por que elegir GRmenu?](#-por-que-elegir-grmenu)
|
|
17
|
+
2. [Instalacion y Requisitos](#-instalacion-y-requisitos)
|
|
18
|
+
3. [Inicio Rapido en 10 Segundos](#-inicio-rapido-en-10-segundos)
|
|
19
|
+
4. [Guia de Componentes y Caracteristicas](#-guia-de-componentes-y-caracteristicas)
|
|
20
|
+
- [1. Menu Interactivo Principal (Buscador, Grid 2D y Paginacion)](#1-menu-interactivo-principal)
|
|
21
|
+
- [2. Seleccion Multiple con Checkboxes (GRmenu.checkbox)](#2-seleccion-multiple-con-checkboxes)
|
|
22
|
+
- [3. Control Deslizante Interactivo (GRmenu.slider)](#3-control-deslizante-interactivo)
|
|
23
|
+
- [4. Renderizado Universal de Imagenes (GRmenu.image)](#4-renderizado-universal-de-imagenes)
|
|
24
|
+
- [5. Modales Nativos de Confirmacion y Entrada (confirm e input)](#5-modales-nativos-de-confirmacion-y-entrada)
|
|
25
|
+
- [6. Modo RGB Chroma Wave Animado a 30 FPS](#6-modo-rgb-chroma-wave-animado)
|
|
26
|
+
- [7. Barra de Progreso y Spinner de Carga](#7-barra-de-progreso-y-spinner-de-carga)
|
|
27
|
+
- [8. Banners 3D y Lineas Divisorias](#8-banners-3d-y-lineas-divisorias)
|
|
28
|
+
- [9. Modulo Independiente de Color (Color / C)](#9-modulo-independiente-de-color)
|
|
29
|
+
5. [Catalogo Visual de Fuentes 3D (1 al 10)](#-catalogo-visual-de-fuentes-3d)
|
|
30
|
+
6. [Catalogo Visual de Marcos y Bordes (1 al 20)](#-catalogo-visual-de-marcos-y-bordes)
|
|
31
|
+
7. [Referencia Exhaustiva de la API](#-referencia-exhaustiva-de-la-api)
|
|
32
|
+
8. [Mapa de Controles y Teclado](#-mapa-de-controles-y-teclado)
|
|
33
|
+
9. [Recetas y Casos de Uso del Mundo Real](#-recetas-y-casos-de-uso-del-mundo-real)
|
|
34
|
+
10. [Licencia](#-licencia)
|
|
14
35
|
|
|
15
36
|
---
|
|
16
37
|
|
|
17
|
-
##
|
|
38
|
+
## Por que elegir GRmenu?
|
|
18
39
|
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
- 🛠️ **Helpers nativos en modo crudo** — `clear_screen`, `continue`, `banner`, `div` y `help` sin subprocesos lentos del sistema.
|
|
25
|
-
- 💻 **100% Multiplataforma** — compatible con Linux, macOS y Windows (PowerShell, CMD, Windows Terminal, VS Code).
|
|
26
|
-
- 📦 **Cero dependencias externas** — utiliza únicamente la librería estándar `io/console`.
|
|
40
|
+
- **Cero Dependencias Externas:** Funciona exclusivamente con la libreria estandar de Ruby (`io/console`, `json`, `zlib`), sin gemas pesadas ni binarios nativos requeridos.
|
|
41
|
+
- **Modo TTY Crudo Instantaneo:** Control milimetrico de la consola sin parpadeo de pantalla y con captura instantanea de eventos de teclado (0 ms de latencia).
|
|
42
|
+
- **Animaciones Sin Lag a 30 FPS:** Motor de renderizado reactivo no bloqueante basado en `IO.select` que permite efectos visuales dinamicos continuos sin saturar la CPU ni bloquear la entrada del usuario.
|
|
43
|
+
- **Multiplataforma Real:** Totalmente compatible con Linux, macOS y Windows (Windows Terminal, PowerShell, CMD y VS Code Terminal).
|
|
44
|
+
- **Diseno Modular y Expresivo:** Desde un simple menu de 3 lineas hasta complejas suites de instalacion, paneles DevOps o herramientas de configuracion.
|
|
27
45
|
|
|
28
46
|
---
|
|
29
47
|
|
|
30
|
-
##
|
|
48
|
+
## Instalacion y Requisitos
|
|
49
|
+
|
|
50
|
+
Requiere **Ruby >= 2.6.0**.
|
|
51
|
+
|
|
52
|
+
### Via RubyGems
|
|
31
53
|
|
|
32
54
|
```bash
|
|
33
55
|
gem install grmenu
|
|
34
56
|
```
|
|
35
57
|
|
|
36
|
-
|
|
58
|
+
### Via Gemfile
|
|
37
59
|
|
|
38
60
|
```ruby
|
|
39
|
-
|
|
61
|
+
gem 'grmenu', '~> 3.0'
|
|
40
62
|
```
|
|
41
63
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
---
|
|
45
|
-
|
|
46
|
-
## 💡 Cómo se pasan las opciones y todos los parámetros
|
|
47
|
-
|
|
48
|
-
`GRmenu` permite pasar métodos directos, símbolos, arreglos con nombres personalizados, bloques lambda/procs y helpers. Además, acepta todos los parámetros de configuración visual en la instanciación:
|
|
64
|
+
### Requerimiento directo en scripts
|
|
49
65
|
|
|
50
66
|
```ruby
|
|
51
|
-
|
|
52
|
-
[
|
|
53
|
-
method(:iniciar_servidor), # 1. Method (auto-capitaliza: "Iniciar Servidor")
|
|
54
|
-
:crear_respaldo, # 2. Symbol (auto-capitaliza: "Crear Respaldo")
|
|
55
|
-
["Métricas del Sistema", method(:ver_metricas)], # 3. Array ["Nombre Personalizado", acción]
|
|
56
|
-
["Ejecutar Lambda", -> { puts Color.pink("Lambda!"); GRmenu.continue }], # 4. Lambda/Proc
|
|
57
|
-
["Probar Banner Helper", method(:prueba_banner_rapido)], # 5. Helper GRmenu.banner
|
|
58
|
-
["Ver Ayuda y Referencia", method(:ver_ayuda_completa)], # 6. Helper GRmenu.help
|
|
59
|
-
method(:salir) # 7. Salir
|
|
60
|
-
],
|
|
61
|
-
banner: "DEV OPS", # Texto gigante en arte ASCII 3D
|
|
62
|
-
title: "Panel de Control", # Título en el marco de opciones
|
|
63
|
-
subtitle: "Consola de Administración\nUsa las flechas y Enter", # Subtítulo (soporta saltos de línea \n)
|
|
64
|
-
font: 1, # Fuente del banner (1 al 10, por defecto 1: ANSI Shadow 3D)
|
|
65
|
-
style: 7, # Estilo de marco de opciones (1 al 20, ej: 7=redondeado, 3=doble)
|
|
66
|
-
banner_style: 3, # Estilo de marco del banner (1 al 20, ej: 3=doble línea)
|
|
67
|
-
divider: true, # Líneas divisorias a la par del banner (true, false o número)
|
|
68
|
-
center: true # Centrado automático del menú y subtítulo respecto al banner
|
|
69
|
-
)
|
|
67
|
+
require 'GRmenu'
|
|
70
68
|
```
|
|
71
69
|
|
|
72
70
|
---
|
|
73
71
|
|
|
74
|
-
##
|
|
72
|
+
## Inicio Rapido en 10 Segundos
|
|
75
73
|
|
|
76
|
-
|
|
74
|
+
Crea un archivo llamado `app.rb` y ejecuta `ruby app.rb`:
|
|
77
75
|
|
|
78
76
|
```ruby
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
require_relative "GRmenu"
|
|
77
|
+
require 'GRmenu'
|
|
82
78
|
|
|
83
|
-
|
|
84
|
-
def iniciar_servidor
|
|
79
|
+
def iniciar_servicio
|
|
85
80
|
GRmenu.clear_screen
|
|
86
|
-
puts Color.bright_green("->
|
|
81
|
+
puts Color.bright_green("-> Servicio iniciado exitosamente en http://localhost:3000")
|
|
87
82
|
GRmenu.continue
|
|
88
83
|
end
|
|
89
84
|
|
|
90
|
-
def
|
|
85
|
+
def ver_estado
|
|
91
86
|
GRmenu.clear_screen
|
|
92
|
-
puts Color.bright_cyan("->
|
|
87
|
+
puts Color.bright_cyan("-> Estado: Servidor Operativo | Memoria: 45 MB | Conexiones: 12")
|
|
93
88
|
GRmenu.continue
|
|
94
89
|
end
|
|
95
90
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
91
|
+
menu = GRmenu.new(
|
|
92
|
+
[
|
|
93
|
+
["Iniciar Servicio", method(:iniciar_servicio), "Lanza el worker en segundo plano"],
|
|
94
|
+
["Ver Estado", method(:ver_estado), "Muestra metricas de memoria y conexion"],
|
|
95
|
+
["Salir", -> { exit(0) }, "Finaliza la ejecucion"]
|
|
96
|
+
],
|
|
97
|
+
title: "Panel de Control",
|
|
98
|
+
banner: "MI APP",
|
|
99
|
+
style: 3
|
|
100
|
+
)
|
|
101
101
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
# Helper para mostrar un banner estático o animado en cualquier momento
|
|
105
|
-
GRmenu.banner("OK", 0, color: "green", level: 2, style: 3, font: 1)
|
|
106
|
-
GRmenu.div(40, "green", 1, "═")
|
|
107
|
-
puts Color.green(" Prueba completada con éxito.")
|
|
108
|
-
GRmenu.div(40, "green", 1, "═")
|
|
109
|
-
GRmenu.continue
|
|
110
|
-
end
|
|
102
|
+
menu.draw
|
|
103
|
+
```
|
|
111
104
|
|
|
112
|
-
|
|
113
|
-
GRmenu.clear_screen
|
|
114
|
-
# Helper interactivo que imprime toda la guía y referencia de GRmenu
|
|
115
|
-
GRmenu.help
|
|
116
|
-
GRmenu.continue
|
|
117
|
-
end
|
|
105
|
+
---
|
|
118
106
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
107
|
+
## Guia de Componentes y Caracteristicas
|
|
108
|
+
|
|
109
|
+
### 1. Menu Interactivo Principal
|
|
110
|
+
|
|
111
|
+
El constructor `GRmenu.new` proporciona una experiencia interactiva completa con navegacion continua, paginacion automatica, buscador en vivo y organizacion en cuadricula 2D.
|
|
112
|
+
|
|
113
|
+
```text
|
|
114
|
+
╔═══════════════════════════════════════════╗
|
|
115
|
+
║ Panel de Control ║
|
|
116
|
+
║═══════════════════════════════════════════║
|
|
117
|
+
║ Buscar: serv█ ║
|
|
118
|
+
║═══════════════════════════════════════════║
|
|
119
|
+
║ > [X] Servidor Web Nginx ║
|
|
120
|
+
║ [ ] Servidor Base de Datos Postgres ║
|
|
121
|
+
║───────────────────────────────────────────║
|
|
122
|
+
║ * Proxy inverso HTTP de alto rendimiento ║
|
|
123
|
+
╚═══════════════════════════════════════════╝
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
#### Formatos de Opciones Aceptados
|
|
124
127
|
|
|
125
|
-
|
|
128
|
+
Puedes combinar cualquiera de los siguientes formatos en el array de opciones:
|
|
129
|
+
|
|
130
|
+
```ruby
|
|
126
131
|
menu = GRmenu.new(
|
|
127
132
|
[
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
133
|
+
# 1. Method directo (auto-formatea y capitaliza el nombre)
|
|
134
|
+
method(:iniciar_servidor),
|
|
135
|
+
|
|
136
|
+
# 2. Symbol (invoca el metodo global o del contexto)
|
|
137
|
+
:crear_respaldo,
|
|
138
|
+
|
|
139
|
+
# 3. Arreglo [Etiqueta, Accion]
|
|
140
|
+
["Lanzar Proceso", method(:lanzar)],
|
|
141
|
+
|
|
142
|
+
# 4. Arreglo con Tooltip [Etiqueta, Accion, Descripcion]
|
|
143
|
+
["Limpieza de Cache", method(:limpiar), "Vacia los temporales en disco"],
|
|
144
|
+
|
|
145
|
+
# 5. Bloque anonimo Proc o Lambda
|
|
146
|
+
["Accion Rapida", -> { puts "Ejecutado!"; GRmenu.continue }, "Ejecuta bloque inline"],
|
|
147
|
+
|
|
148
|
+
# 6. Hash explicito
|
|
149
|
+
{ name: "Configuracion", action: method(:config), desc: "Ajustes del sistema" }
|
|
135
150
|
],
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
divider: true, # Líneas divisorias a la par del banner (true, false o número)
|
|
143
|
-
center: true # Centrado automático del menú y subtítulo respecto al banner
|
|
151
|
+
title: "Consola de Administracion",
|
|
152
|
+
banner: "SISTEMA",
|
|
153
|
+
search: true, # Activa buscador interactivo en vivo
|
|
154
|
+
columns: 2, # Cuadricula de 2 columnas con flechas izquierda/derecha
|
|
155
|
+
page_size: 6, # Paginacion con auto-scroll
|
|
156
|
+
style: 3
|
|
144
157
|
)
|
|
145
158
|
|
|
146
|
-
|
|
147
|
-
# Colores disponibles: "black", "gray", "red", "green", "yellow", "blue",
|
|
148
|
-
# "magenta", "purple", "pink", "cyan", "aqua", "orange", "white"
|
|
149
|
-
# Niveles de brillo: 1 = normal, 2 = brillante
|
|
150
|
-
|
|
151
|
-
menu.set_style.font(1) # 1 = ANSI Shadow 3D, 2 = Slant 3D, 3 = Doom, etc.
|
|
152
|
-
menu.set_style.banner("cyan", 2) # Color del banner ASCII
|
|
153
|
-
menu.set_style.title("yellow", 2) # Color del título del recuadro
|
|
154
|
-
menu.set_style.subtitle("white", 1)# Color del subtítulo/descripción
|
|
155
|
-
menu.set_style.divider("blue", 1) # Color de las líneas divisorias
|
|
156
|
-
menu.set_style.border("yellow", 1) # Color del borde del marco de opciones
|
|
157
|
-
menu.set_style.options("white", 1) # Color de opciones no seleccionadas
|
|
158
|
-
menu.set_style.focus("green", 2) # Color y brillo de la opción resaltada
|
|
159
|
-
|
|
160
|
-
# 4. Dibujar y lanzar el menú interactivo
|
|
161
|
-
# size_max / min_width define el ancho mínimo sugerido para el marco de opciones
|
|
162
|
-
menu.draw(size_max: 38)
|
|
159
|
+
menu.draw(size_max: 44)
|
|
163
160
|
```
|
|
164
161
|
|
|
165
162
|
---
|
|
166
163
|
|
|
167
|
-
|
|
164
|
+
### 2. Seleccion Multiple con Checkboxes
|
|
168
165
|
|
|
169
|
-
|
|
166
|
+
Permite al usuario seleccionar multiples elementos simultaneamente mediante casillas de verificacion interactivas `[X]` / `[ ]`.
|
|
170
167
|
|
|
171
|
-
```
|
|
172
|
-
|
|
168
|
+
```text
|
|
169
|
+
╔══════════════════ Instalador de Paquetes ══════════════════╗
|
|
170
|
+
║ [X] Servidor Nginx Web ║
|
|
171
|
+
║ [X] Base de Datos PostgreSQL 16 ║
|
|
172
|
+
║ [ ] Almacen de Cache Redis 7.2 ║
|
|
173
|
+
║ [X] Monitor Prometheus ║
|
|
174
|
+
║────────────────────────────────────────────────────────────║
|
|
175
|
+
║ Espacio: Marcar | a: Todos | n: Ninguno | Enter: Confirmar ║
|
|
176
|
+
╚════════════════════════════════════════════════════════════╝
|
|
173
177
|
```
|
|
174
178
|
|
|
175
|
-
|
|
179
|
+
#### Codigo de Ejemplo:
|
|
176
180
|
|
|
177
181
|
```ruby
|
|
178
|
-
|
|
182
|
+
paquetes = [
|
|
183
|
+
["Servidor Nginx Web", true, "Proxy inverso de alta velocidad"],
|
|
184
|
+
["Base de Datos PostgreSQL 16", true, "Motor de datos principal"],
|
|
185
|
+
["Almacen de Cache Redis 7.2", false, "Cache en memoria RAM"],
|
|
186
|
+
["Monitor Prometheus", true, "Metricas y alertas"]
|
|
187
|
+
]
|
|
188
|
+
|
|
189
|
+
seleccionados = GRmenu.checkbox(
|
|
190
|
+
paquetes,
|
|
191
|
+
title: "Instalador de Paquetes",
|
|
192
|
+
color: "rgb",
|
|
193
|
+
style: 3
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
puts "Elementos seleccionados: #{seleccionados.length}"
|
|
197
|
+
seleccionados.each do |elem|
|
|
198
|
+
nombre = elem.is_a?(Array) ? elem[0] : elem
|
|
199
|
+
puts " - [X] #{nombre}"
|
|
200
|
+
end
|
|
179
201
|
```
|
|
180
202
|
|
|
181
|
-
|
|
203
|
+
**Teclas de Control en Checkbox:**
|
|
204
|
+
- `Espacio`: Alterna entre marcado `[X]` y desmarcado `[ ]`.
|
|
205
|
+
- `a` / `A`: Marca todos los elementos (*Select All*).
|
|
206
|
+
- `n` / `N`: Desmarca todos los elementos (*Deselect All*).
|
|
207
|
+
- `i` / `I`: Invierte la seleccion actual.
|
|
208
|
+
- `Enter`: Confirma y devuelve el arreglo de elementos seleccionados.
|
|
209
|
+
- `q` / `Esc`: Cancela y devuelve un arreglo vacio `[]`.
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
### 3. Control Deslizante Interactivo
|
|
214
|
+
|
|
215
|
+
Permite seleccionar numericamente un valor o porcentaje dentro de un rango mediante una barra horizontal en tiempo real.
|
|
182
216
|
|
|
183
217
|
```text
|
|
184
|
-
|
|
185
|
-
║
|
|
186
|
-
║
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
218
|
+
╔══════════════ Asignar Memoria RAM ══════════════╗
|
|
219
|
+
║ [████████████████████░░░░░░░░░░] 16 GB ║
|
|
220
|
+
║ ║
|
|
221
|
+
║ ← / → Ajustar paso | ↑ / ↓ Salto x5 | Enter OK ║
|
|
222
|
+
╚═════════════════════════════════════════════════╝
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
#### Codigo de Ejemplo:
|
|
226
|
+
|
|
227
|
+
```ruby
|
|
228
|
+
ram = GRmenu.slider(
|
|
229
|
+
"Asignar Memoria RAM",
|
|
230
|
+
min: 1,
|
|
231
|
+
max: 64,
|
|
232
|
+
step: 1,
|
|
233
|
+
default: 16,
|
|
234
|
+
unit: "GB",
|
|
235
|
+
color: "rgb",
|
|
236
|
+
style: 3
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
puts "Memoria configurada: #{ram} GB"
|
|
201
240
|
```
|
|
202
241
|
|
|
242
|
+
**Teclas de Control en Slider:**
|
|
243
|
+
- `←` / `→` o `h` / `l`: Ajusta el valor paso a paso (`step`).
|
|
244
|
+
- `↑` / `↓` o `k` / `j`: Salto rapido de 5 pasos.
|
|
245
|
+
- `Enter`: Guarda y retorna el numero exacto (`Integer` o `Float`).
|
|
246
|
+
- `q` / `Esc`: Cancela y retorna el valor por defecto.
|
|
247
|
+
|
|
203
248
|
---
|
|
204
249
|
|
|
205
|
-
|
|
250
|
+
### 4. Renderizado Universal de Imagenes
|
|
251
|
+
|
|
252
|
+
Decodifica y renderiza cualquier formato de imagen (PNG, JPEG, JPG, WEBP, GIF, BMP) con micro-pixeles ANSI TrueColor de 24 bits y escalado proporcional exacto.
|
|
253
|
+
|
|
254
|
+
#### Renderizado Directo en Consola:
|
|
255
|
+
|
|
256
|
+
```ruby
|
|
257
|
+
# Renderiza una imagen centrada dentro de un marco estilizado
|
|
258
|
+
GRmenu.image("fondo.jpg", width: 60, color: "rgb", style: 3)
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
#### Como Cabecera Superior en un Menu:
|
|
206
262
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
263
|
+
```ruby
|
|
264
|
+
menu = GRmenu.new(
|
|
265
|
+
[
|
|
266
|
+
["Escanear Red", method(:escanear)],
|
|
267
|
+
["Ver Reporte", method(:reporte)],
|
|
268
|
+
["Salir", -> { exit(0) }]
|
|
269
|
+
],
|
|
270
|
+
image: "logo.png",
|
|
271
|
+
image_width: 44,
|
|
272
|
+
title: "Security Toolset",
|
|
273
|
+
style: 3
|
|
274
|
+
)
|
|
275
|
+
|
|
276
|
+
menu.draw
|
|
277
|
+
```
|
|
213
278
|
|
|
214
279
|
---
|
|
215
280
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
281
|
+
### 5. Modales Nativos de Confirmacion y Entrada
|
|
282
|
+
|
|
283
|
+
Cuadros de dialogo emergentes bloqueantes que capturan respuestas del usuario de forma directa y visual.
|
|
284
|
+
|
|
285
|
+
#### Modal de Confirmacion (`GRmenu.confirm`):
|
|
286
|
+
|
|
287
|
+
```ruby
|
|
288
|
+
# Dialogo interactivo Si / No con seleccion por flechas y teclado
|
|
289
|
+
if GRmenu.confirm("Deseas aplicar los cambios en produccion?", default: true, color: "rgb", style: 3)
|
|
290
|
+
puts Color.bright_green("-> Cambios aplicados con exito.")
|
|
291
|
+
else
|
|
292
|
+
puts Color.bright_red("-> Operacion cancelada.")
|
|
293
|
+
end
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
#### Cuadro de Entrada de Texto (`GRmenu.input`):
|
|
297
|
+
|
|
298
|
+
```ruby
|
|
299
|
+
# Entrada interactiva con cursor en vivo
|
|
300
|
+
nombre = GRmenu.input("Ingresa tu nombre de usuario:", default: "admin", color: "rgb", style: 3)
|
|
301
|
+
|
|
302
|
+
# Modo password para claves secretas (oculta caracteres con asteriscos)
|
|
303
|
+
token = GRmenu.input("Ingresa tu API Token:", password: true, color: "magenta", style: 7)
|
|
304
|
+
```
|
|
230
305
|
|
|
231
306
|
---
|
|
232
307
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
308
|
+
### 6. Modo RGB Chroma Wave Animado
|
|
309
|
+
|
|
310
|
+
Puedes activar el modo de color animado pasando `"rgb"`, `"rainbow"` o `"chroma"` a cualquier componente visual. El motor genera una onda sinusoidal horizontal que fluye suavemente a 30 FPS en segundo plano sin producir retraso en el teclado.
|
|
311
|
+
|
|
312
|
+
```ruby
|
|
313
|
+
menu = GRmenu.new(opciones, banner: "CHROMA", title: "RGB Wave Panel")
|
|
314
|
+
|
|
315
|
+
menu.set_style.banner("rgb") # Letras 3D en degradado continuo
|
|
316
|
+
menu.set_style.title("rgb") # Titulo de cabecera en RGB
|
|
317
|
+
menu.set_style.border("rgb") # Marco exterior multicolor
|
|
318
|
+
menu.set_style.divider("rgb") # Lineas divisorias animadas
|
|
319
|
+
menu.set_style.focus("rgb") # Cursor enfocado pulsando en RGB
|
|
320
|
+
menu.set_style.options("rgb") # Texto de opciones en tono suave
|
|
321
|
+
|
|
322
|
+
menu.draw
|
|
323
|
+
```
|
|
247
324
|
|
|
248
325
|
---
|
|
249
326
|
|
|
250
|
-
|
|
327
|
+
### 7. Barra de Progreso y Spinner de Carga
|
|
328
|
+
|
|
329
|
+
#### Barra de Progreso (`GRmenu.progress`):
|
|
251
330
|
|
|
252
331
|
```ruby
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
puts Color.pink("Texto en rosa")
|
|
260
|
-
puts Color.gray("Texto en gris")
|
|
332
|
+
GRmenu.progress(100, title: "Descargando Actualizacion", color: "rgb", style: 3) do |bar|
|
|
333
|
+
10.times do |i|
|
|
334
|
+
sleep 0.1
|
|
335
|
+
bar.advance(10, status: "Procesando bloque #{i + 1} de 10...")
|
|
336
|
+
end
|
|
337
|
+
end
|
|
261
338
|
```
|
|
262
339
|
|
|
263
|
-
|
|
340
|
+
#### Spinner Animado (`GRmenu.spinner`):
|
|
341
|
+
|
|
342
|
+
```ruby
|
|
343
|
+
resultado = GRmenu.spinner("Conectando con el cluster remoto...", color: "rgb") do
|
|
344
|
+
# Simula tarea pesada
|
|
345
|
+
sleep 1.5
|
|
346
|
+
"Conexion Establecida"
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
puts Color.bright_green("-> #{resultado}")
|
|
350
|
+
```
|
|
264
351
|
|
|
265
352
|
---
|
|
266
353
|
|
|
267
|
-
|
|
354
|
+
### 8. Banners 3D y Lineas Divisorias
|
|
268
355
|
|
|
269
356
|
```ruby
|
|
270
|
-
#
|
|
271
|
-
GRmenu.
|
|
357
|
+
# Imprime un banner en arte ASCII 3D con retardo opcional de animacion
|
|
358
|
+
GRmenu.banner("ADMIN", 0, color: "rgb", style: 3, font: 1)
|
|
272
359
|
|
|
273
|
-
#
|
|
274
|
-
GRmenu.
|
|
360
|
+
# Imprime una linea divisoria horizontal con ajuste automatico al ancho de terminal
|
|
361
|
+
GRmenu.div(60, "rgb", 1, "═")
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
---
|
|
275
365
|
|
|
276
|
-
|
|
277
|
-
GRmenu.div(60, "blue")
|
|
366
|
+
### 9. Modulo Independiente de Color
|
|
278
367
|
|
|
279
|
-
|
|
280
|
-
GRmenu.continue("Presiona cualquier tecla para continuar...")
|
|
368
|
+
El modulo `Color` (o su alias `C`) permite pintar cadenas de texto directamente con secuencias ANSI y TrueColor:
|
|
281
369
|
|
|
282
|
-
|
|
283
|
-
|
|
370
|
+
```ruby
|
|
371
|
+
# Modo Arcoiris RGB Dinamico
|
|
372
|
+
puts Color.rgb("Texto degradado en onda horizontal multicolor")
|
|
373
|
+
|
|
374
|
+
# Metodos directos por color (Nivel 1 Normal / Nivel 2 Brillante)
|
|
375
|
+
puts Color.bright_green("Verde brillante")
|
|
376
|
+
puts Color.bright_cyan("Cian brillante")
|
|
377
|
+
puts Color.bright_magenta("Magenta brillante")
|
|
378
|
+
puts Color.bright_yellow("Amarillo brillante")
|
|
379
|
+
puts Color.bright_red("Rojo brillante")
|
|
380
|
+
puts Color.orange("Naranja")
|
|
381
|
+
puts Color.purple("Morado")
|
|
382
|
+
puts Color.pink("Rosa")
|
|
383
|
+
puts Color.gray("Gris")
|
|
384
|
+
puts Color.white("Blanco")
|
|
385
|
+
|
|
386
|
+
# Atajos ultra-cortos de 1 o 2 letras
|
|
387
|
+
puts Color.g("Verde")
|
|
388
|
+
puts Color.cy("Cian")
|
|
389
|
+
puts Color.r("Rojo")
|
|
390
|
+
puts Color.y("Amarillo")
|
|
391
|
+
puts Color.w("Blanco")
|
|
392
|
+
puts Color.gr("Gris")
|
|
284
393
|
```
|
|
285
394
|
|
|
286
395
|
---
|
|
287
396
|
|
|
288
|
-
##
|
|
397
|
+
## Catalogo Visual de Fuentes 3D
|
|
289
398
|
|
|
290
|
-
|
|
399
|
+
Configura la tipografia mediante el parametro `font: 1..10`:
|
|
291
400
|
|
|
292
|
-
|
|
|
293
|
-
|
|
294
|
-
| `
|
|
295
|
-
| `
|
|
296
|
-
| `
|
|
297
|
-
| `
|
|
298
|
-
| `
|
|
299
|
-
| `
|
|
300
|
-
| `
|
|
301
|
-
| `
|
|
302
|
-
| `
|
|
401
|
+
| ID | Nombre de Fuente | Muestra Visual |
|
|
402
|
+
|:--:|:-----------------|:---------------|
|
|
403
|
+
| `1` | **ANSI Shadow 3D** *(Default)* | `██████╗ ██╗ ██╗` |
|
|
404
|
+
| `2` | **Slant 3D** | ` ____ __ __` |
|
|
405
|
+
| `3` | **Doom / Standard 3D** | ` ____ _ _` |
|
|
406
|
+
| `4` | **Graffiti Shadow 3D** | ` ,---. ,--. ,--.` |
|
|
407
|
+
| `5` | **Small Slant / Mini 3D** | ` ___ _ _` |
|
|
408
|
+
| `6` | **Modular Pipe 3D** | ` _____ _____` |
|
|
409
|
+
| `7` | **Bubble / Round Gothic** | ` ____ _ _` |
|
|
410
|
+
| `8` | **Double-Line Wire 3D** | ` ╔═════╗ ║ ║` |
|
|
411
|
+
| `9` | **Solid Fat 3D Block** | ` ██████▄ ██ ██` |
|
|
412
|
+
| `10`| **Arcade Stars Matrix** | ` ★★★★ ★ ★` |
|
|
303
413
|
|
|
304
|
-
|
|
414
|
+
---
|
|
305
415
|
|
|
306
|
-
|
|
307
|
-
|-------------------------------------|-------------------------------------------|
|
|
308
|
-
| `set_style.font(id)` | Cambia el tipo de fuente ASCII 3D (1..10). |
|
|
309
|
-
| `set_style.banner(color, level=2)` | Color y brillo del banner ASCII 3D. |
|
|
310
|
-
| `set_style.title(color, level=2)` | Color y brillo del título del marco. |
|
|
311
|
-
| `set_style.subtitle(color, level=1)`| Color y brillo del subtítulo. |
|
|
312
|
-
| `set_style.divider(color, level=1)` | Color y brillo de las líneas divisorias. |
|
|
313
|
-
| `set_style.border(color, level=1)` | Color y brillo del marco de opciones. |
|
|
314
|
-
| `set_style.options(color, level=1)` | Color y brillo de opciones no activas. |
|
|
315
|
-
| `set_style.focus(color, level=2)` | Color y brillo de la opción resaltada. |
|
|
416
|
+
## Catalogo Visual de Marcos y Bordes
|
|
316
417
|
|
|
317
|
-
|
|
418
|
+
Configura el diseno del marco mediante el parametro `style: 1..20`:
|
|
318
419
|
|
|
319
|
-
|
|
420
|
+
| ID | Muestra | ID | Muestra | ID | Muestra | ID | Muestra |
|
|
421
|
+
|:--:|:--------|:--:|:--------|:--:|:--------|:--:|:--------|
|
|
422
|
+
| `1` | `#####` (Hash) | `6` | `╓───╖` (Mixto) | `11`| `░░░░░` (Sombra suave) | `16`| `~~~~~` (Ondas) |
|
|
423
|
+
| `2` | `┌───┐` (Simple) | `7` | `╭───╮` (Curvas) | `12`| `█████` (Bloque) | `17`| `-----` (Guion) |
|
|
424
|
+
| `3` | `╔═══╗` (Doble) | `8` | `▛▀▀▀▜` (Outline) | `13`| `*****` (Asterisco) | `18`| `◆◆◆◆◆` (Rombos) |
|
|
425
|
+
| `4` | `┏━━━┓` (Gruesa) | `9` | `▓▓▓▓▓` (Sombra oscura) | `14`| `+++++` (Cruces) | `19`| `●○○○●` (Circulos) |
|
|
426
|
+
| `5` | `╒═══╕` (Mixto) | `10`| `▒▒▒▒▒` (Sombra media) | `15`| `=====` (Doble simple) | `20`| `★☆☆☆★` (Estrellas) |
|
|
320
427
|
|
|
321
428
|
---
|
|
322
429
|
|
|
323
|
-
##
|
|
430
|
+
## Referencia Exhaustiva de la API
|
|
431
|
+
|
|
432
|
+
### Constructor `GRmenu.new(functions, **opciones)`
|
|
433
|
+
|
|
434
|
+
| Parametro | Tipo | Valor por Defecto | Descripcion |
|
|
435
|
+
|:----------|:-----|:------------------|:------------|
|
|
436
|
+
| `functions` | `Array` | *Obligatorio* | Lista de metodos, simbolos, arrays `[nombre, accion, tooltip]`, procs o hashes. |
|
|
437
|
+
| `title:` | `String` | `""` | Titulo centrado en la cabecera del marco de opciones. |
|
|
438
|
+
| `banner:` | `String` | `""` | Texto convertido a arte ASCII 3D superior. |
|
|
439
|
+
| `subtitle:` | `String` | `""` | Descripcion o subtitulo (soporta saltos de linea `\n`). |
|
|
440
|
+
| `search:` | `Boolean` | `false` | Activa el buscador instantaneo mientras se escribe. |
|
|
441
|
+
| `columns:` | `Integer` | `1` | Cantidad de columnas para distribucion en cuadricula 2D. |
|
|
442
|
+
| `page_size:` | `Integer` | `auto` | Maximo de filas visibles antes de activar desplazamiento con scroll. |
|
|
443
|
+
| `style:` | `Integer` | `19` | Estilo de marco para las opciones (1 al 20). |
|
|
444
|
+
| `banner_style:` | `Integer` | `3` | Estilo de marco para el banner 3D (1 al 20). |
|
|
445
|
+
| `font:` | `Integer` | `1` | Fuente tipografica del banner ASCII (1 al 10). |
|
|
446
|
+
| `image:` | `String` | `nil` | Ruta al archivo de imagen de cabecera (PNG/JPG/WEBP/GIF/BMP). |
|
|
447
|
+
| `image_width:` | `Integer` | `40` | Ancho en columnas para el renderizado de la imagen. |
|
|
448
|
+
| `divider:` | `Boolean/Int` | `true` | Lineas divisorias horizontales ajustadas al marco. |
|
|
449
|
+
| `center:` | `Boolean` | `true` | Centrado horizontal simetrico automatico. |
|
|
450
|
+
|
|
451
|
+
### Metodos de Estilo `menu.set_style`
|
|
452
|
+
|
|
453
|
+
| Metodo | Argumentos | Descripcion |
|
|
454
|
+
|:-------|:-----------|:------------|
|
|
455
|
+
| `banner(color, level=2)` | `(String, Integer)` | Color del banner ASCII (soporta `"rgb"`). |
|
|
456
|
+
| `title(color, level=2)` | `(String, Integer)` | Color del titulo del recuadro (soporta `"rgb"`). |
|
|
457
|
+
| `subtitle(color, level=1)` | `(String, Integer)` | Color del texto del subtitulo (soporta `"rgb"`). |
|
|
458
|
+
| `divider(color, level=1)` | `(String, Integer)` | Color de las lineas divisorias (soporta `"rgb"`). |
|
|
459
|
+
| `border(color, level=1)` | `(String, Integer)` | Color del marco de opciones (soporta `"rgb"`). |
|
|
460
|
+
| `options(color, level=1)` | `(String, Integer)` | Color de las opciones inactivas (soporta `"rgb"`). |
|
|
461
|
+
| `focus(color, level=2)` | `(String, Integer)` | Color del cursor y opcion activa (soporta `"rgb"`). |
|
|
462
|
+
| `font(font_id)` | `(Integer 1..10)` | Cambia la fuente tipografica del banner. |
|
|
463
|
+
|
|
464
|
+
### Metodos Estaticos y Modales
|
|
465
|
+
|
|
466
|
+
| Metodo | Firma | Retorno |
|
|
467
|
+
|:-------|:------|:--------|
|
|
468
|
+
| `GRmenu.checkbox` | `(items, title:, color:, style:, page_size:, preselected:)` | `Array` con los elementos marcados. |
|
|
469
|
+
| `GRmenu.slider` | `(prompt, min:, max:, step:, default:, unit:, color:, style:)` | `Numeric` con el valor seleccionado. |
|
|
470
|
+
| `GRmenu.confirm` | `(pregunta, default: true, color: "cyan", style: 3)` | `Boolean` (`true` para Si, `false` para No). |
|
|
471
|
+
| `GRmenu.input` | `(prompt, default: "", password: false, color: "cyan", style: 3)` | `String` ingresado por el usuario. |
|
|
472
|
+
| `GRmenu.image` | `(filepath, width: 40, height: nil, style: 3, color: "cyan")` | Dibuja la imagen en la terminal. |
|
|
473
|
+
| `GRmenu.progress` | `(total = 100, title: nil, color: "cyan", style: 3, &bloque)` | Ejecuta el bloque con la barra de progreso. |
|
|
474
|
+
| `GRmenu.spinner` | `(mensaje = "...", color: "cyan", delay: 0.08, &bloque)` | Ejecuta el bloque mostrando un spinner animado. |
|
|
475
|
+
| `GRmenu.banner` | `(texto, delay = 0, color: "magenta", style: 3, font: 1)` | Imprime texto en arte ASCII 3D. |
|
|
476
|
+
| `GRmenu.div` | `(long = nil, color = "blue", level = 1, char = "─")` | Imprime una linea divisoria en la consola. |
|
|
477
|
+
| `GRmenu.clear_screen`| `()` (Alias: `GRmenu.clr`) | Limpia la pantalla y el scrollback al instante. |
|
|
478
|
+
| `GRmenu.continue` | `(texto = "Presiona cualquier tecla...")` | Pausa la ejecucion hasta presionar una tecla. |
|
|
479
|
+
| `GRmenu.help` | `()` | Muestra la guia interactiva de documentacion en consola. |
|
|
480
|
+
|
|
481
|
+
---
|
|
324
482
|
|
|
325
|
-
|
|
483
|
+
## Mapa de Controles y Teclado
|
|
484
|
+
|
|
485
|
+
| Tecla / Combinacion | Contexto | Accion Realizada |
|
|
486
|
+
|:--------------------|:---------|:-----------------|
|
|
487
|
+
| `↑` (Arriba) / `k` | Menus / Checkbox | Mueve el foco hacia arriba (con salto continuo *Snake* en extremos). |
|
|
488
|
+
| `↓` (Abajo) / `j` | Menus / Checkbox | Mueve el foco hacia abajo. |
|
|
489
|
+
| `←` / `→` | Grid 2D | Salta de columna a la izquierda o derecha. |
|
|
490
|
+
| `Espacio` | Checkbox | Marca o desmarca la casilla del elemento actual `[X]` / `[ ]`. |
|
|
491
|
+
| `a` / `A` | Checkbox | Marca todos los elementos (*Select All*). |
|
|
492
|
+
| `n` / `N` | Checkbox | Desmarca todos los elementos (*Deselect All*). |
|
|
493
|
+
| `i` / `I` | Checkbox | Invierte la seleccion de todos los elementos. |
|
|
494
|
+
| `←` / `→` o `h` / `l`| Slider | Ajusta el valor numerico en un incremento (`step`). |
|
|
495
|
+
| `↑` / `↓` o `k` / `j`| Slider | Salto rapido de 5 pasos en el valor numerico. |
|
|
496
|
+
| `Enter` | Global | Ejecuta la accion seleccionada o confirma el formulario. |
|
|
497
|
+
| `q` / `Esc` | Global | Sale del menu o cancela la operacion actual. |
|
|
498
|
+
| `Backspace` | Buscador / Input | Borra el ultimo caracter ingresado. |
|
|
499
|
+
| `Ctrl+U` | Buscador / Input | Limpia todo el texto ingresado. |
|
|
326
500
|
|
|
327
501
|
---
|
|
328
502
|
|
|
329
|
-
##
|
|
503
|
+
## Recetas y Casos de Uso del Mundo Real
|
|
504
|
+
|
|
505
|
+
### Asistente de Instalacion de Servidores
|
|
506
|
+
|
|
507
|
+
```ruby
|
|
508
|
+
require 'GRmenu'
|
|
509
|
+
|
|
510
|
+
GRmenu.clear_screen
|
|
511
|
+
GRmenu.banner("SETUP", 0, color: "rgb", style: 3, font: 1)
|
|
512
|
+
|
|
513
|
+
nombre = GRmenu.input("Nombre del proyecto:", default: "mi-app", color: "rgb")
|
|
514
|
+
puerto = GRmenu.slider("Puerto HTTP:", min: 3000, max: 9000, step: 100, default: 8080, color: "rgb")
|
|
515
|
+
|
|
516
|
+
modulos = [
|
|
517
|
+
["Proxy Nginx", true, "Servidor web frontal"],
|
|
518
|
+
["Base PostgreSQL", true, "Base de datos relacional"],
|
|
519
|
+
["Redis Cache", false, "Acelerador de sesiones"]
|
|
520
|
+
]
|
|
521
|
+
seleccion = GRmenu.checkbox(modulos, title: "Selecciona Modulos", color: "rgb")
|
|
522
|
+
|
|
523
|
+
if GRmenu.confirm("Deseas comenzar la instalacion ahora?", default: true, color: "rgb")
|
|
524
|
+
GRmenu.progress(100, title: "Instalando Componentes", color: "rgb") do |bar|
|
|
525
|
+
seleccion.each_with_index do |item, idx|
|
|
526
|
+
sleep 0.4
|
|
527
|
+
bar.advance(100 / seleccion.length, status: "Configurando #{item[0]}...")
|
|
528
|
+
end
|
|
529
|
+
end
|
|
530
|
+
puts Color.bright_green("\n-> Instalacion de '#{nombre}' completada en el puerto #{puerto}!")
|
|
531
|
+
end
|
|
532
|
+
GRmenu.continue
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
---
|
|
330
536
|
|
|
331
|
-
|
|
537
|
+
## Licencia
|
|
332
538
|
|
|
333
|
-
|
|
539
|
+
Distribuido bajo licencia **MIT**. Consulta [`LICENSE`](LICENSE) para mas detalles.
|
|
334
540
|
|
|
335
|
-
|
|
541
|
+
Desarrollado con precision por **[grcode](https://github.com/JoseEduardoGR)**
|
|
336
542
|
|
|
337
|
-
</div>
|