From: Ricardo Markiewicz Date: Tue, 30 Mar 2004 05:37:08 +0000 (+0000) Subject: * Se agrega un RADIO BUTTON al formulario :-) X-Git-Tag: svn_import_r684~675 X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/commitdiff_plain/1768f8e93e4bf3531b27b923036fa4fa98d29ccf?ds=sidebyside;hp=3e797d5e792af787f3a0d6c2568ca7d728e43860 * Se agrega un RADIO BUTTON al formulario :-) Para elegir la opciones usar feclas IZQ y DER y ENTER para pasar al campo siguiente. --- diff --git a/gui/form.c b/gui/form.c index 45ce6e7..cad8091 100644 --- a/gui/form.c +++ b/gui/form.c @@ -2,8 +2,10 @@ #include "form.h" static void widget_free(t_Widget *); -static t_Widget *widget_create(t_Campo tipo, const char *nombre, unsigned int max); +static t_Widget *widget_input_create(t_Campo tipo, const char *nombre, unsigned int max); +static t_Widget *widget_radio_create(t_Campo tipo, const char *nombre, unsigned int max, const char *valores); static int form_input(WINDOW *win, int x, int y, t_Widget *w); +static int form_radio(WINDOW *win, int x, int y, t_Widget *w); t_Form *form_crear(WINDOW *win) { @@ -28,15 +30,25 @@ int form_destruir(t_Form *f) return 1; } -void form_agregar_widget(t_Form *f, t_Campo tipo, const char *nombre, unsigned int max) +void form_agregar_widget(t_Form *f, t_Campo tipo, const char *nombre, unsigned int max, const char *defecto) { - t_Widget *tmp = widget_create(tipo, nombre, max); + t_Widget *tmp = NULL; + + switch (tipo) { + case INPUT: + tmp = widget_input_create(tipo, nombre, max); + break; + case RADIO: + tmp = widget_radio_create(tipo, nombre, max, defecto); + } - if (f->primero == NULL) { - f->primero = f->ultimo = tmp; - } else { - f->ultimo->sig = tmp; - f->ultimo = tmp; + if (tmp) { + if (f->primero == NULL) { + f->primero = f->ultimo = tmp; + } else { + f->ultimo->sig = tmp; + f->ultimo = tmp; + } } } @@ -64,7 +76,13 @@ void form_ejecutar(t_Form *f, int x, int y) while (tmp) { ++my_y; wmove(f->win, my_y, x); - salida = form_input(f->win, x, my_y, tmp); + switch (tmp->tipo) { + case INPUT: + salida = form_input(f->win, x, my_y, tmp); + break; + case RADIO: + salida = form_radio(f->win, x, my_y, tmp); + } tmp = tmp->sig; } mvwaddstr(f->win, 0, 0, "SALI"); @@ -76,7 +94,12 @@ char *form_obtener_valor(t_Form *f, const char *widget) t_Widget *tmp = f->primero; while (tmp) { if (strcmp(widget, tmp->nombre) == 0) { - return tmp->valor; + switch (tmp->tipo) { + case INPUT: + return tmp->valor; + case RADIO: + return tmp->opciones[tmp->actual]; + } } tmp = tmp->sig; } @@ -85,7 +108,7 @@ char *form_obtener_valor(t_Form *f, const char *widget) } -t_Widget *widget_create(t_Campo tipo, const char *nombre, unsigned int max) +t_Widget *widget_input_create(t_Campo tipo, const char *nombre, unsigned int max) { t_Widget *tmp = (t_Widget *)malloc(sizeof(t_Widget)); @@ -102,6 +125,41 @@ t_Widget *widget_create(t_Campo tipo, const char *nombre, unsigned int max) return tmp; } +t_Widget *widget_radio_create(t_Campo tipo, const char *nombre, unsigned int max, const char *valores) +{ + int ini, fin, actual; + t_Widget *tmp = (t_Widget *)malloc(sizeof(t_Widget)); + + tmp->tipo = tipo; + tmp->nombre = (char *)malloc(sizeof(char)*(strlen(nombre)+1)); + strcpy(tmp->nombre, nombre); + + tmp->max = max; + tmp->opciones = (char **)malloc(sizeof(char*)*(max)); + /* Parseo VALOR separado por comas */ + actual = ini = 0; + fin = ini+1; + tmp->sig = NULL; + while (valores[fin] != '\0') { + if (valores[fin] == ',') { + tmp->opciones[actual] = (char *)malloc(sizeof(char)*(fin-ini+1)); + strncpy(tmp->opciones[actual], valores+ini, fin-ini); + tmp->opciones[actual][fin-ini] = '\0'; + ini = fin+1; + fin = ini+1; + actual++; + } else { + fin++; + } + } + /* Me queda el ultimo elemento */ + tmp->opciones[actual] = (char *)malloc(sizeof(char)*(fin-ini+1)); + strncpy(tmp->opciones[actual], valores+ini, fin-ini); + tmp->opciones[actual][fin-ini] = '\0'; + + return tmp; +} + void widget_free(t_Widget *w) { free(w->nombre); @@ -146,3 +204,48 @@ int form_input(WINDOW *win, int x, int y, t_Widget *w) /* De esa forma, ESC pasa al campo anterios. ENTER al siguiente */ return c; } + +int form_radio(WINDOW *win, int x, int y, t_Widget *w) +{ + /* Por ahora solo pongo las cosas y me voy */ + int i, actual, _x, c; + /* Array de posiciones para las Xs */ + int xs[100]; /* TODO : Dinamizar!! */ + + wmove(win, y, x); + _x = x; + for(i=0; imax; i++) { + waddch(win, '('); _x++; + waddch(win, ' '); xs[i] = _x; _x++; + waddch(win, ')'); _x++; + waddstr(win, w->opciones[i]); _x += strlen(w->opciones[i]); + waddch(win, ' '); _x++; + } + + actual = 0; + wmove(win, y, xs[actual]); + waddch(win, 'X'); + + while ((c=getch()) != 13) { + if (c == KEY_LEFT) { + wmove(win, y, xs[actual]); + waddch(win, ' '); + actual--; + if (actual < 0) actual = 0; + wmove(win, y, xs[actual]); + waddch(win, 'X'); + } + if (c == KEY_RIGHT) { + wmove(win, y, xs[actual]); + waddch(win, ' '); + actual++; + if (actual >= w->max) actual = w->max-1; + wmove(win, y, xs[actual]); + waddch(win, 'X'); + } + } + + w->actual = actual; + return 0; +} + diff --git a/gui/form.h b/gui/form.h index 2d2bf71..9ac2a3c 100644 --- a/gui/form.h +++ b/gui/form.h @@ -7,13 +7,17 @@ #include #include -typedef enum {INPUT} t_Campo; +typedef enum {INPUT, RADIO} t_Campo; typedef struct _elem_ { char *nombre; /* nombre del widget */ t_Campo tipo; /* tipo */ - char *valor; /* valor actual */ - unsigned int max; /*tamaño maximo */ + union { + char *valor; /* valor actual */ + char **opciones; /* array de opciones */ + }; + unsigned int actual; /* En RADIO el seleccionado */ + unsigned int max; /* INPUT: tamaño maximo RADIO: Cant. Opciones */ struct _elem_ *sig; /* siguiente en la lista de foco */ } t_Widget; @@ -27,7 +31,7 @@ t_Form *form_crear(WINDOW *win); /* Libera un formulario */ int form_destruir(t_Form *); /* Agrega un nuevo campo */ -void form_agregar_widget(t_Form *, t_Campo tipo, const char *nombre, unsigned int max); +void form_agregar_widget(t_Form *, t_Campo tipo, const char *nombre, unsigned int max, const char *defecto); /* Ejecuta una entrada del formulario */ void form_ejecutar(t_Form *, int x, int y); char *form_obtener_valor(t_Form *, const char *widget); diff --git a/gui/gui.c b/gui/gui.c index 8d1da94..898fde9 100644 --- a/gui/gui.c +++ b/gui/gui.c @@ -51,9 +51,9 @@ int main(int argc, char *argv[]) /* Creo el formulario */ form = form_crear(mainwin); - form_agregar_widget(form, INPUT, "Nombre", 15); - form_agregar_widget(form, INPUT, "Padron", 5); - form_agregar_widget(form, INPUT, "Datos", 30); + form_agregar_widget(form, INPUT, "Nombre", 15, ""); + form_agregar_widget(form, RADIO, "Voto", 2, "Si,No"); + form_agregar_widget(form, INPUT, "Datos", 30, ""); form_ejecutar(form, 10, 10); @@ -64,7 +64,7 @@ int main(int argc, char *argv[]) /* Imprimo los datos! */ printf("Datos Ingresados : \n"); printf("\tNombre : %s\n", form_obtener_valor(form, "Nombre")); - printf("\tPadron : %s\n", form_obtener_valor(form, "Padron")); + printf("\tVoto : %s\n", form_obtener_valor(form, "Voto")); printf("\tDatos : %s\n", form_obtener_valor(form, "Datos")); /* Libero el formulario */