#include "form.h"
-
-static void widget_free(t_Widget *);
+
+/** Libera la memoria ocupada por un widget
+ *
+ * \param w Widget a liberar
+ */
+static void widget_free(t_Widget *w);
+/** Crea un nuevo campo de entrada de texto
+ *
+ * \param tipo Debe ser INPUT
+ * \param nombre Nombre del control (también usada como etiqueta).
+ * \param max Cantidad máxima de caracteres
+ */
static t_Widget *widget_input_create(t_Campo tipo, const char *nombre, unsigned int max);
+/** Crea un nuevo RADIO Group
+ *
+ * \param tipo Debe ser RADIO
+ * \param nombre Nombre del campo
+ * \param max Cantidad de opciones
+ * \param valores Texto separado con comas con las opciones
+ */
static t_Widget *widget_radio_create(t_Campo tipo, const char *nombre, unsigned int max, const char *valores);
+/** Ejecuta una consulta sobre un INPUT
+ *
+ * Permite ingresar texto en el INPUT hasta que se presiona ENTER
+ */
static int form_input(WINDOW *win, int x, int y, t_Widget *w);
+/** Ejecuta una consulta sobre un RADIO
+ *
+ * Permite seleccionar una de las múltiples opciones del control.
+ * Para seleccionar se utilizan las feclas <- y -> y ENTER
+ * para aceptar.
+ */
static int form_radio(WINDOW *win, int x, int y, t_Widget *w);
t_Form *form_crear(WINDOW *win)
while (tmp) {
f->primero = f->primero->sig;
- widget_free(tmp);
+ tmp->destruir(tmp);
tmp = f->primero;
}
free(f);
void form_agregar_widget(t_Form *f, t_Campo tipo, const char *nombre, unsigned int max, const char *defecto)
{
t_Widget *tmp = NULL;
-
+
+ /* Creo el nuevo widget segun el tipo */
switch (tipo) {
case INPUT:
tmp = widget_input_create(tipo, nombre, max);
tmp = widget_radio_create(tipo, nombre, max, defecto);
}
+ /* Si se creo wl widget, lo agrego al formulario al final */
if (tmp) {
if (f->primero == NULL) {
f->primero = f->ultimo = tmp;
my_y++;
mvwaddstr(f->win, my_y, x, tmp->nombre);
waddch(f->win, ':');
+ waddch(f->win, ' ');
if (strlen(tmp->nombre) > offset)
offset = strlen(tmp->nombre);
tmp = tmp->sig;
}
- /* Agrego el : */
- ++offset;
- x += offset;
+ /* Agrego el ": " al offset*/
+ x += offset + 2;
tmp = f->primero;
my_y = y-1;
while (tmp) {
++my_y;
wmove(f->win, my_y, x);
- 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);
- }
+ salida = tmp->ejecutar(f->win, x, my_y, tmp);
tmp = tmp->sig;
}
- mvwaddstr(f->win, 0, 0, "SALI");
}
char *form_obtener_valor(t_Form *f, const char *widget)
return "";
}
-
t_Widget *widget_input_create(t_Campo tipo, const char *nombre, unsigned int max)
{
t_Widget *tmp = (t_Widget *)malloc(sizeof(t_Widget));
tmp->sig = NULL;
+ tmp->ejecutar = form_input;
+ tmp->destruir = widget_free;
return tmp;
}
strncpy(tmp->opciones[actual], valores+ini, fin-ini);
tmp->opciones[actual][fin-ini] = '\0';
+ tmp->ejecutar = form_radio;
+ tmp->destruir = widget_free;
return tmp;
}
/* Array de posiciones para las Xs */
int xs[100]; /* TODO : Dinamizar!! */
+ curs_set(0);
wmove(win, y, x);
_x = x;
for(i=0; i<w->max; i++) {
}
w->actual = actual;
+ curs_set(1);
return 0;
}
#include "malloc_debug.h"
+/** Tipos de Widgets válidos */
typedef enum {INPUT, RADIO} t_Campo;
+/** Tipo de dato Widget */
typedef struct _elem_ {
- char *nombre; /* nombre del widget */
- t_Campo tipo; /* tipo */
+ /** Nombre */
+ char *nombre;
+ /** Tipo */
+ t_Campo tipo;
+ /** Dato a manejar
+ *
+ * El dato puede ser simple o múltiple, dependiendo
+ * si se opta por referencias valor u opciones.
+ *
+ * Consulte la documentación de union de ANSI-C para
+ * mas datos
+ */
union {
- char *valor; /* valor actual */
- char **opciones; /* array de opciones */
+ char *valor;
+ char **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 */
+ /** Elemento actual (si se utiliza valores múltiples */
+ unsigned int actual;
+ /** Máximo de elementos
+ *
+ * El uso varía según el Widget :
+ * INPUT : Cantidad máxima de caracteres.
+ * RADIO : Cantidad de Opciones
+ */
+ unsigned int max;
+ /** Siguiente elemento */
+ struct _elem_ *sig;
+
+ /* Métodos */
+ int (*ejecutar)(WINDOW *win, int x, int y, struct _elem_ *w);
+ void (*destruir)(struct _elem_ *);
} t_Widget;
typedef struct _form_ {