4 static void widget_free(t_Widget *);
5 static t_Widget *widget_input_create(t_Campo tipo, const char *nombre, unsigned int max);
6 static t_Widget *widget_radio_create(t_Campo tipo, const char *nombre, unsigned int max, const char *valores);
7 static int form_input(WINDOW *win, int x, int y, t_Widget *w);
8 static int form_radio(WINDOW *win, int x, int y, t_Widget *w);
10 t_Form *form_crear(WINDOW *win)
12 t_Form *tmp = (t_Form *)malloc(sizeof(t_Form));
13 tmp->primero = tmp->ultimo = NULL;
16 /* TODO : El error se debe verificar afuera? */
20 int form_destruir(t_Form *f)
22 t_Widget *tmp = f->primero;
25 f->primero = f->primero->sig;
33 void form_agregar_widget(t_Form *f, t_Campo tipo, const char *nombre, unsigned int max, const char *defecto)
39 tmp = widget_input_create(tipo, nombre, max);
42 tmp = widget_radio_create(tipo, nombre, max, defecto);
46 if (f->primero == NULL) {
47 f->primero = f->ultimo = tmp;
55 void form_ejecutar(t_Form *f, int x, int y)
57 int offset = 0, my_y, salida;
58 t_Widget *tmp = f->primero;
60 /* Pongo las etiquetas de los campos, y me fijo el mayor offset */
63 mvwaddstr(f->win, my_y, x, tmp->nombre);
65 if (strlen(tmp->nombre) > offset)
66 offset = strlen(tmp->nombre);
78 wmove(f->win, my_y, x);
81 salida = form_input(f->win, x, my_y, tmp);
84 salida = form_radio(f->win, x, my_y, tmp);
88 mvwaddstr(f->win, 0, 0, "SALI");
91 char *form_obtener_valor(t_Form *f, const char *widget)
94 t_Widget *tmp = f->primero;
96 if (strcmp(widget, tmp->nombre) == 0) {
101 return tmp->opciones[tmp->actual];
106 /* No hay nada. TODO : Retornar NULL? */
111 t_Widget *widget_input_create(t_Campo tipo, const char *nombre, unsigned int max)
113 t_Widget *tmp = (t_Widget *)malloc(sizeof(t_Widget));
116 tmp->nombre = (char *)malloc(sizeof(char)*(strlen(nombre)+1));
117 strcpy(tmp->nombre, nombre);
120 tmp->valor = (char *)malloc(sizeof(char)*(max+1));
121 tmp->valor[0] = '\0';
128 t_Widget *widget_radio_create(t_Campo tipo, const char *nombre, unsigned int max, const char *valores)
130 int ini, fin, actual;
131 t_Widget *tmp = (t_Widget *)malloc(sizeof(t_Widget));
134 tmp->nombre = (char *)malloc(sizeof(char)*(strlen(nombre)+1));
135 strcpy(tmp->nombre, nombre);
138 tmp->opciones = (char **)malloc(sizeof(char*)*(max));
139 /* Parseo VALOR separado por comas */
143 while (valores[fin] != '\0') {
144 if (valores[fin] == ',') {
145 tmp->opciones[actual] = (char *)malloc(sizeof(char)*(fin-ini+1));
146 strncpy(tmp->opciones[actual], valores+ini, fin-ini);
147 tmp->opciones[actual][fin-ini] = '\0';
155 /* Me queda el ultimo elemento */
156 tmp->opciones[actual] = (char *)malloc(sizeof(char)*(fin-ini+1));
157 strncpy(tmp->opciones[actual], valores+ini, fin-ini);
158 tmp->opciones[actual][fin-ini] = '\0';
163 void widget_free(t_Widget *w)
172 for(i=0; i<w->max; i++)
173 free(w->opciones[i]);
179 int form_input(WINDOW *win, int x, int y, t_Widget *w)
181 char *tmp = w->valor;
183 mvwaddstr(win, y, x, w->valor);
185 while ((*tmp) != '\0') {
190 while ((c=getch()) != 13) {
191 /* Verifico si se apreto basckspace */
192 if (c == KEY_BACKSPACE) {
194 w->valor[current--] = '\0';
196 wmove(win, y, x+current);
198 /* Este va para dejar el cursor bien, ya que addch mueve el cursor*/
199 wmove(win, y, x+current);
202 /* Si no entra mas, ignoro toda entrada */
203 if (current >= w->max) continue;
205 wmove(win, y, x+current);
207 w->valor[current++] = c;
209 /* Cierro el string con el \0 */
210 w->valor[current+1] = '\0';
212 /* Retorno la tecla con la que se salio. */
213 /* De esa forma, ESC pasa al campo anterios. ENTER al siguiente */
217 int form_radio(WINDOW *win, int x, int y, t_Widget *w)
219 /* Por ahora solo pongo las cosas y me voy */
220 int i, actual, _x, c;
221 /* Array de posiciones para las Xs */
222 int xs[100]; /* TODO : Dinamizar!! */
226 for(i=0; i<w->max; i++) {
227 waddch(win, '('); _x++;
228 waddch(win, ' '); xs[i] = _x; _x++;
229 waddch(win, ')'); _x++;
230 waddstr(win, w->opciones[i]); _x += strlen(w->opciones[i]);
231 waddch(win, ' '); _x++;
235 wmove(win, y, xs[actual]);
238 while ((c=getch()) != 13) {
240 wmove(win, y, xs[actual]);
243 if (actual < 0) actual = 0;
244 wmove(win, y, xs[actual]);
247 if (c == KEY_RIGHT) {
248 wmove(win, y, xs[actual]);
251 if (actual >= w->max) actual = w->max-1;
252 wmove(win, y, xs[actual]);