]> git.llucax.com Git - z.facultad/75.06/emufs.git/commitdiff
* Se realiza una limpieza en gui.c. Ahora hay una unica rutina de
authorRicardo Markiewicz <gazer.arg@gmail.com>
Sat, 17 Apr 2004 14:50:29 +0000 (14:50 +0000)
committerRicardo Markiewicz <gazer.arg@gmail.com>
Sat, 17 Apr 2004 14:50:29 +0000 (14:50 +0000)
 manejo de menu, en lugar de 1 para cada vez que la necesitaba :-)
 * Se crean 2 lindas macros para simplificar la creacion del menu.
 * Se pone todo al dia.

emufs_gui/Makefile
emufs_gui/gui.c
emufs_gui/menu.c [new file with mode: 0644]
emufs_gui/menu.h [new file with mode: 0644]

index 3a925f7eb23d738c1f894176677f73b53141c20d..278cc09a10af3b4f4fd3f371f04ca29af4aa725a 100644 (file)
@@ -1,7 +1,7 @@
 CFLAGS=-Wall -g -I/usr/include/libxml2 -I../emufs -DDEBUG
 LDFLAGS= -lmenu -lncurses -lxml2
 
-OBJ=form.o gui.o articulos.o facturas.o registros.o ../emufs/libemufs.a
+OBJ=form.o gui.o articulos.o facturas.o registros.o menu.o ../emufs/libemufs.a
 all: gui 
 
 gui: $(OBJ)
index 3c7cdd9c71c0d14e803fd74af877d8ea47fc9ef6..6044b1643b3bdd642320c6222ee24946ce0e2dd6 100644 (file)
@@ -1,4 +1,5 @@
 
+
 #include <stdlib.h>
 #include <curses.h>
 #include <menu.h>
@@ -6,6 +7,7 @@
 #include <string.h>
 #include <stdarg.h>
 
+#include "menu.h"
 #include "form.h"
 #include "articulos.h"
 #include "facturas.h"
