X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/a149135d6cf1d32b45f3c92c8562170e5771faf9..1a91316f990d419553dcad3b40074f6484d28b28:/emufs_gui/form.c?ds=sidebyside diff --git a/emufs_gui/form.c b/emufs_gui/form.c index a97e3ba..b8907a0 100644 --- a/emufs_gui/form.c +++ b/emufs_gui/form.c @@ -38,16 +38,21 @@ static int form_radio(WINDOW *win, int x, int y, t_Widget *w); t_Form *form_crear(WINDOW *win) { t_Form *tmp = (t_Form *)malloc(sizeof(t_Form)); + if (tmp == NULL) { + return NULL; + } tmp->primero = tmp->ultimo = NULL; tmp->win = win; - /* TODO : El error se debe verificar afuera? */ return tmp; } int form_destruir(t_Form *f) { - t_Widget *tmp = f->primero; + t_Widget *tmp; + if (f == NULL) return 0; + + tmp = f->primero; while (tmp) { f->primero = f->primero->sig; @@ -62,6 +67,8 @@ void form_agregar_widget(t_Form *f, t_Campo tipo, const char *nombre, unsigned i { t_Widget *tmp = NULL; + if (f == NULL) return; + /* Creo el nuevo widget segun el tipo */ switch (tipo) { case INPUT: @@ -73,6 +80,7 @@ void form_agregar_widget(t_Form *f, t_Campo tipo, const char *nombre, unsigned i /* Si se creo wl widget, lo agrego al formulario al final */ if (tmp) { + tmp->modificable = 1; if (f->primero == NULL) { f->primero = f->ultimo = tmp; } else { @@ -84,10 +92,11 @@ void form_agregar_widget(t_Form *f, t_Campo tipo, const char *nombre, unsigned i void form_ejecutar(t_Form *f, int x, int y) { - int offset = 0, my_y, salida; + int offset = 0, my_y, salida, i; t_Widget *tmp = f->primero; my_y = y-1; - /* Pongo las etiquetas de los campos, y me fijo el mayor offset */ + + /* Calculo cual es la etiqueta más larga de FORM */ while (tmp) { my_y++; if (strlen(tmp->nombre) > offset) @@ -100,22 +109,38 @@ void form_ejecutar(t_Form *f, int x, int y) tmp = f->primero; my_y = y-1; + /* Agrego el etiqueta y el valor actual para cada elemento */ while (tmp) { ++my_y; mvwaddstr(f->win, my_y, x, tmp->nombre); waddch(f->win, ':'); waddch(f->win, ' '); - mvwaddstr(f->win, my_y, x+offset, tmp->valor); + if (tmp->tipo == INPUT){ + for(i=0; imax; i++) + mvwaddch(f->win, my_y, x+offset+i, ' '); + mvwaddstr(f->win, my_y, x+offset, tmp->valor); + } else { + wmove(f->win, my_y, x+offset); + for(i=0; imax; i++) { + waddch(f->win, '('); + waddch(f->win, ' '); + waddch(f->win, ')'); + waddstr(f->win, tmp->opciones[i]); + waddch(f->win, ' '); + } + } tmp = tmp->sig; } wrefresh(f->win); tmp = f->primero; my_y = y-1; + /* Ejecuto el formulario */ while (tmp) { ++my_y; wmove(f->win, my_y, x+offset); - salida = tmp->ejecutar(f->win, x+offset, my_y, tmp); + if (tmp->modificable) + salida = tmp->ejecutar(f->win, x+offset, my_y, tmp); wrefresh(f->win); tmp = tmp->sig; } @@ -156,14 +181,25 @@ t_Widget *widget_input_create(t_Campo tipo, const char *nombre, unsigned int max { t_Widget *tmp = (t_Widget *)malloc(sizeof(t_Widget)); + if (tmp == NULL) return NULL; + tmp->tipo = tipo; tmp->nombre = (char *)malloc(sizeof(char)*(strlen(nombre)+1)); + if (tmp->nombre == NULL) { + free(tmp); + return NULL; + } strcpy(tmp->nombre, nombre); tmp->max = max; tmp->valor = (char *)malloc(sizeof(char)*(max+1)); + if (tmp->valor == NULL) { + free(tmp->nombre); + free(tmp); + return NULL; + } tmp->valor[0] = '\0'; - strncpy(tmp->valor, defecto, max); + strcpy(tmp->valor, defecto); tmp->sig = NULL; @@ -176,13 +212,26 @@ t_Widget *widget_radio_create(t_Campo tipo, const char *nombre, unsigned int max { int ini, fin, actual; t_Widget *tmp = (t_Widget *)malloc(sizeof(t_Widget)); + if (tmp == NULL) { + return NULL; + } tmp->tipo = tipo; tmp->nombre = (char *)malloc(sizeof(char)*(strlen(nombre)+1)); + if (tmp->nombre == NULL) { + free(tmp); + return NULL; + } strcpy(tmp->nombre, nombre); tmp->max = max; tmp->opciones = (char **)malloc(sizeof(char*)*(max)); + if (tmp->opciones == NULL) { + free(tmp->nombre); + free(tmp); + return NULL; + } + /* Parseo VALOR separado por comas */ actual = ini = 0; fin = ini+1; @@ -212,6 +261,8 @@ t_Widget *widget_radio_create(t_Campo tipo, const char *nombre, unsigned int max void widget_free(t_Widget *w) { int i; + if (w == NULL) return ; + free(w->nombre); switch (w->tipo) { case INPUT: @@ -237,7 +288,8 @@ int form_input(WINDOW *win, int x, int y, t_Widget *w) } wrefresh(win); - while ((c=getch()) != 13) { + c = getch(); + while ((c != KEY_ENTER) && (c != 13)) { /* Verifico si se apreto basckspace */ if (c == KEY_BACKSPACE) { if (current > 0) { @@ -248,19 +300,23 @@ int form_input(WINDOW *win, int x, int y, t_Widget *w) /* Este va para dejar el cursor bien, ya que addch mueve el cursor*/ wmove(win, y, x+current); wrefresh(win); + c = getch(); continue; } /* Si no entra mas, ignoro toda entrada */ - if (current >= w->max) continue; - + if (current >= w->max) { + c = getch(); + continue; + } + wmove(win, y, x+current); waddch(win, c); w->valor[current++] = c; wrefresh(win); + c = getch(); } /* Cierro el string con el \0 */ - w->valor[current+1] = '\0'; - + w->valor[current] = '\0'; /* Retorno la tecla con la que se salio. */ /* De esa forma, ESC pasa al campo anterios. ENTER al siguiente */ return c; @@ -314,3 +370,29 @@ int form_radio(WINDOW *win, int x, int y, t_Widget *w) return 0; } +void form_es_modificable(t_Form *f, const char *widget, int b) +{ + /* Busco el widget */ + t_Widget *tmp = f->primero; + while (tmp) { + if (strcmp(widget, tmp->nombre) == 0) { + tmp->modificable = b; + break; + } + tmp = tmp->sig; + } +} + +void form_set_valor(t_Form *f, const char *widget, const char *s) +{ + /* Busco el widget */ + t_Widget *tmp = f->primero; + while (tmp) { + if (strcmp(widget, tmp->nombre) == 0) { + strcpy(tmp->valor, s); + break; + } + tmp = tmp->sig; + } +} +