home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Resource Library: Graphics
/
graphics-16000.iso
/
msdos
/
animutil
/
fastgfx
/
fgdemo
/
menu.c
< prev
next >
Wrap
Text File
|
1991-10-02
|
15KB
|
545 lines
/**********************************************************************\
* *
* menu.c -- menu management functions *
* *
\**********************************************************************/
#include "defs.h"
CMD main_menu[] =
{
submenu1, "File", 6, 71, 1, 5,
submenu2, "Video", 72, 150, 2, 0,
submenu3, "Fundamentals", 151, 285, 3, 1,
submenu4, "Display", 286, 377, 4, 2,
submenu5, "Miscellaneous", 378, 513, 5, 3,
submenu6, "Utilities", 514, 605, 0, 4
};
CMD menu1[] =
{
about_fg, "About Fastgraph ", 7, 164, 1, 8,
about_demo, "About This Demo ", 7, 164, 2, 0,
about_tech, "Technical Support ", 7, 164, 3, 1,
about_docs, "Documentation ", 7, 164, 4, 2,
about_site, "Site Licenses ", 7, 164, 5, 3,
about_order, "Order By Phone ", 7, 164, 6, 4,
print_form, "Print Order Form ", 7, 164, 7, 5,
shell, "Shell to DOS ", 7, 164, 8, 6,
exit_program, "Exit ", 7, 164, 0, 7
};
CMD menu2[] =
{
about_modes, "Video Modes ", 73, 210, 1, 4,
auto_detect, "Autodetect ", 73, 210, 2, 0,
physical_pages, "Physical Pages", 73, 210, 3, 1,
virtual_pages, "Virtual Pages ", 73, 210, 4, 2,
coordinates, "Coordinates ", 73, 210, 0, 3
};
CMD menu3[] =
{
do_points, "Points ", 152, 284, 1, 7,
do_lines, "Lines ", 152, 284, 2, 0,
do_rects, "Rectangles ", 152, 284, 3, 1,
do_circles, "Circles ", 152, 284, 4, 2,
do_ellipses, "Ellipses ", 152, 284, 5, 3,
do_text, "Text ", 152, 284, 6, 4,
do_paint, "Region Fill", 152, 284, 7, 5,
do_clip, "Clipping ", 152, 284, 0, 6
};
CMD menu4[] =
{
do_bitmaps, "Bitmaps ", 287, 434, 1, 3,
do_transfer, "Transfer ", 287, 434, 2, 0,
do_scroll, "Scroll ", 287, 434, 3, 1,
view_graphic, "Display a File", 287, 434, 0, 2
};
CMD menu5[] =
{
do_mouse, "Mouse ", 379, 512, 1, 5,
do_joystick, "Joystick ", 379, 512, 2, 0,
do_sound, "Sound ", 379, 512, 3, 1,
do_music, "Music ", 379, 512, 4, 2,
do_editor, "Editor ", 379, 512, 5, 3,
do_histogram, "Histogram", 379, 512, 0, 4
};
CMD menu6[] =
{
about_snapshot, "Snapshot ", 515, 604, 1, 2,
about_clip, "Clip ", 515, 604, 2, 0,
about_convert, "Convert ", 515, 604, 0, 1
};
int mouse_limits[] = {0,72,151,286,378,514,640};
int redraw = TRUE;
int selection = 0;
/**********************************************************************\
* *
* highlight option -- highlight an option on the main menu *
* *
\**********************************************************************/
void highlight_option(n)
{
int y;
y = menu_top + ptsize + 1;
fg_setcolor(0);
fg_rect(main_menu[n].x1,main_menu[n].x2,menu_top,menu_bottom-1);
fg_setcolor(15);
center_pstring(main_menu[n].menu_item,main_menu[n].x1,main_menu[n].x2,y);
}
/**********************************************************************\
* *
* horizontal_menu -- main menu containing submenus *
* *
\**********************************************************************/
horizontal_menu(cmdtab,n,current,foregrnd,backgrnd,hilite_fgnd,hilite_bkgnd)
CMD cmdtab[];
int n, current;
int foregrnd, backgrnd;
int hilite_fgnd, hilite_bkgnd;
{
register int i, k;
int c;
int found, new;
int ymin, ymax;
char l;
if (current >= abs(n))
return(ERR);
ymin = menu_top;
ymax = ymin + ptsize + 1;
fg_mousevis(OFF);
/* set up list of options */
if (n < 0)
{
for (i = 0; i < abs(n); i++)
{
fg_setcolor(backgrnd);
fg_rect(cmdtab[i].x1,cmdtab[i].x2,ymin,ymax);
fg_setcolor(foregrnd);
center_pstring(cmdtab[i].menu_item,cmdtab[i].x1,cmdtab[i].x2,ymax);
}
/* if we're just displaying the menu options, return */
return(OK);
}
/* highlight current option */
i = current;
fg_setcolor(hilite_bkgnd);
fg_rect(cmdtab[i].x1,cmdtab[i].x2,ymin,ymax);
fg_setcolor(hilite_fgnd);
center_pstring(cmdtab[i].menu_item,cmdtab[i].x1,cmdtab[i].x2,ymax);
fg_mousevis(ON);
/* choose an option */
new = current;
fg_setnum(OFF);
flushkey();
while (TRUE)
{
/* activate the corresponding vertical menu */
c = (*cmdtab[i].menu_func)();
/* cycle through choices */
if (c == LEFT_ARROW || c == BS)
new = cmdtab[i].prev;
else if (c == RIGHT_ARROW || c == SPACEBAR)
new = cmdtab[i].next;
else if (c >= 0 && c <= n)
new = c;
else if (c == ESC)
{
exit_program();
return(i);
}
else if (isalpha(c))
{
c = tolower(c);
found = FALSE;
for (k = i+1; k < n; k++)
{
l = first_nonblank(cmdtab[k].menu_item);
if (c == tolower((int)l))
{
found = TRUE;
break;
}
}
if (!found)
{
for (k = 0; k <= i; k++)
{
l = first_nonblank(cmdtab[k].menu_item);
if (c == (char)tolower((int)l))
{
found = TRUE;
break;
}
}
}
if (found)
new = k;
else
return(i);
}
else
return(i);
if (i != new)
{
/* unmark previous option */
fg_mousevis(OFF);
fg_setcolor(backgrnd);
fg_rect(cmdtab[i].x1,cmdtab[i].x2,ymin,ymax);
fg_setcolor(foregrnd);
center_pstring(cmdtab[i].menu_item,cmdtab[i].x1,cmdtab[i].x2,ymax);
/* mark new option */
i = new;
fg_setcolor(hilite_bkgnd);
fg_rect(cmdtab[i].x1,cmdtab[i].x2,ymin,ymax);
fg_setcolor(hilite_fgnd);
center_pstring(cmdtab[i].menu_item,cmdtab[i].x1,cmdtab[i].x2,ymax);
fg_mousevis(ON);
}
}
}
/**********************************************************************\
* *
* submenus *
* *
\**********************************************************************/
submenu1()
{
return(vertical_menu(menu1,0,9,0,15,15,0));
}
submenu2()
{
return(vertical_menu(menu2,1,5,0,15,15,0));
}
submenu3()
{
return(vertical_menu(menu3,2,8,0,15,15,0));
}
submenu4()
{
return(vertical_menu(menu4,3,4,0,15,15,0));
}
submenu5()
{
return(vertical_menu(menu5,4,6,0,15,15,0));
}
submenu6()
{
return(vertical_menu(menu6,5,3,0,15,15,0));
}
/**********************************************************************\
* *
* vertical_menu -- submenu off main menu *
* *
\**********************************************************************/
vertical_menu(cmdtab,index,n,foregrnd,backgrnd,hilite_fgnd,hilite_bkgnd)
CMD cmdtab[];
int index;
int n;
int foregrnd, backgrnd;
int hilite_fgnd, hilite_bkgnd;
{
register int i, j, k;
int found, new;
int height;
int left, right;
int string_x;
int x1, x2, y1, y2;
int ymin, ymax;
int count;
char c, l;
char key, aux;
/* height in pixels of an individual menu item */
height = ptsize + 2;
/* the first menu item determines the x coordinate for the other items */
string_x = get_center(cmdtab[0].menu_item,cmdtab[0].x1,cmdtab[0].x2);
/* define the menu extremes */
x1 = cmdtab[0].x1 - 1;
x2 = cmdtab[0].x2 + 3;
y1 = menu_bottom;
y2 = menu_bottom + n*height + 1;
/* define the associated horizontal mouse limits */
if (mouse)
{
left = mouse_limits[index];
right = mouse_limits[index+1] - 2;
}
/* display the vertical menu if necessary */
if (redraw)
{
/* do this stuff on the hidden page to make it look faster */
fg_setpage(hidden);
/* draw the menu outline and the shadow around it */
fg_mousevis(OFF);
fg_setcolor(backgrnd);
draw_box(x1,x2-2,y1,y2-1);
fg_setcolor(8);
fg_rect(x1+2,x2,y2,y2);
fg_rect(x2-1,x2,y1+scale(2),y2);
fg_setcolor(foregrnd);
draw_box(x1,x2-2,y1,y2-1);
/* set up list of options */
ymax = menu_bottom - 1;
for (i = 0; i < n; i++)
{
ymin = ymax + 1;
ymax = ymin + height - 1;
fg_setcolor(backgrnd);
fg_rect(cmdtab[i].x1,cmdtab[i].x2,ymin,ymax);
fg_setcolor(foregrnd);
put_pstring(cmdtab[i].menu_item,string_x,ymax);
}
/* highlight first or previously selected option */
i = selection;
ymin = menu_bottom + i*height;
ymax = ymin + height - 1;
fg_setcolor(hilite_bkgnd);
fg_rect(cmdtab[i].x1,cmdtab[i].x2,ymin,ymax);
fg_setcolor(hilite_fgnd);
put_pstring(cmdtab[i].menu_item,string_x,ymax);
/* restore the menu to the visual page */
fg_setpage(visual);
fg_restore(x1,x2,y1,y2);
redraw = FALSE;
fg_setpage(hidden);
/* clear the hidden page under the menu */
if (mode06 || mode11)
fg_drect(x1,x2,y1,y2,matrix1);
else
{
fg_setcolor(15);
fg_rect(x1,x2,y1,y2);
fg_setcolor(14);
fg_drect(x1,x2,y1,y2,matrix2);
}
fg_setpage(visual);
fg_mousevis(ON);
}
/* choose an option */
i = selection;
new = i;
fg_setnum(OFF);
flushkey();
while (TRUE)
{
/* read a keystroke */
fg_mousevis(ON);
fg_waitfor(1);
fg_intkey(&key,&aux);
/* if using a mouse, check its position */
if (mouse && key+aux == 0)
{
fg_mousebut(1,&count,&xmouse,&ymouse);
if (count > 0)
{
if (BETWEEN(xmouse,x1,x2) && BETWEEN(ymouse,y1,y2-2))
{
new = (ymouse - y1) / height;
/* check if this is the second click of a double click */
if (i == new)
key = CR;
}
else if (!BETWEEN(xmouse,left,right) && BETWEEN(ymouse,menu_top,y1-1))
{
fg_mousevis(OFF);
fg_restore(0,xlimit,menu_bottom,ylimit);
redraw = TRUE;
selection = 0;
for (j = 0; j <= ITEMS; j++)
{
if (BETWEEN(xmouse,mouse_limits[j],mouse_limits[j+1]))
return(j);
}
}
else
{
fg_mousevis(OFF);
fg_restore(0,xlimit,menu_bottom,ylimit);
redraw = TRUE;
selection = 0;
return(-1);
}
}
}
/* cycle through choices */
if (aux == UP_ARROW || key == BS)
new = cmdtab[i].prev;
else if (aux == DOWN_ARROW || key == SPACEBAR)
new = cmdtab[i].next;
else if (aux == HOME || aux == PAGE_UP)
new = 0;
else if (aux == END || aux == PAGE_DOWN)
new = n - 1;
else if (aux == LEFT_ARROW || aux == RIGHT_ARROW)
{
fg_mousevis(OFF);
fg_restore(0,xlimit,menu_bottom,ylimit);
redraw = TRUE;
selection = 0;
return((int)aux);
}
/* pick one choice */
else if (key == CR)
{
(*cmdtab[i].menu_func)();
wait_for_mouse_buttons();
selection = i;
return(index);
}
else if (key == ESC)
{
selection = 0;
return(ESC);
}
else if (isalpha((int)key))
{
c = (char)tolower((int)key);
found = FALSE;
for (k = i+1; k < n; k++)
{
l = first_nonblank(cmdtab[k].menu_item);
if (c == (char)tolower((int)l))
{
found = TRUE;
break;
}
}
if (!found)
{
for (k = 0; k <= i; k++)
{
l = first_nonblank(cmdtab[k].menu_item);
if (c == (char)tolower((int)l))
{
found = TRUE;
break;
}
}
}
if (found)
new = k;
else
{
redraw = TRUE;
return(-1);
}
}
else if (key+aux > 0) /* any other key */
{
redraw = TRUE;
return(-1);
}
if (i != new)
{
/* unmark previous option */
ymin = menu_bottom + i*height;
ymax = ymin + height - 1;
fg_mousevis(OFF);
fg_setcolor(backgrnd);
fg_rect(cmdtab[i].x1,cmdtab[i].x2,ymin,ymax);
fg_setcolor(foregrnd);
put_pstring(cmdtab[i].menu_item,string_x,ymax);
/* mark new option */
i = new;
ymin = menu_bottom + i*height;
ymax = ymin + height - 1;
fg_setcolor(hilite_bkgnd);
fg_rect(cmdtab[i].x1,cmdtab[i].x2,ymin,ymax);
fg_setcolor(hilite_fgnd);
put_pstring(cmdtab[i].menu_item,string_x,ymax);
/* move mouse cursor to the new option */
if (mouse)
{
fg_mousepos(&xmouse,&ymouse,&buttons);
if (BETWEEN(xmouse,x1,x2)) fg_mousemov(xmouse,(ymin+ymax)/2);
fg_mousevis(ON);
}
}
}
}