]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs_gui/gui.c
* un lindo cuadro de dialogo para hacer esperar a los usuarios.
[z.facultad/75.06/emufs.git] / emufs_gui / gui.c
1
2 #include <stdlib.h>
3 #include <curses.h>
4 #include <menu.h>
5 #include <signal.h>
6 #include <string.h>
7 #include <stdarg.h>
8
9 #include "form.h"
10 #include "articulos.h"
11 #include "facturas.h"
12 #include "emufs.h"
13
14 #define CTRLD 4
15
16 static void finish(int sig);
17
18 int main_menu();
19 void menu_articulos();
20 /* cuadro de msg. w y h son de la ventana padre */
21 WINDOW *msg_box(WINDOW *win, int w, int h, const char *format, ...);
22 void msg_box_free(WINDOW *padre, WINDOW *win);
23
24 int main(int argc, char *argv[])
25 {
26         int c, fin=0;
27         WINDOW *dialog;
28
29 /*      art_cargar(argv[1]);
30
31         art_liberar(NULL);
32         return 1;
33 */
34         /* Inicio Curses */
35         signal(SIGINT, finish);
36         initscr();
37         keypad(stdscr, TRUE);
38         nonl();
39         cbreak();
40         noecho();
41         /* Si se soporta color, los inicializo */
42         if (has_colors()) {
43                 start_color();
44                 /* Simple color assignment, often all we need. */
45                 init_pair(COLOR_BLACK, COLOR_BLACK, COLOR_BLACK); /* COLOR_PAIR(1) */
46                 init_pair(COLOR_GREEN, COLOR_GREEN, COLOR_BLACK);
47                 init_pair(COLOR_RED, COLOR_RED, COLOR_BLACK);
48                 init_pair(COLOR_CYAN, COLOR_CYAN, COLOR_BLACK);
49                 init_pair(COLOR_WHITE, COLOR_WHITE, COLOR_BLACK);
50                 init_pair(COLOR_MAGENTA, COLOR_MAGENTA, COLOR_BLACK);
51                 init_pair(COLOR_BLUE, COLOR_BLUE, COLOR_BLACK);
52                 init_pair(COLOR_YELLOW, COLOR_YELLOW, COLOR_BLACK);
53         }
54         
55         /* Verifico un tamaño minimo de consola */
56         if ((LINES < 25) || (COLS < 80)) {
57                 endwin();
58                 printf("El tamaño de la consola debe ser de por lo menos 80x25!\n");
59                 return 1;
60         }
61
62         /* Ventana, caracter para linea vertical, caracter para linea horizontal*/
63         box(stdscr, ACS_VLINE, ACS_HLINE);
64         /* Ventana, Y, X, Texto */
65         mvwaddstr(stdscr, 1, 1, "EMUFS");       
66         attron(COLOR_PAIR(2));
67         mvwaddstr(stdscr, LINES-2, 1, "EMUFS (c) The EMUFS Team - Bajo Licencia GNU/GPL");      
68         attroff(COLOR_PAIR(2));
69         wrefresh(stdscr);
70
71         dialog = msg_box(stdscr, COLS, LINES, "Generando archivos ...");
72         if (argc == 2) {
73                 art_cargar(argv[1]);
74                 fact_cargar(argv[1]);
75         } else
76                 art_cargar(NULL);
77
78         msg_box_free(stdscr, dialog);
79
80         /* CICLO PRINCIPAL DE LA APLICACION */
81         while ((c = main_menu()) != -1) {
82                 switch (c) {
83                         case 0:
84                                 menu_articulos();
85                         break;
86                 //      case 1:
87                 //      case 2:
88                 //      case 3:
89                         case 6:
90                                 fin = 1;
91                         break;
92                 }
93                 if (fin == 1) break;
94         }
95
96         endwin();
97
98         art_liberar(NULL);
99         fact_liberar(NULL);
100
101         return 0;
102 }
103
104 void menu_articulos()
105 {
106         WINDOW *menu_win;
107         MENU *menu;
108         ITEM **items;
109         int c, salir;
110         char *opciones[] = {
111                                         "Alta",
112                                         "Baja",
113                                         "Modificacion",
114                                         "Volver"
115         };
116
117         items = (ITEM **)calloc(5, sizeof(ITEM *));
118
119         items[0] = new_item(opciones[0], "Crear un nuevo articulo.");
120         set_item_userptr(items[0], art_agregar);
121         items[1] = new_item(opciones[1], "Eliminar un articulo existente.");
122         set_item_userptr(items[1], art_eliminar);
123         items[2] = new_item(opciones[2], "Modificar un articulo existente.");
124         set_item_userptr(items[2], art_modificar);
125         items[3] = new_item(opciones[3], "Volver al menu anterior.");
126         items[4] = NULL;
127
128         menu = new_menu((ITEM **)items);
129         menu_win = newwin(8, COLS-2, 3, 1);
130         keypad(menu_win, TRUE);
131         set_menu_mark(menu, " > ");
132         set_menu_win(menu, menu_win);
133         set_menu_sub(menu, derwin(menu_win, 5, COLS-4, 3, 1));
134
135         box(menu_win, 0, 0);
136         mvwaddch(menu_win, 2, 0, ACS_LTEE);
137         mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
138         mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
139         wattron(menu_win, COLOR_PAIR(COLOR_RED));
140         mvwaddstr(menu_win, 1, 1, "Menu Articulos");
141         wattroff(menu_win, COLOR_PAIR(COLOR_RED));
142         post_menu(menu);
143         wrefresh(menu_win);
144
145         curs_set(0);
146         salir = 0;
147         while((!salir) && (c = getch()) != KEY_F(3)) {
148                 switch(c) {
149                         case KEY_DOWN:
150                                 menu_driver(menu, REQ_DOWN_ITEM);
151                                 break;
152                         case KEY_UP:
153                                 menu_driver(menu, REQ_UP_ITEM);
154                         break;
155                         case 13:
156                         case 10: {
157                                 ITEM *cur;
158                                 void (*p)(char *);
159
160                                 cur = current_item(menu);
161                                 if (strcmp(item_name(cur), opciones[3]) == 0) {
162                                         salir = 1;
163                                 } else {
164                                         p = item_userptr(cur);
165                                         unpost_menu(menu);
166                                         refresh();
167                                         p((char *)item_name(cur));
168                                         post_menu(menu);
169                                         box(menu_win,0,0);
170                                         mvwaddch(menu_win, 2, 0, ACS_LTEE);
171                                         mvwhline(menu_win, 2, 1, ACS_HLINE, 67);
172                                         mvwaddch(menu_win, 2, 67, ACS_RTEE);
173                                         wrefresh(menu_win);
174                                 }
175                                 pos_menu_cursor(menu);
176                         }
177                 }
178                 wrefresh(menu_win);
179         }       
180         curs_set(1);
181         
182         unpost_menu(menu);
183         delwin(menu_win);
184         free_item(items[0]);
185         free_item(items[1]);
186         free_item(items[2]);
187         free_item(items[3]);
188         free_menu(menu);
189 }
190
191 int main_menu()
192 {
193         WINDOW *menu_win;
194         MENU *menu;
195         ITEM **items;
196         int c, salir, opcion;
197         char *opciones[] = {
198                                         "Articulos",
199                                         "Facturas",
200                                         "Ver Registros",
201                                         "Ver Bloques",
202                                         "Estadisticas",
203                                         "Mantenimiento",
204                                         "Salir"
205         };
206
207         items = (ITEM **)calloc(8, sizeof(ITEM *));
208
209         items[0] = new_item(opciones[0], "Alta,baja,consulta y modificacion de articulos.");
210         items[1] = new_item(opciones[1], "Alta,baja,consulta y modificacion de facturas.");
211         items[2] = new_item(opciones[2], "Ver registros de un archivo.");
212         items[3] = new_item(opciones[3], "Ver bloques de un archivo.");
213         items[4] = new_item(opciones[4], "Ver estadisticas de ocupacion de archivos.");
214         items[5] = new_item(opciones[5], "Tareas de mantenimiento de los archivos.");
215         items[6] = new_item(opciones[6], "Salir del sistema.");
216         items[7] = NULL;
217
218         menu = new_menu((ITEM **)items);
219         menu_win = newwin(14, COLS-2, 3, 1);
220         keypad(menu_win, TRUE);
221         set_menu_mark(menu, " > ");
222         set_menu_win(menu, menu_win);
223         set_menu_sub(menu, derwin(menu_win, 10, COLS-4, 3, 1));
224
225         box(menu_win, 0, 0);
226         mvwaddch(menu_win, 2, 0, ACS_LTEE);
227         mvwhline(menu_win, 2, 1, ACS_HLINE, COLS-3);
228         mvwaddch(menu_win, 2, COLS-3, ACS_RTEE);
229         wattron(menu_win, COLOR_PAIR(COLOR_RED));
230         mvwaddstr(menu_win, 1, 1, "Menu Principal");
231         wattroff(menu_win, COLOR_PAIR(COLOR_RED));
232         post_menu(menu);
233         wrefresh(menu_win);
234
235         curs_set(0);
236         opcion = -1;
237         salir = 0;
238         while((!salir) && (c = getch())) {
239                 switch(c) {
240                         case KEY_DOWN:
241                                 menu_driver(menu, REQ_DOWN_ITEM);
242                                 break;
243                         case KEY_UP:
244                                 menu_driver(menu, REQ_UP_ITEM);
245                         break;
246                         case 13:
247                         case 10: 
248                         {
249                                 ITEM *cur;
250                                 int i;
251
252                                 cur = current_item(menu);
253                                 for(i=0; i<7; ++i) {
254                                         if (strcmp(item_name(cur), opciones[i]) == 0)
255                                                 opcion = i;
256                                 }
257                                 pos_menu_cursor(menu);
258                                 salir = 1;
259                         }
260                 }
261                 wrefresh(menu_win);
262         }       
263         curs_set(1);
264         
265         unpost_menu(menu);
266         werase(menu_win);
267         wrefresh(menu_win);
268         delwin(menu_win);
269         free_item(items[0]);
270         free_item(items[1]);
271         free_item(items[2]);
272         free_item(items[3]);
273         free_item(items[4]);
274         free_item(items[5]);
275         free_item(items[6]);
276         free_menu(menu);
277
278         return opcion;
279 }
280
281
282 static void finish(int sig)
283 {
284         endwin();
285
286         /* do your non-curses wrapup here */
287         exit(0);
288 }
289
290 WINDOW *msg_box(WINDOW *win, int w, int h, const char *format, ...)
291 {
292         va_list ap;
293         char txt[255];
294         int mw, mh;
295         WINDOW *dialog;
296         va_start(ap, format);
297         vsprintf(txt, format, ap);
298         va_end(ap);
299
300         mw = strlen(txt)+2;
301         mh = 3;
302         dialog = derwin(win, mh, mw, h/2-mh/2, w/2-mw/2);
303         box(dialog, 0 ,0);
304         mvwaddstr(dialog, 1, 1, txt);
305         wrefresh(dialog);
306         curs_set(0);
307         return dialog;
308 }
309
310 void msg_box_free(WINDOW *padre, WINDOW *win)
311 {
312         werase(win);
313         wrefresh(win);
314         delwin(win);
315         curs_set(1);
316         wrefresh(padre);
317 }
318