4 /** Libera la memoria ocupada por un widget
6 * \param w Widget a liberar
8 static void widget_free(t_Widget *w);
9 /** Crea un nuevo campo de entrada de texto
11 * \param tipo Debe ser INPUT
12 * \param nombre Nombre del control (también usada como etiqueta).
13 * \param max Cantidad máxima de caracteres
15 static t_Widget *widget_input_create(t_Campo tipo, const char *nombre, unsigned int max);
16 /** Crea un nuevo RADIO Group
18 * \param tipo Debe ser RADIO
19 * \param nombre Nombre del campo
20 * \param max Cantidad de opciones
21 * \param valores Texto separado con comas con las opciones
23 static t_Widget *widget_radio_create(t_Campo tipo, const char *nombre, unsigned int max, const char *valores);
24 /** Ejecuta una consulta sobre un INPUT
26 * Permite ingresar texto en el INPUT hasta que se presiona ENTER
28 static int form_input(WINDOW *win, int x, int y, t_Widget *w);
29 /** Ejecuta una consulta sobre un RADIO
31 * Permite seleccionar una de las múltiples opciones del control.
32 * Para seleccionar se utilizan las feclas <- y -> y ENTER
35 static int form_radio(WINDOW *win, int x, int y, t_Widget *w);
37 t_Form *form_crear(WINDOW *win)
39 t_Form *tmp = (t_Form *)malloc(sizeof(t_Form));
40 tmp->primero = tmp->ultimo = NULL;
43 /* TODO : El error se debe verificar afuera? */
47 int form_destruir(t_Form *f)
49 t_Widget *tmp = f->primero;
52 f->primero = f->primero->sig;
60 void form_agregar_widget(t_Form *f, t_Campo tipo, const char *nombre, unsigned int max, const char *defecto)
64 /* Creo el nuevo widget segun el tipo */
67 tmp = widget_input_create(tipo, nombre, max);
70 tmp = widget_radio_create(tipo, nombre, max, defecto);
73 /* Si se creo wl widget, lo agrego al formulario al final */
75 if (f->primero == NULL) {
76 f->primero = f->ultimo = tmp;
84 void form_ejecutar(t_Form *f, int x, int y)
86 int offset = 0, my_y, salida;
87 t_Widget *tmp = f->primero;
89 /* Pongo las etiquetas de los campos, y me fijo el mayor offset */
92 mvwaddstr(f->win, my_y, x, tmp->nombre);
95 if (strlen(tmp->nombre) > offset)
96 offset = strlen(tmp->nombre);
100 /* Agrego el ": " al offset*/
107 wmove(f->win, my_y, x);
108 salida = tmp->ejecutar(f->win, x, my_y, tmp);
113 char *form_obtener_valor(t_Form *f, const char *widget)
115 /* Busco el widget */
116 t_Widget *tmp = f->primero;
118 if (strcmp(widget, tmp->nombre) == 0) {
123 return tmp->opciones[tmp->actual];
128 /* No hay nada. TODO : Retornar NULL? */
132 t_Widget *widget_input_create(t_Campo tipo, const char *nombre, unsigned int max)
134 t_Widget *tmp = (t_Widget *)malloc(sizeof(t_Widget));
137 tmp->nombre = (char *)malloc(sizeof(char)*(strlen(nombre)+1));
138 strcpy(tmp->nombre, nombre);
141 tmp->valor = (char *)malloc(sizeof(char)*(max+1));
142 tmp->valor[0] = '\0';
146 tmp->ejecutar = form_input;
147 tmp->destruir = widget_free;
151 t_Widget *widget_radio_create(t_Campo tipo, const char *nombre, unsigned int max, const char *valores)
153 int ini, fin, actual;
154 t_Widget *tmp = (t_Widget *)malloc(sizeof(t_Widget));
157 tmp->nombre = (char *)malloc(sizeof(char)*(strlen(nombre)+1));
158 strcpy(tmp->nombre, nombre);
161 tmp->opciones = (char **)malloc(sizeof(char*)*(max));
162 /* Parseo VALOR separado por comas */
166 while (valores[fin] != '\0') {
167 if (valores[fin] == ',') {
168 tmp->opciones[actual] = (char *)malloc(sizeof(char)*(fin-ini+1));
169 strncpy(tmp->opciones[actual], valores+ini, fin-ini);
170 tmp->opciones[actual][fin-ini] = '\0';
178 /* Me queda el ultimo elemento */
179 tmp->opciones[actual] = (char *)malloc(sizeof(char)*(fin-ini+1));
180 strncpy(tmp->opciones[actual], valores+ini, fin-ini);
181 tmp->opciones[actual][fin-ini] = '\0';
183 tmp->ejecutar = form_radio;
184 tmp->destruir = widget_free;
188 void widget_free(t_Widget *w)
197 for(i=0; i<w->max; i++)
198 free(w->opciones[i]);
204 int form_input(WINDOW *win, int x, int y, t_Widget *w)
206 char *tmp = w->valor;
208 mvwaddstr(win, y, x, w->valor);
210 while ((*tmp) != '\0') {
215 while ((c=getch()) != 13) {
216 /* Verifico si se apreto basckspace */
217 if (c == KEY_BACKSPACE) {
219 w->valor[current--] = '\0';
221 wmove(win, y, x+current);
223 /* Este va para dejar el cursor bien, ya que addch mueve el cursor*/
224 wmove(win, y, x+current);
227 /* Si no entra mas, ignoro toda entrada */
228 if (current >= w->max) continue;
230 wmove(win, y, x+current);
232 w->valor[current++] = c;
234 /* Cierro el string con el \0 */
235 w->valor[current+1] = '\0';
237 /* Retorno la tecla con la que se salio. */
238 /* De esa forma, ESC pasa al campo anterios. ENTER al siguiente */
242 int form_radio(WINDOW *win, int x, int y, t_Widget *w)
244 /* Por ahora solo pongo las cosas y me voy */
245 int i, actual, _x, c;
246 /* Array de posiciones para las Xs */
247 int xs[100]; /* TODO : Dinamizar!! */
252 for(i=0; i<w->max; i++) {
253 waddch(win, '('); _x++;
254 waddch(win, ' '); xs[i] = _x; _x++;
255 waddch(win, ')'); _x++;
256 waddstr(win, w->opciones[i]); _x += strlen(w->opciones[i]);
257 waddch(win, ' '); _x++;
261 wmove(win, y, xs[actual]);
264 while ((c=getch()) != 13) {
266 wmove(win, y, xs[actual]);
269 if (actual < 0) actual = 0;
270 wmove(win, y, xs[actual]);
273 if (c == KEY_RIGHT) {
274 wmove(win, y, xs[actual]);
277 if (actual >= w->max) actual = w->max-1;
278 wmove(win, y, xs[actual]);