X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/b33515e9409fa034080d5e5560929649f7605944..e5b2b618bddda6961cfaa7c8af844245f240b300:/gui/form.c?ds=sidebyside diff --git a/gui/form.c b/gui/form.c index 44ad1e8..38d9373 100644 --- a/gui/form.c +++ b/gui/form.c @@ -1,10 +1,38 @@ #include "form.h" - -static void widget_free(t_Widget *); -static t_Widget *widget_input_create(t_Campo tipo, const char *nombre, unsigned int max); + +/** Libera la memoria ocupada por un widget + * + * \param w Widget a liberar + */ +static void widget_free(t_Widget *w); +/** Crea un nuevo campo de entrada de texto + * + * \param tipo Debe ser INPUT + * \param nombre Nombre del control (también usada como etiqueta). + * \param max Cantidad máxima de caracteres. + * \param defecto Valor inicial del campo. + */ +static t_Widget *widget_input_create(t_Campo tipo, const char *nombre, unsigned int max, const char *defecto); +/** Crea un nuevo RADIO Group + * + * \param tipo Debe ser RADIO + * \param nombre Nombre del campo + * \param max Cantidad de opciones + * \param valores Texto separado con comas con las opciones + */ static t_Widget *widget_radio_create(t_Campo tipo, const char *nombre, unsigned int max, const char *valores); +/** Ejecuta una consulta sobre un INPUT + * + * Permite ingresar texto en el INPUT hasta que se presiona ENTER + */ static int form_input(WINDOW *win, int x, int y, t_Widget *w); +/** Ejecuta una consulta sobre un RADIO + * + * Permite seleccionar una de las múltiples opciones del control. + * Para seleccionar se utilizan las feclas <- y -> y ENTER + * para aceptar. + */ static int form_radio(WINDOW *win, int x, int y, t_Widget *w); t_Form *form_crear(WINDOW *win) @@ -23,7 +51,7 @@ int form_destruir(t_Form *f) while (tmp) { f->primero = f->primero->sig; - widget_free(tmp); + tmp->destruir(tmp); tmp = f->primero; } free(f); @@ -33,15 +61,17 @@ int form_destruir(t_Form *f) void form_agregar_widget(t_Form *f, t_Campo tipo, const char *nombre, unsigned int max, const char *defecto) { t_Widget *tmp = NULL; - + + /* Creo el nuevo widget segun el tipo */ switch (tipo) { case INPUT: - tmp = widget_input_create(tipo, nombre, max); + tmp = widget_input_create(tipo, nombre, max, defecto); break; case RADIO: tmp = widget_radio_create(tipo, nombre, max, defecto); } + /* Si se creo wl widget, lo agrego al formulario al final */ if (tmp) { if (f->primero == NULL) { f->primero = f->ultimo = tmp; @@ -62,30 +92,24 @@ void form_ejecutar(t_Form *f, int x, int y) my_y++; mvwaddstr(f->win, my_y, x, tmp->nombre); waddch(f->win, ':'); + waddch(f->win, ' '); if (strlen(tmp->nombre) > offset) offset = strlen(tmp->nombre); tmp = tmp->sig; } - /* Agrego el : */ - ++offset; - x += offset; - + /* Agrego el ": " al offset*/ + x += offset + 2; + wrefresh(f->win); tmp = f->primero; my_y = y-1; while (tmp) { ++my_y; wmove(f->win, my_y, x); - 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); - } + salida = tmp->ejecutar(f->win, x, my_y, tmp); + wrefresh(f->win); tmp = tmp->sig; } - mvwaddstr(f->win, 0, 0, "SALI"); } char *form_obtener_valor(t_Form *f, const char *widget) @@ -107,8 +131,7 @@ char *form_obtener_valor(t_Form *f, const char *widget) return ""; } - -t_Widget *widget_input_create(t_Campo tipo, const char *nombre, unsigned int max) +t_Widget *widget_input_create(t_Campo tipo, const char *nombre, unsigned int max, const char *defecto) { t_Widget *tmp = (t_Widget *)malloc(sizeof(t_Widget)); @@ -119,9 +142,12 @@ t_Widget *widget_input_create(t_Campo tipo, const char *nombre, unsigned int max tmp->max = max; tmp->valor = (char *)malloc(sizeof(char)*(max+1)); tmp->valor[0] = '\0'; + strncpy(tmp->valor, defecto, max); tmp->sig = NULL; + tmp->ejecutar = form_input; + tmp->destruir = widget_free; return tmp; } @@ -157,6 +183,8 @@ t_Widget *widget_radio_create(t_Campo tipo, const char *nombre, unsigned int max strncpy(tmp->opciones[actual], valores+ini, fin-ini); tmp->opciones[actual][fin-ini] = '\0'; + tmp->ejecutar = form_radio; + tmp->destruir = widget_free; return tmp; } @@ -187,6 +215,7 @@ int form_input(WINDOW *win, int x, int y, t_Widget *w) current++; } + wrefresh(win); while ((c=getch()) != 13) { /* Verifico si se apreto basckspace */ if (c == KEY_BACKSPACE) { @@ -205,6 +234,7 @@ int form_input(WINDOW *win, int x, int y, t_Widget *w) wmove(win, y, x+current); waddch(win, c); w->valor[current++] = c; + wrefresh(win); } /* Cierro el string con el \0 */ w->valor[current+1] = '\0'; @@ -221,6 +251,7 @@ int form_radio(WINDOW *win, int x, int y, t_Widget *w) /* Array de posiciones para las Xs */ int xs[100]; /* TODO : Dinamizar!! */ + curs_set(0); wmove(win, y, x); _x = x; for(i=0; imax; i++) { @@ -235,6 +266,7 @@ int form_radio(WINDOW *win, int x, int y, t_Widget *w) wmove(win, y, xs[actual]); waddch(win, 'X'); + wrefresh(win); while ((c=getch()) != 13) { if (c == KEY_LEFT) { wmove(win, y, xs[actual]); @@ -252,9 +284,11 @@ int form_radio(WINDOW *win, int x, int y, t_Widget *w) wmove(win, y, xs[actual]); waddch(win, 'X'); } + wrefresh(win); } w->actual = actual; + curs_set(1); return 0; }