4 static void widget_free(t_Widget *);
5 static t_Widget *widget_create(t_Campo tipo, const char *nombre, unsigned int max);
6 static int form_input(WINDOW *win, int x, int y, t_Widget *w);
8 t_Form *form_crear(WINDOW *win)
10 t_Form *tmp = (t_Form *)malloc(sizeof(t_Form));
11 tmp->primero = tmp->ultimo = NULL;
14 /* TODO : El error se debe verificar afuera? */
18 int form_destruir(t_Form *f)
20 t_Widget *tmp = f->primero;
23 f->primero = f->primero->sig;
31 void form_agregar_widget(t_Form *f, t_Campo tipo, const char *nombre, unsigned int max)
33 t_Widget *tmp = widget_create(tipo, nombre, max);
35 if (f->primero == NULL) {
36 f->primero = f->ultimo = tmp;
43 void form_ejecutar(t_Form *f, int x, int y)
45 int offset = 0, my_y, salida;
46 t_Widget *tmp = f->primero;
48 /* Pongo las etiquetas de los campos, y me fijo el mayor offset */
51 mvwaddstr(f->win, my_y, x, tmp->nombre);
53 if (strlen(tmp->nombre) > offset)
54 offset = strlen(tmp->nombre);
66 wmove(f->win, my_y, x);
67 salida = form_input(f->win, x, my_y, tmp);
70 mvwaddstr(f->win, 0, 0, "SALI");
73 char *form_obtener_valor(t_Form *f, const char *widget)
76 t_Widget *tmp = f->primero;
78 if (strcmp(widget, tmp->nombre) == 0) {
83 /* No hay nada. TODO : Retornar NULL? */
88 t_Widget *widget_create(t_Campo tipo, const char *nombre, unsigned int max)
90 t_Widget *tmp = (t_Widget *)malloc(sizeof(t_Widget));
93 tmp->nombre = (char *)malloc(sizeof(char)*(strlen(nombre)+1));
94 strcpy(tmp->nombre, nombre);
97 tmp->valor = (char *)malloc(sizeof(char)*(max+1));
105 void widget_free(t_Widget *w)
112 int form_input(WINDOW *win, int x, int y, t_Widget *w)
114 char *tmp = w->valor;
116 mvwaddstr(win, y, x, w->valor);
118 while ((*tmp) != '\0') {
123 while ((c=getch()) != 13) {
124 /* Verifico si se apreto basckspace */
125 if (c == KEY_BACKSPACE) {
127 w->valor[current--] = '\0';
129 wmove(win, y, x+current);
131 /* Este va para dejar el cursor bien, ya que addch mueve el cursor*/
132 wmove(win, y, x+current);
135 /* Si no entra mas, ignoro toda entrada */
136 if (current >= w->max) continue;
138 wmove(win, y, x+current);
140 w->valor[current++] = c;
142 /* Cierro el string con el \0 */
143 w->valor[current+1] = '\0';
145 /* Retorno la tecla con la que se salio. */
146 /* De esa forma, ESC pasa al campo anterios. ENTER al siguiente */