@@ -188,364 +190,91 @@ int main(int argc, char *argv[])
 
 void menu_facturas()
 {
-       WINDOW *menu_win;
-       MENU *menu;
-       ITEM **items;
-       int c, salir;
-       char *opciones[] = {
-                                       "Alta",
-                                       "Baja",
-                                       "Modificacion",
-                                       "Volver"
+       MENU(mi_menu) {
+               MENU_OPCION("Alta", "Crear una nueva factura."),
+               MENU_OPCION("Baja", "Elimina una factura existente."),
+               MENU_OPCION("Modificacion", "Modifica una factura existente."),
+               MENU_OPCION("Volver", "Volver al menu anterior.")
        };
-
-       items = (ITEM **)calloc(5, sizeof(ITEM *));
-
-       items[0] = new_item(opciones[0], "Crear una nueva factura.");
-       set_item_userptr(items[0], fact_agregar);
-       items[1] = new_item(opciones[1], "Eliminar una factura existente.");
-       set_item_userptr(items[1], fact_eliminar);
-       items[2] = new_item(opciones[2], "Modificar una factura existente.");
-       set_item_userptr(items[2], fact_modificar); 
-       items[3] = new_item(opciones[3], "Volver al menu anterior.");
-       items[4] = NULL;
-
-       menu = new_menu((ITEM **)items);
-       menu_win = newwin(8, COLS-2, 3, 1);
-       keypad(menu_win, TRUE);
-       set_menu_mark(menu, " > ");
-       set_menu_win(menu, menu_win);
-       set_menu_sub(menu, derwin(menu_win, 5, COLS-4, 3, 1));
-
-       box(menu_win, 0, 0);
-       mvwaddch(menu_win, 2, 0, ACS_LTEE);
-       mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
-       mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
-       wattron(menu_win, COLOR_PAIR(COLOR_RED));
-       mvwaddstr(menu_win, 1, 1, "Menu Facturas");
-       wattroff(menu_win, COLOR_PAIR(COLOR_RED));
-       post_menu(menu);
-       wrefresh(menu_win);
-
-       curs_set(0);
-       salir = 0;
-       while((!salir) && (c = getch()) != KEY_F(3)) {
-               switch(c) {
-                       case KEY_DOWN:
-                               menu_driver(menu, REQ_DOWN_ITEM);
-                               break;
-                       case KEY_UP:
-                               menu_driver(menu, REQ_UP_ITEM);
+       int opt;
+               
+       while ((opt = menu_ejecutar(mi_menu, 4, "Menu Articulos")) != 3) {
+               switch (opt) {
+                       case 0:
+                               fact_agregar(NULL);
                        break;
-                       case 13:
-                       case 10: {
-                               ITEM *cur;
-                               void (*p)(char *);
-
-                               cur = current_item(menu);
-                               if (strcmp(item_name(cur), opciones[3]) == 0) {
-                                       salir = 1;
-                               } else {
-                                       p = item_userptr(cur);
-                                       unpost_menu(menu);
-                                       refresh();
-                                       p(NULL); /* Paso NULL para que ejecute la accion por defecto */
-                                       post_menu(menu);
-                                       box(menu_win,0,0);
-                                       mvwaddch(menu_win, 2, 0, ACS_LTEE);
-                                       mvwhline(menu_win, 2, 1, ACS_HLINE, 67);
-                                       mvwaddch(menu_win, 2, 67, ACS_RTEE);
-                                       wrefresh(menu_win);
-                               }
-                               pos_menu_cursor(menu);
-                       }
+                       case 1:
+                               fact_eliminar(NULL);
+                       break;
+                       case 2:
+                               fact_modificar(NULL);
                }
-               wrefresh(menu_win);
-       }       
-       curs_set(1);
-       
-       unpost_menu(menu);
-       delwin(menu_win);
-       free_item(items[0]);
-       free_item(items[1]);
-       free_item(items[2]);
-       free_item(items[3]);
-       free_menu(menu);
-       free(items);
+       }
 }
 
 void menu_articulos()
 {
-       WINDOW *menu_win;
-       MENU *menu;
-       ITEM **items;
-       int c, salir;
-       char *opciones[] = {
-                                       "Alta",
-                                       "Baja",
-                                       "Modificacion",
-                                       "Volver"
+       MENU(mi_menu) {
+               MENU_OPCION("Alta", "Crear un nuevo articulo."),
+               MENU_OPCION("Baja", "Elimina un articulo existente."),
+               MENU_OPCION("Modificacion", "Modifica un articulo existente."),
+               MENU_OPCION("Volver", "Volver al menu anterior.")
        };
-
-       items = (ITEM **)calloc(5, sizeof(ITEM *));
-
-       items[0] = new_item(opciones[0], "Crear un nuevo articulo.");
-       set_item_userptr(items[0], art_agregar);
-       items[1] = new_item(opciones[1], "Eliminar un articulo existente.");
-       set_item_userptr(items[1], art_eliminar);
-       items[2] = new_item(opciones[2], "Modificar un articulo existente.");
-       set_item_userptr(items[2], art_modificar);
-       items[3] = new_item(opciones[3], "Volver al menu anterior.");
-       items[4] = NULL;
-
-       menu = new_menu((ITEM **)items);
-       menu_win = newwin(8, COLS-2, 3, 1);
-       keypad(menu_win, TRUE);
-       set_menu_mark(menu, " > ");
-       set_menu_win(menu, menu_win);
-       set_menu_sub(menu, derwin(menu_win, 5, COLS-4, 3, 1));
-
-       box(menu_win, 0, 0);
-       mvwaddch(menu_win, 2, 0, ACS_LTEE);
-       mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
-       mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
-       wattron(menu_win, COLOR_PAIR(COLOR_RED));
-       mvwaddstr(menu_win, 1, 1, "Menu Articulos");
-       wattroff(menu_win, COLOR_PAIR(COLOR_RED));
-       post_menu(menu);
-       wrefresh(menu_win);
-
-       curs_set(0);
-       salir = 0;
-       while((!salir) && (c = getch()) != KEY_F(3)) {
-               switch(c) {
-                       case KEY_DOWN:
-                               menu_driver(menu, REQ_DOWN_ITEM);
-                               break;
-                       case KEY_UP:
-                               menu_driver(menu, REQ_UP_ITEM);
+       int opt;
+               
+       while ((opt = menu_ejecutar(mi_menu, 4, "Menu Articulos")) != 3) {
+               switch (opt) {
+                       case 0:
+                               art_agregar(NULL);
                        break;
-                       case 13:
-                       case 10: {
-                               ITEM *cur;
-                               void (*p)(char *);
-
-                               cur = current_item(menu);
-                               if (strcmp(item_name(cur), opciones[3]) == 0) {
-                                       salir = 1;
-                               } else {
-                                       p = item_userptr(cur);
-                                       unpost_menu(menu);
-                                       refresh();
-                                       p(NULL); /* Paso NULL para que ejecute la accion por defecto */
-                                       post_menu(menu);
-                                       box(menu_win,0,0);
-                                       mvwaddch(menu_win, 2, 0, ACS_LTEE);
-                                       mvwhline(menu_win, 2, 1, ACS_HLINE, 67);
-                                       mvwaddch(menu_win, 2, 67, ACS_RTEE);
-                                       wrefresh(menu_win);
-                               }
-                               pos_menu_cursor(menu);
-                       }
+                       case 1:
+                               art_eliminar(NULL);
+                       break;
+                       case 2:
+                               art_modificar(NULL);
                }
-               wrefresh(menu_win);
-       }       
-       curs_set(1);
-       
-       unpost_menu(menu);
-       delwin(menu_win);
-       free_item(items[0]);
-       free_item(items[1]);
-       free_item(items[2]);
-       free_item(items[3]);
-       free_menu(menu);
-       free(items);
+       }
+
 }
 
 void menu_estadisticas()
 {
-       WINDOW *menu_win;
-       MENU *menu;
-       ITEM **items;
-       int c, salir;
-       char *opciones[] = {
-                                       "Articulos",
-                                       "Facturas",
-                                       "Notas",
-                                       "Volver"
+       MENU(mi_menu) {
+               MENU_OPCION("Articulos", "Ver datos del archivo de Articulos."),
+               MENU_OPCION("Facturas", "Ver datos del archivo de Facturas."),
+               MENU_OPCION("Notas", "Ver datos del archivo de Notas."),
+               MENU_OPCION("Volver", "Ir al menu anterior.")
        };
+       int opt;
 
-       items = (ITEM **)calloc(5, sizeof(ITEM *));
-
-       items[0] = new_item(opciones[0], "Ver datos del archivo de Articulos.");
-       items[1] = new_item(opciones[1], "Ver datos del archivo de Facturas.");
-       items[2] = new_item(opciones[2], "Ver datos del archivo de Notas.");
-       items[3] = new_item(opciones[3], "Volver al menu anterior.");
-       items[4] = NULL;
-
-       menu = new_menu((ITEM **)items);
-       menu_win = newwin(8, COLS-2, 3, 1);
-       keypad(menu_win, TRUE);
-       set_menu_mark(menu, " > ");
-       set_menu_win(menu, menu_win);
-       set_menu_sub(menu, derwin(menu_win, 5, COLS-4, 3, 1));
-
-       box(menu_win, 0, 0);
-       mvwaddch(menu_win, 2, 0, ACS_LTEE);
-       mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
-       mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
-       wattron(menu_win, COLOR_PAIR(COLOR_RED));
-       mvwaddstr(menu_win, 1, 1, "Menu Estadisticas");
-       wattroff(menu_win, COLOR_PAIR(COLOR_RED));
-       post_menu(menu);
-       wrefresh(menu_win);
-
-       curs_set(0);
-       salir = 0;
-       while((!salir) && (c = getch()) != KEY_F(3)) {
-               switch(c) {
-                       case KEY_DOWN:
-                               menu_driver(menu, REQ_DOWN_ITEM);
-                               break;
-                       case KEY_UP:
-                               menu_driver(menu, REQ_UP_ITEM);
+       while ((opt = menu_ejecutar(mi_menu, 4, "Menu Estadisticas")) != 3) {
+               switch (opt) {
+                       case 0:
+                               ver_estadisticas( art_get_lst()->fp );
                        break;
-                       case 13:
-                       case 10:
-                       {
-                               ITEM *cur;
-
-                               cur = current_item(menu);
-                               if (strcmp(item_name(cur), opciones[3]) == 0) {
-                                       salir = 1;
-                               } else {
-                                       if (strcmp(item_name(cur), opciones[0]) == 0) {
-                                               unpost_menu(menu);
-                                               ver_estadisticas( art_get_lst()->fp );
-                                               box(menu_win, 0, 0);
-                                               post_menu(menu);
-                                       }
-                                       if (strcmp(item_name(cur), opciones[1]) == 0) {
-                                               unpost_menu(menu);
-                                               ver_estadisticas( fact_get_lst()->fp );
-                                               box(menu_win, 0, 0);
-                                               post_menu(menu);
-                                       }
-                                       if (strcmp(item_name(cur), opciones[2]) == 0) {
-                                               unpost_menu(menu);
-                                               ver_estadisticas( fact_get_lst()->fp_texto );
-                                               box(menu_win, 0, 0);
-                                               post_menu(menu);
-                                       }
-                               }
-                               pos_menu_cursor(menu);
-                       }
+                       case 1:
+                               ver_estadisticas( fact_get_lst()->fp );
+                       break;
+                       case 2:
+                               ver_estadisticas( fact_get_lst()->fp_texto );
                }
-               wrefresh(menu_win);
-       }       
-       curs_set(1);
-       
-       unpost_menu(menu);
-       delwin(menu_win);
-       free_item(items[0]);
-       free_item(items[1]);
-       free_item(items[2]);
-       free_item(items[3]);
-       free_menu(menu);
-       free(items);
+       }
 }
 
 int main_menu()
 {
-       WINDOW *menu_win;
-       MENU *menu;
-       ITEM **items;
-       int c, salir, opcion;
-       char *opciones[] = {
-                                       "Articulos",
-                                       "Facturas",
-                                       "Ver Registros",
-                                       "Ver Facturas",
-                                       "Ver Notas",
-                                       "Estadisticas",
-                                       "Mantenimiento",
-                                       "Salir"
+       MENU(mi_menu) {
+               MENU_OPCION("Articulos","Alta,baja,consulta y modificacion de articulos."),
+               MENU_OPCION("Facturas","Alta,baja,consulta y modificacion de facturas."),
+               MENU_OPCION("Ver Registros","Ver registros/bloques de archivo Articulos."),
+               MENU_OPCION("Ver Facturas","Ver registros/bloques de archivo Facturas."),
+               MENU_OPCION("Ver Notas","Ver registros/bloques de archivo Notas."),
+               MENU_OPCION("Estadisticas","Ver estadisticas de ocupacion de archivos."),
+               MENU_OPCION("Mantenimiento","Tareas de mantenimiento de los archivos."),
+               MENU_OPCION("Salir", "Salir del sistema.")
        };
 
-       items = (ITEM **)calloc(9, sizeof(ITEM *));
-
-       items[0] = new_item(opciones[0], "Alta,baja,consulta y modificacion de articulos.");
-       items[1] = new_item(opciones[1], "Alta,baja,consulta y modificacion de facturas.");
-       items[2] = new_item(opciones[2], "Ver registros/bloques de archivo Articulos.");
-       items[3] = new_item(opciones[3], "Ver registros/bloques de archivo Facturas.");
-       items[4] = new_item(opciones[4], "Ver registros/bloques de archivo Notas.");
-       items[5] = new_item(opciones[5], "Ver estadisticas de ocupacion de archivos.");
-       items[6] = new_item(opciones[6], "Tareas de mantenimiento de los archivos.");
-       items[7] = new_item(opciones[7], "Salir del sistema.");
-       items[8] = NULL;
-
-       menu = new_menu((ITEM **)items);
-       menu_win = newwin(14, COLS-2, 3, 1);
-       keypad(menu_win, TRUE);
-       set_menu_mark(menu, " > ");
-       set_menu_win(menu, menu_win);
-       set_menu_sub(menu, derwin(menu_win, 10, COLS-4, 3, 1));
-
-       box(menu_win, 0, 0);
-       mvwaddch(menu_win, 2, 0, ACS_LTEE);
-       mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
-       mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
-       wattron(menu_win, COLOR_PAIR(COLOR_RED));
-       mvwaddstr(menu_win, 1, 1, "Menu Principal");
-       wattroff(menu_win, COLOR_PAIR(COLOR_RED));
-       post_menu(menu);
-       wrefresh(menu_win);
-
-       curs_set(0);
-       opcion = -1;
-       salir = 0;
-       while((!salir) && (c = getch())) {
-               switch(c) {
-                       case KEY_DOWN:
-                               menu_driver(menu, REQ_DOWN_ITEM);
-                               break;
-                       case KEY_UP:
-                               menu_driver(menu, REQ_UP_ITEM);
-                       break;
-                       case 13:
-                       case 10: 
-                       {
-                               ITEM *cur;
-                               int i;
-
-                               cur = current_item(menu);
-                               for(i=0; i<7; ++i) {
-                                       if (strcmp(item_name(cur), opciones[i]) == 0)
-                                               opcion = i;
-                               }
-                               pos_menu_cursor(menu);
-                               salir = 1;
-                       }
-               }
-               wrefresh(menu_win);
-       }       
-       curs_set(1);
-       
-       unpost_menu(menu);
-       werase(menu_win);
-       wrefresh(menu_win);
-       delwin(menu_win);
-       free_item(items[0]);
-       free_item(items[1]);
-       free_item(items[2]);
-       free_item(items[3]);
-       free_item(items[4]);
-       free_item(items[5]);
-       free_item(items[6]);
-       free_menu(menu);
-       free(items);
-
-       return opcion;
+       return menu_ejecutar(mi_menu, 8, "Menu Principal");
 }
 
 
@@ -588,116 +317,48 @@ void msg_box_free(WINDOW *padre, WINDOW *win)
 
 void menu_mantenimiento()
 {
-       WINDOW *menu_win, *dlg;
-       MENU *menu;
-       ITEM **items;
-       int c, salir, nuevo_tipo, nuevo_tam_bloque, nuevo_tam_registro;
-       char *opciones[] = {
-                                       "Compactar Articulos",
-                                       "Compactar Facturas",
-                                       "Compactar Notas",
-                                       "Cambiar tipo Archivo Articulos",
-                                       "Cambiar tipo Archivo Facturas",
-                                       "Cambiar tipo Archivo Notas",
-                                       "Volver"
+       MENU(mi_menu) {
+               MENU_OPCION("Compactar Articulos","Elimina espacio no utilizado."),
+               MENU_OPCION("Compactar Facturas","Elimina espacio no utilizado."),
+               MENU_OPCION("Compactar Notas","Elimina espacio no utilizado."),
+               MENU_OPCION("Cambiar tipo Archivo Articulos","Permite cambiar el tipo del archivo."),
+               MENU_OPCION("Cambiar tipo Archivo Facturas","Permite cambiar el tipo del archivo."),
+               MENU_OPCION("Cambiar tipo Archivo Notas","Permite cambiar el tipo del archivo."),
+               MENU_OPCION("Volver", "Volver al menu anterior.")
        };
 
-       items = (ITEM **)calloc(8, sizeof(ITEM *));
-
-       items[0] = new_item(opciones[0], "Elimina espacio no utilizado.");
-       items[1] = new_item(opciones[1], "Elimina espacio no utilizado.");
-       items[2] = new_item(opciones[2], "Elimina espacio no utilizado.");
-       items[3] = new_item(opciones[3], "Permite cambiar el tipo del archivo.");
-       items[4] = new_item(opciones[4], "Permite cambiar el tipo del archivo.");
-       items[5] = new_item(opciones[5], "Permite cambiar el tipo del archivo.");
-       items[6] = new_item(opciones[6], "Volver al menu anterior.");
-       items[7] = NULL;
-
-       menu = new_menu((ITEM **)items);
-       menu_win = newwin(12, COLS-2, 3, 1);
-       keypad(menu_win, TRUE);
-       set_menu_mark(menu, " > ");
-       set_menu_win(menu, menu_win);
-       set_menu_sub(menu, derwin(menu_win, 8, COLS-4, 3, 1));
-
-       box(menu_win, 0, 0);
-       mvwaddch(menu_win, 2, 0, ACS_LTEE);
-       mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
-       mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
-       wattron(menu_win, COLOR_PAIR(COLOR_RED));
-       mvwaddstr(menu_win, 1, 1, "Menu Mantenimiento");
-       wattroff(menu_win, COLOR_PAIR(COLOR_RED));
-       post_menu(menu);
-       wrefresh(menu_win);
+       int opt;
+       int nuevo_tam_registro, nuevo_tam_bloque;
+       int nuevo_tipo;
+       WINDOW *dlg;
 
-       curs_set(0);
-       salir = 0;
-       while((!salir) && (c = getch()) != KEY_F(3)) {
-               switch(c) {
-                       case KEY_DOWN:
-                               menu_driver(menu, REQ_DOWN_ITEM);
-                               break;
-                       case KEY_UP:
-                               menu_driver(menu, REQ_UP_ITEM);
+       while ((opt = menu_ejecutar(mi_menu, 7, "Menu Mantenimiento")) != 6) {
+               switch (opt) {
+                       case 0:
+                               art_get_lst()->fp->compactar(art_get_lst()->fp);
                        break;
-                       case 13:
-                       case 10: 
-                       {
-                               ITEM *cur;
-
-                               cur = current_item(menu);
-                               if (strcmp(item_name(cur), opciones[6]) == 0) {
-                                       salir = 1;
-                               } else {
-                                       if (strcmp(item_name(cur), opciones[0]) == 0) {
-                                               art_get_lst()->fp->compactar(art_get_lst()->fp);
-                                       }
-                                       if (strcmp(item_name(cur), opciones[1]) == 0) {
-                                               fact_get_lst()->fp->compactar(fact_get_lst()->fp);
-                                       }
-                                       if (strcmp(item_name(cur), opciones[2]) == 0) {
-                                               fact_get_lst()->fp_texto->compactar(fact_get_lst()->fp_texto);
-                                       }
-                                       if (strcmp(item_name(cur), opciones[3]) == 0) {
-                                               unpost_menu(menu);
-                                               nuevo_tam_registro = -1; /* No permito cambiar el tamaño de registro */
-                                               preguntar_nuevo_tipo(&nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
-                                               dlg = msg_box(stdscr, COLS, LINES, "Cambiando el formato de archivo .... Aguarde");
-                                               art_reformatear(nuevo_tipo, nuevo_tam_bloque, nuevo_tam_registro);
-                                               msg_box_free(stdscr, dlg);
-                                               box(menu_win, 0, 0);
-                                               post_menu(menu);
-                                       }
-                                       if (strcmp(item_name(cur), opciones[4]) == 0) {
-                                               unpost_menu(menu);
-                                               nuevo_tam_registro = 0;
-                                               preguntar_nuevo_tipo(&nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
-                                               box(menu_win, 0, 0);
-                                               post_menu(menu);
-                                       }
-                                       if (strcmp(item_name(cur), opciones[5]) == 0) {
-                                               unpost_menu(menu);
-                                               nuevo_tam_registro = -2;
-                                               preguntar_nuevo_tipo(&nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
-                                               box(menu_win, 0, 0);
-                                               post_menu(menu);
-                                       }
-                               }
-                       }
+                       case 1:
+                               fact_get_lst()->fp->compactar(fact_get_lst()->fp);
+                       break;
+                       case 2:
+                               fact_get_lst()->fp_texto->compactar(fact_get_lst()->fp_texto);
+                       break;
+                       case 3:
+                               nuevo_tam_registro = -1; /* No permito cambiar el tamaño de registro */
+                               preguntar_nuevo_tipo(&nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
+                               dlg = msg_box(stdscr, COLS, LINES, "Cambiando el formato de archivo .... Aguarde");
+                               art_reformatear(nuevo_tipo, nuevo_tam_bloque, nuevo_tam_registro);
+                               msg_box_free(stdscr, dlg);
+                       break;
+                       case 4:
+                               nuevo_tam_registro = 0;
+                               preguntar_nuevo_tipo(&nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
+                       break;
+                       case 5:
+                               nuevo_tam_registro = -2;
+                               preguntar_nuevo_tipo(&nuevo_tipo, &nuevo_tam_bloque, &nuevo_tam_registro);
                }
-               wrefresh(menu_win);
-       }       
-       curs_set(1);
-       
-       unpost_menu(menu);
-       delwin(menu_win);
-       free_item(items[0]);
-       free_item(items[1]);
-       free_item(items[2]);
-       free_item(items[3]);
-       free_menu(menu);
-
-       free(items);
+       }
 }
 
 void preguntar_nuevo_tipo(int *tipo, int *tam_bloque, int *tam_reg)
diff --git a/emufs_gui/menu.c b/emufs_gui/menu.c
new file mode 100644 (file)
index 0000000..047e630
--- /dev/null
@@ -0,0 +1,71 @@
+
+#include "menu.h"
+
+int menu_ejecutar(t_Menu opciones, int cant, char *title)
+{
+       WINDOW *menu_win;
+       MENU *menu;
+       ITEM **items;
+       int c, salir;
+       
+       items = (ITEM **)calloc(cant+1, sizeof(ITEM *));
+
+       for(c=0; c<cant; c++) {
+               items[c] = new_item(opciones[c].opt, opciones[c].desc);
+       }
+       items[cant] = NULL;
+
+       menu = new_menu((ITEM **)items);
+       menu_win = newwin(cant+4, COLS-2, 3, 1);
+       keypad(menu_win, TRUE);
+       set_menu_mark(menu, " > ");
+       set_menu_win(menu, menu_win);
+       set_menu_sub(menu, derwin(menu_win, cant, COLS-4, 3, 1));
+
+       box(menu_win, 0, 0);
+       mvwaddch(menu_win, 2, 0, ACS_LTEE);
+       mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
+       mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
+       wattron(menu_win, COLOR_PAIR(COLOR_RED));
+       mvwaddstr(menu_win, 1, 1, title);
+       wattroff(menu_win, COLOR_PAIR(COLOR_RED));
+       post_menu(menu);
+       wrefresh(menu_win);
+
+       curs_set(0);
+       salir = 0;
+       while((!salir)) {
+               c = getch();
+               switch(c) {
+                       case KEY_DOWN:
+                               menu_driver(menu, REQ_DOWN_ITEM);
+                               break;
+                       case KEY_UP:
+                               menu_driver(menu, REQ_UP_ITEM);
+                       break;
+                       case 13:
+                       case 10: {
+                               ITEM *cur;
+
+                               cur = current_item(menu);
+                               for(c=0; c<cant; c++) {
+                                       if (strcmp(opciones[c].opt, item_name(cur)) == 0) {
+                                               salir = c+1;
+                                       }
+                               }
+                       }
+               }
+               wrefresh(menu_win);
+       }       
+       curs_set(1);
+       
+       unpost_menu(menu);
+       delwin(menu_win);
+       for(c=0; c<cant; c++)
+               free_item(items[c]);
+       free_menu(menu);
+       free(items);
+       return salir-1;
+}
+
+
diff --git a/emufs_gui/menu.h b/emufs_gui/menu.h
new file mode 100644 (file)
index 0000000..7c364d2
--- /dev/null
@@ -0,0 +1,24 @@
+
+
+#ifndef _MENU_H_
+#define _MENU_H_
+
+#include <stdlib.h>
+#include <curses.h>
+#include <menu.h>
+#include <string.h>
+
+typedef struct _menu_o_t_ {
+       char *opt;
+       char *desc;
+} t_Menu;
+
+#define MENU(a) \
+  t_Menu a[] = 
+
+#define MENU_OPCION(a,b) {a, b}
+
+int menu_ejecutar(t_Menu menu[], int cant, char *title);
+
+#endif
+