]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - gui/form.c
* Agrego manejo de formulario generico utilizando NCurses
[z.facultad/75.06/emufs.git] / gui / form.c
1
2 #include "form.h"
3                 
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);
7
8 t_Form *form_crear(WINDOW *win)
9 {
10         t_Form *tmp = (t_Form *)malloc(sizeof(t_Form));
11         tmp->primero = tmp->ultimo = NULL;
12         tmp->win = win;
13
14         /* TODO : El error se debe verificar afuera? */
15         return tmp;
16 }
17
18 int form_destruir(t_Form *f)
19 {
20         t_Widget *tmp = f->primero;
21
22         while (tmp) {
23                 f->primero = f->primero->sig;
24                 widget_free(tmp);
25                 tmp = f->primero;
26         }
27         free(f);
28         return 1;
29 }
30
31 void form_agregar_widget(t_Form *f, t_Campo tipo, const char *nombre, unsigned int max)
32 {
33         t_Widget *tmp = widget_create(tipo, nombre, max);
34
35         if (f->primero == NULL) {
36                 f->primero = f->ultimo = tmp;
37         } else {
38                 f->ultimo->sig = tmp;
39                 f->ultimo = tmp;
40         }
41 }
42
43 void form_ejecutar(t_Form *f, int x, int y)
44 {
45         int offset = 0, my_y, salida;
46         t_Widget *tmp = f->primero;
47         my_y = y-1;
48         /* Pongo las etiquetas de los campos, y me fijo el mayor offset */
49         while (tmp) {
50                 my_y++;
51                 mvwaddstr(f->win, my_y, x, tmp->nombre);
52                 waddch(f->win, ':');
53                 if (strlen(tmp->nombre) > offset)
54                         offset = strlen(tmp->nombre);
55
56                 tmp = tmp->sig;
57         }
58         /* Agrego el : */
59         ++offset;
60         x += offset;
61
62         tmp = f->primero;
63         my_y = y-1;
64         while (tmp) {
65                 ++my_y;
66                 wmove(f->win, my_y, x);
67                 salida = form_input(f->win, x, my_y, tmp);
68                 tmp = tmp->sig;
69         }
70         mvwaddstr(f->win, 0, 0, "SALI");
71 }
72
73 char *form_obtener_valor(t_Form *f, const char *widget)
74 {
75         /* Busco el widget */
76         t_Widget *tmp = f->primero;
77         while (tmp) {
78                 if (strcmp(widget, tmp->nombre) == 0) {
79                         return tmp->valor;
80                 }
81                 tmp = tmp->sig;
82         }
83         /* No hay nada. TODO : Retornar NULL? */
84         return "";
85 }
86
87
88 t_Widget *widget_create(t_Campo tipo, const char *nombre, unsigned int max)
89 {
90         t_Widget *tmp = (t_Widget *)malloc(sizeof(t_Widget));
91
92         tmp->tipo = tipo;
93         tmp->nombre = (char *)malloc(sizeof(char)*(strlen(nombre)+1));
94         strcpy(tmp->nombre, nombre);
95
96         tmp->max = max;
97         tmp->valor = (char *)malloc(sizeof(char)*(max+1));
98         tmp->valor[0] = '\0';
99
100         tmp->sig = NULL;
101
102         return tmp;
103 }
104
105 void widget_free(t_Widget *w)
106 {
107         free(w->nombre);
108         free(w->valor);
109         free(w);
110 }
111
112 int form_input(WINDOW *win, int x, int y, t_Widget *w)
113 {
114         char *tmp = w->valor;
115         int current = 0, c;
116         mvwaddstr(win, y, x, w->valor);
117
118         while ((*tmp) != '\0') {
119                 tmp++;
120                 current++;
121         }
122
123         while ((c=getch()) != 13) {
124                 /* Verifico si se apreto basckspace */
125                 if (c == KEY_BACKSPACE) {
126                         if (current > 0) {
127                                 w->valor[current--] = '\0';
128                         }
129                         wmove(win, y, x+current);
130                         waddch(win, ' ');
131                         /* Este va para dejar el cursor bien, ya que addch mueve el cursor*/
132                         wmove(win, y, x+current);
133                         continue;
134                 }
135                 /* Si no entra mas, ignoro toda entrada */
136                 if (current >= w->max) continue;
137
138                 wmove(win, y, x+current);
139                 waddch(win, c);
140                 w->valor[current++] = c;
141         }
142         /* Cierro el string con el \0 */
143         w->valor[current+1] = '\0';
144
145         /* Retorno la tecla con la que se salio. */
146         /* De esa forma, ESC pasa al campo anterios. ENTER al siguiente */
147         return c;
148 }