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.
14 * \param defecto Valor inicial del campo.
16 static t_Widget *widget_input_create(t_Campo tipo, const char *nombre, unsigned int max, const char *defecto);
17 /** Crea un nuevo RADIO Group
19 * \param tipo Debe ser RADIO
20 * \param nombre Nombre del campo
21 * \param max Cantidad de opciones
22 * \param valores Texto separado con comas con las opciones
24 static t_Widget *widget_radio_create(t_Campo tipo, const char *nombre, unsigned int max, const char *valores);
25 /** Ejecuta una consulta sobre un INPUT
27 * Permite ingresar texto en el INPUT hasta que se presiona ENTER
29 static int form_input(WINDOW *win, int x, int y, t_Widget *w);
30 /** Ejecuta una consulta sobre un RADIO
32 * Permite seleccionar una de las múltiples opciones del control.
33 * Para seleccionar se utilizan las feclas <- y -> y ENTER
36 static int form_radio(WINDOW *win, int x, int y, t_Widget *w);
38 t_Form *form_crear(WINDOW *win)
40 t_Form *tmp = (t_Form *)malloc(sizeof(t_Form));
44 tmp->primero = tmp->ultimo = NULL;
50 int form_destruir(t_Form *f)
53 if (f == NULL) return 0;
58 f->primero = f->primero->sig;
66 void form_agregar_widget(t_Form *f, t_Campo tipo, const char *nombre, unsigned int max, const char *defecto)
70 if (f == NULL) return;
72 /* Creo el nuevo widget segun el tipo */
75 tmp = widget_input_create(tipo, nombre, max, defecto);
78 tmp = widget_radio_create(tipo, nombre, max, defecto);
81 /* Si se creo wl widget, lo agrego al formulario al final */
84 if (f->primero == NULL) {
85 f->primero = f->ultimo = tmp;
93 void form_ejecutar(t_Form *f, int x, int y)
95 int offset = 0, my_y, salida, i;
96 t_Widget *tmp = f->primero;
99 /* Calculo cual es la etiqueta más larga de FORM */
102 if (strlen(tmp->nombre) > offset)
103 offset = strlen(tmp->nombre);
107 /* Agrego el ": " al offset*/
112 /* Agrego el etiqueta y el valor actual para cada elemento */
115 mvwaddstr(f->win, my_y, x, tmp->nombre);
118 if (tmp->tipo == INPUT){
119 for(i=0; i<tmp->max; i++)
120 mvwaddch(f->win, my_y, x+offset+i, ' ');
121 mvwaddstr(f->win, my_y, x+offset, tmp->valor);
123 wmove(f->win, my_y, x+offset);
124 for(i=0; i<tmp->max; i++) {
128 waddstr(f->win, tmp->opciones[i]);
138 /* Ejecuto el formulario */
141 wmove(f->win, my_y, x+offset);
142 if (tmp->modificable)
143 salida = tmp->ejecutar(f->win, x+offset, my_y, tmp);
149 int form_obtener_valor_int(t_Form *f, const char *widget)
151 /* TODO : verificar errores */
152 return atoi(form_obtener_valor_char(f, widget));
155 float form_obtener_valor_float(t_Form *f, const char *widget)
157 /* TODO : verificar errores */
158 return atof(form_obtener_valor_char(f, widget));
161 char *form_obtener_valor_char(t_Form *f, const char *widget)
163 /* Busco el widget */
164 t_Widget *tmp = f->primero;
166 if (strcmp(widget, tmp->nombre) == 0) {
171 return tmp->opciones[tmp->actual];
176 /* No hay nada. TODO : Retornar NULL? */
180 t_Widget *widget_input_create(t_Campo tipo, const char *nombre, unsigned int max, const char *defecto)
182 t_Widget *tmp = (t_Widget *)malloc(sizeof(t_Widget));
184 if (tmp == NULL) return NULL;
187 tmp->nombre = (char *)malloc(sizeof(char)*(strlen(nombre)+1));
188 if (tmp->nombre == NULL) {
192 strcpy(tmp->nombre, nombre);
195 tmp->valor = (char *)malloc(sizeof(char)*(max+1));
196 if (tmp->valor == NULL) {
201 tmp->valor[0] = '\0';
202 strcpy(tmp->valor, defecto);
206 tmp->ejecutar = form_input;
207 tmp->destruir = widget_free;
211 t_Widget *widget_radio_create(t_Campo tipo, const char *nombre, unsigned int max, const char *valores)
213 int ini, fin, actual;
214 t_Widget *tmp = (t_Widget *)malloc(sizeof(t_Widget));
220 tmp->nombre = (char *)malloc(sizeof(char)*(strlen(nombre)+1));
221 if (tmp->nombre == NULL) {
225 strcpy(tmp->nombre, nombre);
228 tmp->opciones = (char **)malloc(sizeof(char*)*(max));
229 if (tmp->opciones == NULL) {
235 /* Parseo VALOR separado por comas */
239 while (valores[fin] != '\0') {
240 if (valores[fin] == ',') {
241 tmp->opciones[actual] = (char *)malloc(sizeof(char)*(fin-ini+1));
242 strncpy(tmp->opciones[actual], valores+ini, fin-ini);
243 tmp->opciones[actual][fin-ini] = '\0';
251 /* Me queda el ultimo elemento */
252 tmp->opciones[actual] = (char *)malloc(sizeof(char)*(fin-ini+1));
253 strncpy(tmp->opciones[actual], valores+ini, fin-ini);
254 tmp->opciones[actual][fin-ini] = '\0';
256 tmp->ejecutar = form_radio;
257 tmp->destruir = widget_free;
261 void widget_free(t_Widget *w)
264 if (w == NULL) return ;
272 for(i=0; i<w->max; i++)
273 free(w->opciones[i]);
279 int form_input(WINDOW *win, int x, int y, t_Widget *w)
281 char *tmp = w->valor;
283 mvwaddstr(win, y, x, w->valor);
285 while ((*tmp) != '\0') {
292 while ((c != KEY_ENTER) && (c != 13)) {
293 /* Verifico si se apreto basckspace */
294 if (c == KEY_BACKSPACE) {
296 w->valor[current--] = '\0';
298 wmove(win, y, x+current);
300 /* Este va para dejar el cursor bien, ya que addch mueve el cursor*/
301 wmove(win, y, x+current);
306 /* Si no entra mas, ignoro toda entrada */
307 if (current >= w->max) {
312 wmove(win, y, x+current);
314 w->valor[current++] = c;
318 /* Cierro el string con el \0 */
319 w->valor[current] = '\0';
320 /* Retorno la tecla con la que se salio. */
321 /* De esa forma, ESC pasa al campo anterios. ENTER al siguiente */
325 int form_radio(WINDOW *win, int x, int y, t_Widget *w)
327 /* Por ahora solo pongo las cosas y me voy */
328 int i, actual, _x, c;
329 /* Array de posiciones para las Xs */
330 int xs[100]; /* TODO : Dinamizar!! */
335 for(i=0; i<w->max; i++) {
336 waddch(win, '('); _x++;
337 waddch(win, ' '); xs[i] = _x; _x++;
338 waddch(win, ')'); _x++;
339 waddstr(win, w->opciones[i]); _x += strlen(w->opciones[i]);
340 waddch(win, ' '); _x++;
344 wmove(win, y, xs[actual]);
348 while ((c=getch()) != 13) {
350 wmove(win, y, xs[actual]);
353 if (actual < 0) actual = 0;
354 wmove(win, y, xs[actual]);
357 if (c == KEY_RIGHT) {
358 wmove(win, y, xs[actual]);
361 if (actual >= w->max) actual = w->max-1;
362 wmove(win, y, xs[actual]);
373 void form_es_modificable(t_Form *f, const char *widget, int b)
375 /* Busco el widget */
376 t_Widget *tmp = f->primero;
378 if (strcmp(widget, tmp->nombre) == 0) {
379 tmp->modificable = b;
386 void form_set_valor(t_Form *f, const char *widget, const char *s)
388 /* Busco el widget */
389 t_Widget *tmp = f->primero;
391 if (strcmp(widget, tmp->nombre) == 0) {
392 strcpy(tmp->valor, s);