#include "form.h"
static void widget_free(t_Widget *);
-static t_Widget *widget_create(t_Campo tipo, const char *nombre, unsigned int max);
+static t_Widget *widget_input_create(t_Campo tipo, const char *nombre, unsigned int max);
+static t_Widget *widget_radio_create(t_Campo tipo, const char *nombre, unsigned int max, const char *valores);
static int form_input(WINDOW *win, int x, int y, t_Widget *w);
+static int form_radio(WINDOW *win, int x, int y, t_Widget *w);
t_Form *form_crear(WINDOW *win)
{
return 1;
}
-void form_agregar_widget(t_Form *f, t_Campo tipo, const char *nombre, unsigned int max)
+void form_agregar_widget(t_Form *f, t_Campo tipo, const char *nombre, unsigned int max, const char *defecto)
{
- t_Widget *tmp = widget_create(tipo, nombre, max);
+ t_Widget *tmp = NULL;
+
+ switch (tipo) {
+ case INPUT:
+ tmp = widget_input_create(tipo, nombre, max);
+ break;
+ case RADIO:
+ tmp = widget_radio_create(tipo, nombre, max, defecto);
+ }
- if (f->primero == NULL) {
- f->primero = f->ultimo = tmp;
- } else {
- f->ultimo->sig = tmp;
- f->ultimo = tmp;
+ if (tmp) {
+ if (f->primero == NULL) {
+ f->primero = f->ultimo = tmp;
+ } else {
+ f->ultimo->sig = tmp;
+ f->ultimo = tmp;
+ }
}
}
while (tmp) {
++my_y;
wmove(f->win, my_y, x);
- salida = form_input(f->win, x, my_y, tmp);
+ 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);
+ }
tmp = tmp->sig;
}
mvwaddstr(f->win, 0, 0, "SALI");
t_Widget *tmp = f->primero;
while (tmp) {
if (strcmp(widget, tmp->nombre) == 0) {
- return tmp->valor;
+ switch (tmp->tipo) {
+ case INPUT:
+ return tmp->valor;
+ case RADIO:
+ return tmp->opciones[tmp->actual];
+ }
}
tmp = tmp->sig;
}
}
-t_Widget *widget_create(t_Campo tipo, const char *nombre, unsigned int max)
+t_Widget *widget_input_create(t_Campo tipo, const char *nombre, unsigned int max)
{
t_Widget *tmp = (t_Widget *)malloc(sizeof(t_Widget));
return tmp;
}
+t_Widget *widget_radio_create(t_Campo tipo, const char *nombre, unsigned int max, const char *valores)
+{
+ int ini, fin, actual;
+ t_Widget *tmp = (t_Widget *)malloc(sizeof(t_Widget));
+
+ tmp->tipo = tipo;
+ tmp->nombre = (char *)malloc(sizeof(char)*(strlen(nombre)+1));
+ strcpy(tmp->nombre, nombre);
+
+ tmp->max = max;
+ tmp->opciones = (char **)malloc(sizeof(char*)*(max));
+ /* Parseo VALOR separado por comas */
+ actual = ini = 0;
+ fin = ini+1;
+ tmp->sig = NULL;
+ while (valores[fin] != '\0') {
+ if (valores[fin] == ',') {
+ tmp->opciones[actual] = (char *)malloc(sizeof(char)*(fin-ini+1));
+ strncpy(tmp->opciones[actual], valores+ini, fin-ini);
+ tmp->opciones[actual][fin-ini] = '\0';
+ ini = fin+1;
+ fin = ini+1;
+ actual++;
+ } else {
+ fin++;
+ }
+ }
+ /* Me queda el ultimo elemento */
+ tmp->opciones[actual] = (char *)malloc(sizeof(char)*(fin-ini+1));
+ strncpy(tmp->opciones[actual], valores+ini, fin-ini);
+ tmp->opciones[actual][fin-ini] = '\0';
+
+ return tmp;
+}
+
void widget_free(t_Widget *w)
{
free(w->nombre);
/* De esa forma, ESC pasa al campo anterios. ENTER al siguiente */
return c;
}
+
+int form_radio(WINDOW *win, int x, int y, t_Widget *w)
+{
+ /* Por ahora solo pongo las cosas y me voy */
+ int i, actual, _x, c;
+ /* Array de posiciones para las Xs */
+ int xs[100]; /* TODO : Dinamizar!! */
+
+ wmove(win, y, x);
+ _x = x;
+ for(i=0; i<w->max; i++) {
+ waddch(win, '('); _x++;
+ waddch(win, ' '); xs[i] = _x; _x++;
+ waddch(win, ')'); _x++;
+ waddstr(win, w->opciones[i]); _x += strlen(w->opciones[i]);
+ waddch(win, ' '); _x++;
+ }
+
+ actual = 0;
+ wmove(win, y, xs[actual]);
+ waddch(win, 'X');
+
+ while ((c=getch()) != 13) {
+ if (c == KEY_LEFT) {
+ wmove(win, y, xs[actual]);
+ waddch(win, ' ');
+ actual--;
+ if (actual < 0) actual = 0;
+ wmove(win, y, xs[actual]);
+ waddch(win, 'X');
+ }
+ if (c == KEY_RIGHT) {
+ wmove(win, y, xs[actual]);
+ waddch(win, ' ');
+ actual++;
+ if (actual >= w->max) actual = w->max-1;
+ wmove(win, y, xs[actual]);
+ waddch(win, 'X');
+ }
+ }
+
+ w->actual = actual;
+ return 0;
+}
+
#include <stdlib.h>
#include <curses.h>
-typedef enum {INPUT} t_Campo;
+typedef enum {INPUT, RADIO} t_Campo;
typedef struct _elem_ {
char *nombre; /* nombre del widget */
t_Campo tipo; /* tipo */
- char *valor; /* valor actual */
- unsigned int max; /*tamaño maximo */
+ union {
+ char *valor; /* valor actual */
+ char **opciones; /* array de opciones */
+ };
+ unsigned int actual; /* En RADIO el seleccionado */
+ unsigned int max; /* INPUT: tamaño maximo RADIO: Cant. Opciones */
struct _elem_ *sig; /* siguiente en la lista de foco */
} t_Widget;
/* Libera un formulario */
int form_destruir(t_Form *);
/* Agrega un nuevo campo */
-void form_agregar_widget(t_Form *, t_Campo tipo, const char *nombre, unsigned int max);
+void form_agregar_widget(t_Form *, t_Campo tipo, const char *nombre, unsigned int max, const char *defecto);
/* Ejecuta una entrada del formulario */
void form_ejecutar(t_Form *, int x, int y);
char *form_obtener_valor(t_Form *, const char *widget);
/* Creo el formulario */
form = form_crear(mainwin);
- form_agregar_widget(form, INPUT, "Nombre", 15);
- form_agregar_widget(form, INPUT, "Padron", 5);
- form_agregar_widget(form, INPUT, "Datos", 30);
+ form_agregar_widget(form, INPUT, "Nombre", 15, "");
+ form_agregar_widget(form, RADIO, "Voto", 2, "Si,No");
+ form_agregar_widget(form, INPUT, "Datos", 30, "");
form_ejecutar(form, 10, 10);
/* Imprimo los datos! */
printf("Datos Ingresados : \n");
printf("\tNombre : %s\n", form_obtener_valor(form, "Nombre"));
- printf("\tPadron : %s\n", form_obtener_valor(form, "Padron"));
+ printf("\tVoto : %s\n", form_obtener_valor(form, "Voto"));
printf("\tDatos : %s\n", form_obtener_valor(form, "Datos"));
/* Libero el formulario */