version 1.9 | | version 1.10 |
---|
| | |
* Routines for menus. | | * Routines for menus. |
* | | * |
* $Log$ | | * $Log$ |
| | * Revision 1.10 2000/10/27 09:25:09 donut |
| | * made newmenu_do3_real take fonts to use, and make newmenu_do3 and newmenu_do_fixedfont call that |
| | * |
* Revision 1.9 2000/10/27 02:58:00 donut | | * Revision 1.9 2000/10/27 02:58:00 donut |
* menu background drawing correctly scaled at high res instead of being squished. made nm_restore_background scale as well | | * menu background drawing correctly scaled at high res instead of being squished. made nm_restore_background scale as well |
* | | * |
| | |
return newmenu_do3( title, subtitle, nitems, item, subfunction, citem, filename, -1, -1 ); | | return newmenu_do3( title, subtitle, nitems, item, subfunction, citem, filename, -1, -1 ); |
} | | } |
| | |
int newmenu_do3( char * title, char * subtitle, int nitems, newmenu_item * item, void (*subfunction)(int nitems,newmenu_item * items, int * last_key, int citem), int citem, char * filename, int width, int height ) | | //Edited 2000/10/27 Matthew Mueller - made newmenu_do3 allow you to set the fonts used, thus allowing newmenu_do_fixedfont to be removed, saving a lot of duplication. |
| | int newmenu_do3_real( char * title, char * subtitle, int nitems, newmenu_item * item, void (*subfunction)(int nitems,newmenu_item * items, int * last_key, int citem), int citem, char * filename, int width, int height, grs_font *title_font, grs_font *subtitle_font, grs_font *menu_font, grs_font *normal_font) |
{ | | { |
int old_keyd_repeat, done; | | int old_keyd_repeat, done; |
int choice,old_choice,i,j,x,y,w,h,aw, tw, th, twidth,fm,right_offset; | | int choice,old_choice,i,j,x,y,w,h,aw, tw, th, twidth,fm,right_offset; |
| | |
if (nitems < 1 ) | | if (nitems < 1 ) |
return -1; | | return -1; |
| | |
//changed 7/11/99 adb - otherwise d3d problems... | | |
#ifdef D1XD3D | | |
set_screen_mode(SCREEN_MENU); | | |
#else | | |
#ifdef OGL | | |
set_screen_mode(SCREEN_MENU); | | set_screen_mode(SCREEN_MENU); |
// ogl_set_screen_mode(); | | |
#endif | | |
//killed 4/23/99 Matt Mueller - don't switch res for menus.. some menus like their own, but they would need editing to put text correctly and stuff anyway | | |
//--killed-- set_screen_mode(SCREEN_MENU); | | |
//end kill -MM | | |
#endif | | |
//end changes - adb | | |
| | |
//NO_SOUND_PAUSE if ( Function_mode == FMODE_GAME ) { | | //NO_SOUND_PAUSE if ( Function_mode == FMODE_GAME ) { |
//NO_SOUND_PAUSE digi_pause_all(); | | //NO_SOUND_PAUSE digi_pause_all(); |
| | |
tw = th = 0; | | tw = th = 0; |
| | |
if ( title ) { | | if ( title ) { |
grd_curcanv->cv_font = TITLE_FONT; | | grd_curcanv->cv_font = title_font; |
gr_get_string_size(title,&string_width,&string_height,&average_width ); | | gr_get_string_size(title,&string_width,&string_height,&average_width ); |
tw = string_width; | | tw = string_width; |
th = string_height; | | th = string_height; |
} | | } |
if ( subtitle ) { | | if ( subtitle ) { |
grd_curcanv->cv_font = SUBTITLE_FONT; | | grd_curcanv->cv_font = subtitle_font; |
gr_get_string_size(subtitle,&string_width,&string_height,&average_width ); | | gr_get_string_size(subtitle,&string_width,&string_height,&average_width ); |
if (string_width > tw ) | | if (string_width > tw ) |
tw = string_width; | | tw = string_width; |
| | |
| | |
th += 8; //put some space between titles & body | | th += 8; //put some space between titles & body |
| | |
grd_curcanv->cv_font = NORMAL_FONT; | | grd_curcanv->cv_font = normal_font; |
| | |
w = aw = 0; | | w = aw = 0; |
h = th; | | h = th; |
| | |
} | | } |
| | |
// Save the background of the display | | // Save the background of the display |
//changed 7/11/99 adb - otherwise d3d problems... | | |
#ifdef D1XD3D | | |
bg.menu_canvas = gr_create_sub_canvas( &grd_curscreen->sc_canvas, x, y, w, h ); | | bg.menu_canvas = gr_create_sub_canvas( &grd_curscreen->sc_canvas, x, y, w, h ); |
#else | | |
//edited 4/30/99 by Owen Evans to fix res-changing | | |
// bg.menu_canvas = gr_create_sub_canvas( &grd_curscreen->sc_canvas, x, y, w, h ); | | |
bg.menu_canvas = gr_create_sub_canvas(&VR_screen_pages[VR_current_page], x, y, w, h ); | | |
//end this section edit - OE | | |
#endif | | |
gr_set_current_canvas( bg.menu_canvas ); | | gr_set_current_canvas( bg.menu_canvas ); |
//end changes - adb | | |
| | |
if ( filename == NULL ) { | | if ( filename == NULL ) { |
// Save the background under the menu... | | // Save the background under the menu... |
bg.saved = gr_create_bitmap( w, h ); | | bg.saved = gr_create_bitmap( w, h ); |
Assert( bg.saved != NULL ); | | Assert( bg.saved != NULL ); |
gr_bm_bitblt(w, h, 0, 0, 0, 0, &grd_curcanv->cv_bitmap, bg.saved ); | | gr_bm_bitblt(w, h, 0, 0, 0, 0, &grd_curcanv->cv_bitmap, bg.saved ); |
//changed 7/11/99 adb - otherwise d3d problems... | | |
#ifdef D1XD3D | | |
gr_set_current_canvas( NULL ); | | gr_set_current_canvas( NULL ); |
#else | | |
//edited 4/30/99 by Owen Evans to fix res-changing | | |
// gr_set_current_canvas( NULL ); | | |
gr_set_current_canvas( &VR_screen_pages[VR_current_page] ); | | |
//end this section edit - OE | | |
#endif | | |
//end changes - adb | | |
nm_draw_background(x,y,x+w-1,y+h-1); | | nm_draw_background(x,y,x+w-1,y+h-1); |
if (GWIDTH > nm_background.bm_w || GHEIGHT > nm_background.bm_h){ | | if (GWIDTH > nm_background.bm_w || GHEIGHT > nm_background.bm_h){ |
grs_bitmap sbg; | | grs_bitmap sbg; |
| | |
bg.background = gr_create_bitmap( w, h ); | | bg.background = gr_create_bitmap( w, h ); |
Assert( bg.background != NULL ); | | Assert( bg.background != NULL ); |
gr_bm_bitblt(w, h, 0, 0, 0, 0, &grd_curcanv->cv_bitmap, bg.background ); | | gr_bm_bitblt(w, h, 0, 0, 0, 0, &grd_curcanv->cv_bitmap, bg.background ); |
| | printf("hello #######\n");//############## |
} | | } |
| | |
// ty = 15 + (yborder/4); | | // ty = 15 + (yborder/4); |
| | |
| | |
| | |
if ( title ) { | | if ( title ) { |
grd_curcanv->cv_font = TITLE_FONT; | | grd_curcanv->cv_font = title_font; |
gr_set_fontcolor( GR_GETCOLOR(31,31,31), -1 ); | | gr_set_fontcolor( GR_GETCOLOR(31,31,31), -1 ); |
gr_get_string_size(title,&string_width,&string_height,&average_width ); | | gr_get_string_size(title,&string_width,&string_height,&average_width ); |
tw = string_width; | | tw = string_width; |
| | |
} | | } |
| | |
if ( subtitle ) { | | if ( subtitle ) { |
grd_curcanv->cv_font = SUBTITLE_FONT; | | grd_curcanv->cv_font = subtitle_font; |
gr_set_fontcolor( GR_GETCOLOR(21,21,21), -1 ); | | gr_set_fontcolor( GR_GETCOLOR(21,21,21), -1 ); |
gr_get_string_size(subtitle,&string_width,&string_height,&average_width ); | | gr_get_string_size(subtitle,&string_width,&string_height,&average_width ); |
tw = string_width; | | tw = string_width; |
| | |
ty += th; | | ty += th; |
} | | } |
| | |
grd_curcanv->cv_font = NORMAL_FONT; | | grd_curcanv->cv_font = normal_font; |
| | |
// Update all item's x & y values. | | // Update all item's x & y values. |
for (i=0; i<nitems; i++ ) { | | for (i=0; i<nitems; i++ ) { |
| | |
| | |
} | | } |
| | |
| | int newmenu_do_fixedfont( char * title, char * subtitle, int nitems, newmenu_item * item, void (*subfunction)(int nitems,newmenu_item * items, int * last_key, int citem), int citem, char * filename, int width, int height){ |
| | return newmenu_do3_real( title, subtitle, nitems, item, subfunction, citem, filename, width,height, GAME_FONT, GAME_FONT, GAME_FONT, GAME_FONT); |
| | } |
| | |
| | int newmenu_do3( char * title, char * subtitle, int nitems, newmenu_item * item, void (*subfunction)(int nitems,newmenu_item * items, int * last_key, int citem), int citem, char * filename, int width, int height){ |
| | return newmenu_do3_real( title, subtitle, nitems, item, subfunction, citem, filename, width,height, TITLE_FONT, SUBTITLE_FONT, MENU_FONT, NORMAL_FONT); |
| | } |
| | |
| | |
| | |
int nm_messagebox1( char *title, void (*subfunction)(int nitems,newmenu_item * items, int * last_key, int citem), int nchoices, ... ) | | int nm_messagebox1( char *title, void (*subfunction)(int nitems,newmenu_item * items, int * last_key, int citem), int nchoices, ... ) |
{ | | { |
| | |
} | | } |
| | |
//added on 10/14/98 by Victor Rachels to attempt a fixedwidth font messagebox | | //added on 10/14/98 by Victor Rachels to attempt a fixedwidth font messagebox |
int newmenu_do_fixedfont( char * title, char * subtitle, int nitems, newmenu_item * item, void (*subfunction)(int nitems,newmenu_item * items, int * last_key, int citem), int citem, char * filename, int width, int height ) | | |
{ | | |
int old_keyd_repeat, done; | | |
int choice,old_choice,i,j,x,y,w,h,aw, tw, th, twidth,fm,right_offset; | | |
int k, nmenus, nothers; | | |
grs_canvas * save_canvas; | | |
grs_font * save_font; | | |
int string_width, string_height, average_width; | | |
int ty; | | |
bkg bg; | | |
int all_text=0; //set true if all text items | | |
int time_stopped=0; | | |
| | |
if (nitems < 1 ) | | |
return -1; | | |
| | |
set_screen_mode(SCREEN_MENU); | | |
| | |
//NO_SOUND_PAUSE if ( Function_mode == FMODE_GAME ) { | | |
//NO_SOUND_PAUSE digi_pause_all(); | | |
//NO_SOUND_PAUSE sound_stopped = 1; | | |
//NO_SOUND_PAUSE } | | |
| | |
if (!((Game_mode & GM_MULTI) && (Function_mode == FMODE_GAME) && (!Endlevel_sequence)) ) | | |
{ | | |
time_stopped = 1; | | |
stop_time(); | | |
} | | |
| | |
save_canvas = grd_curcanv; | | |
gr_set_current_canvas( NULL ); | | |
save_font = grd_curcanv->cv_font; | | |
| | |
tw = th = 0; | | |
| | |
if ( title ) { | | |
grd_curcanv->cv_font = GAME_FONT; | | |
gr_get_string_size(title,&string_width,&string_height,&average_width ); | | |
tw = string_width; | | |
th = string_height; | | |
} | | |
if ( subtitle ) { | | |
grd_curcanv->cv_font = GAME_FONT; | | |
gr_get_string_size(subtitle,&string_width,&string_height,&average_width ); | | |
if (string_width > tw ) | | |
tw = string_width; | | |
th += string_height; | | |
} | | |
| | |
th += 8; //put some space between titles & body | | |
| | |
grd_curcanv->cv_font = GAME_FONT; | | |
| | |
w = aw = 0; | | |
h = th; | | |
nmenus = nothers = 0; | | |
| | |
// Find menu height & width (store in w,h) | | |
for (i=0; i<nitems; i++ ) { | | |
item[i].redraw=1; | | |
item[i].y = h; | | |
gr_get_string_size(item[i].text,&string_width,&string_height,&average_width ); | | |
item[i].right_offset = 0; | | |
| | |
item[i].saved_text[0] = '\0'; | | |
| | |
if ( item[i].type == NM_TYPE_SLIDER ) { | | |
int w1,h1,aw1; | | |
nothers++; | | |
sprintf( item[i].saved_text, "%s", SLIDER_LEFT ); | | |
for (j=0; j<(item[i].max_value-item[i].min_value+1); j++ ) { | | |
sprintf( item[i].saved_text, "%s%s", item[i].saved_text,SLIDER_MIDDLE ); | | |
} | | |
sprintf( item[i].saved_text, "%s%s", item[i].saved_text,SLIDER_RIGHT ); | | |
gr_get_string_size(item[i].saved_text,&w1,&h1,&aw1 ); | | |
string_width += w1 + aw; | | |
} | | |
| | |
if ( item[i].type == NM_TYPE_MENU ) { | | |
nmenus++; | | |
} | | |
| | |
if ( item[i].type == NM_TYPE_CHECK ) { | | |
int w1,h1,aw1; | | |
nothers++; | | |
gr_get_string_size(NORMAL_CHECK_BOX, &w1, &h1, &aw1 ); | | |
item[i].right_offset = w1; | | |
gr_get_string_size(CHECKED_CHECK_BOX, &w1, &h1, &aw1 ); | | |
if (w1 > item[i].right_offset) | | |
item[i].right_offset = w1; | | |
} | | |
| | |
if (item[i].type == NM_TYPE_RADIO ) { | | |
int w1,h1,aw1; | | |
nothers++; | | |
gr_get_string_size(NORMAL_RADIO_BOX, &w1, &h1, &aw1 ); | | |
item[i].right_offset = w1; | | |
gr_get_string_size(CHECKED_RADIO_BOX, &w1, &h1, &aw1 ); | | |
if (w1 > item[i].right_offset) | | |
item[i].right_offset = w1; | | |
} | | |
| | |
if (item[i].type==NM_TYPE_NUMBER ) { | | |
int w1,h1,aw1; | | |
char test_text[20]; | | |
nothers++; | | |
sprintf( test_text, "%d", item[i].max_value ); | | |
gr_get_string_size( test_text, &w1, &h1, &aw1 ); | | |
item[i].right_offset = w1; | | |
sprintf( test_text, "%d", item[i].min_value ); | | |
gr_get_string_size( test_text, &w1, &h1, &aw1 ); | | |
if ( w1 > item[i].right_offset) | | |
item[i].right_offset = w1; | | |
} | | |
| | |
if ( item[i].type == NM_TYPE_INPUT ) { | | |
Assert( strlen(item[i].text) < NM_MAX_TEXT_LEN ); | | |
strcpy(item[i].saved_text, item[i].text ); | | |
nothers++; | | |
string_width = item[i].text_len*grd_curcanv->cv_font->ft_w+item[i].text_len; | | |
if ( string_width > MAX_TEXT_WIDTH ) | | |
string_width = MAX_TEXT_WIDTH; | | |
item[i].value = -1; | | |
} | | |
| | |
if ( item[i].type == NM_TYPE_INPUT_MENU ) { | | |
Assert( strlen(item[i].text) < NM_MAX_TEXT_LEN ); | | |
strcpy(item[i].saved_text, item[i].text ); | | |
nmenus++; | | |
string_width = item[i].text_len*grd_curcanv->cv_font->ft_w+item[i].text_len; | | |
item[i].value = -1; | | |
item[i].group = 0; | | |
} | | |
| | |
item[i].w = string_width; | | |
item[i].h = string_height; | | |
| | |
if ( string_width > w ) | | |
w = string_width; // Save maximum width | | |
if ( average_width > aw ) | | |
aw = average_width; | | |
h += string_height+1; // Find the height of all strings | | |
} | | |
| | |
right_offset=0; | | |
| | |
if ( width > -1 ) | | |
w = width; | | |
| | |
if ( height > -1 ) | | |
h = height; | | |
| | |
for (i=0; i<nitems; i++ ) { | | |
item[i].w = w; | | |
if (item[i].right_offset > right_offset ) | | |
right_offset = item[i].right_offset; | | |
} | | |
if (right_offset > 0 ) | | |
right_offset += 3; | | |
| | |
//mprintf( 0, "Right offset = %d\n", right_offset ); | | |
| | |
//gr_get_string_size("",&string_width,&string_height,&average_width ); | | |
| | |
w += right_offset; | | |
| | |
twidth = 0; | | |
if ( tw > w ) { | | |
twidth = ( tw - w )/2; | | |
w = tw; | | |
} | | |
| | |
// Find min point of menu border | | |
// x = (grd_curscreen->sc_w-w)/2; | | |
// y = (grd_curscreen->sc_h-h)/2; | | |
| | |
w += 30; | | |
h += 30; | | |
| | |
if ( w > 320 ) w = 320; | | |
if ( h > 200 ) h = 200; | | |
| | |
x = (grd_curcanv->cv_bitmap.bm_w-w)/2; | | |
y = (grd_curcanv->cv_bitmap.bm_h-h)/2; | | |
| | |
if ( x < 0 ) x = 0; | | |
if ( y < 0 ) y = 0; | | |
| | |
if ( filename != NULL ) { | | |
nm_draw_background1( filename ); | | |
} | | |
| | |
// Save the background of the display | | |
bg.menu_canvas = gr_create_sub_canvas( &grd_curscreen->sc_canvas, x, y, w, h ); | | |
gr_set_current_canvas( bg.menu_canvas ); | | |
| | |
if ( filename == NULL ) { | | |
// Save the background under the menu... | | |
bg.saved = gr_create_bitmap( w, h ); | | |
Assert( bg.saved != NULL ); | | |
gr_bm_bitblt(w, h, 0, 0, 0, 0, &grd_curcanv->cv_bitmap, bg.saved ); | | |
gr_set_current_canvas( NULL ); | | |
nm_draw_background(x,y,x+w-1,y+h-1); | | |
if (GWIDTH > nm_background.bm_w || GHEIGHT > nm_background.bm_h){ | | |
grs_bitmap sbg; | | |
gr_init_sub_bitmap(&sbg,&nm_background,0,0,w*(320.0/GWIDTH),h*(200.0/GHEIGHT));//use the correctly resized portion of the background instead of the whole thing -MPM | | |
bg.background=gr_create_bitmap(w,h); | | |
gr_bitmap_scale_to(&sbg,bg.background); | | |
bg.background_is_sub=0; | | |
}else{ | | |
bg.background = gr_create_sub_bitmap(&nm_background,0,0,w,h); | | |
bg.background_is_sub=1; | | |
} | | |
gr_set_current_canvas( bg.menu_canvas ); | | |
} else { | | |
bg.saved = NULL; | | |
bg.background = gr_create_bitmap( w, h ); | | |
Assert( bg.background != NULL ); | | |
gr_bm_bitblt(w, h, 0, 0, 0, 0, &grd_curcanv->cv_bitmap, bg.background ); | | |
} | | |
| | |
// ty = 15 + (yborder/4); | | |
| | |
ty = 15; | | |
| | |
if ( title ) { | | |
grd_curcanv->cv_font = GAME_FONT; | | |
gr_set_fontcolor( GR_GETCOLOR(31,31,31), -1 ); | | |
gr_get_string_size(title,&string_width,&string_height,&average_width ); | | |
tw = string_width; | | |
th = string_height; | | |
gr_printf( 0x8000, ty, title ); | | |
ty += th; | | |
} | | |
| | |
if ( subtitle ) { | | |
grd_curcanv->cv_font = GAME_FONT; | | |
gr_set_fontcolor( GR_GETCOLOR(21,21,21), -1 ); | | |
gr_get_string_size(subtitle,&string_width,&string_height,&average_width ); | | |
tw = string_width; | | |
th = string_height; | | |
gr_printf( 0x8000, ty, subtitle ); | | |
ty += th; | | |
} | | |
| | |
grd_curcanv->cv_font = GAME_FONT; | | |
| | |
// Update all item's x & y values. | | |
for (i=0; i<nitems; i++ ) { | | |
item[i].x = 15 + twidth + right_offset; | | |
item[i].y += 15; | | |
if ( item[i].type==NM_TYPE_RADIO ) { | | |
fm = -1; // find first marked one | | |
for ( j=0; j<nitems; j++ ) { | | |
if ( item[j].type==NM_TYPE_RADIO && item[j].group==item[i].group ) { | | |
if (fm==-1 && item[j].value) | | |
fm = j; | | |
item[j].value = 0; | | |
} | | |
} | | |
if ( fm>=0 ) | | |
item[fm].value=1; | | |
else | | |
item[i].value=1; | | |
} | | |
} | | |
| | |
old_keyd_repeat = keyd_repeat; | | |
keyd_repeat = 1; | | |
| | |
if (citem==-1) { | | |
choice = -1; | | |
} else { | | |
if (citem < 0 ) citem = 0; | | |
if (citem > nitems-1 ) citem = nitems-1; | | |
choice = citem; | | |
| | |
while ( item[choice].type==NM_TYPE_TEXT ) { | | |
choice++; | | |
if (choice >= nitems ) { | | |
choice=0; | | |
} | | |
if (choice == citem ) { | | |
choice=0; | | |
all_text=1; | | |
break; | | |
} | | |
} | | |
} | | |
done = 0; | | |
gr_update(); | | |
// Clear mouse, joystick to clear button presses. | | |
game_flush_inputs(); | | |
| | |
while(!done) { | | |
//network_listen(); | | |
| | |
| | |
k = key_inkey(); | | |
| | |
if (subfunction) | | |
(*subfunction)(nitems,item,&k,choice); | | |
| | |
if (!time_stopped) { | | |
// Save current menu box | | |
#ifdef NETWORK | | |
if (multi_menu_poll() == -1) | | |
k = -2; | | |
#endif | | |
} | | |
| | |
if ( k<-1 ) { | | |
choice = k; | | |
k = -1; | | |
done = 1; | | |
} | | |
| | |
switch (Config_control_type) { | | |
case CONTROL_JOYSTICK: | | |
case CONTROL_FLIGHTSTICK_PRO: | | |
case CONTROL_THRUSTMASTER_FCS: | | |
case CONTROL_GRAVIS_GAMEPAD: | | |
for (i=0; i<4; i++ ) | | |
if (joy_get_button_down_cnt(i)>0) done=1; | | |
break; | | |
case CONTROL_MOUSE: | | |
case CONTROL_CYBERMAN: | | |
for (i=0; i<3; i++ ) | | |
if (mouse_button_down_count(i)>0) done=1; | | |
break; | | |
} | | |
| | |
| | |
// if ( (nmenus<2) && (k>0) && (nothers==0) ) | | |
// done=1; | | |
| | |
old_choice = choice; | | |
| | |
switch( k ) { | | |
case KEY_TAB + KEY_SHIFTED: | | |
case KEY_UP: | | |
case KEY_PAD8: | | |
if (all_text) break; | | |
do { | | |
choice--; | | |
if (choice >= nitems ) choice=0; | | |
if (choice < 0 ) choice=nitems-1; | | |
} while ( item[choice].type==NM_TYPE_TEXT ); | | |
if ((item[choice].type==NM_TYPE_INPUT) && (choice!=old_choice)) | | |
item[choice].value = -1; | | |
if ((old_choice>-1) && (item[old_choice].type==NM_TYPE_INPUT_MENU) && (old_choice!=choice)) { | | |
item[old_choice].group=0; | | |
strcpy(item[old_choice].text, item[old_choice].saved_text ); | | |
item[old_choice].value = -1; | | |
} | | |
if (old_choice>-1) | | |
item[old_choice].redraw = 1; | | |
item[choice].redraw=1; | | |
break; | | |
case KEY_TAB: | | |
case KEY_DOWN: | | |
case KEY_PAD2: | | |
if (all_text) break; | | |
do { | | |
choice++; | | |
if (choice < 0 ) choice=nitems-1; | | |
if (choice >= nitems ) choice=0; | | |
} while ( item[choice].type==NM_TYPE_TEXT ); | | |
if ((item[choice].type==NM_TYPE_INPUT) && (choice!=old_choice)) | | |
item[choice].value = -1; | | |
if ( (old_choice>-1) && (item[old_choice].type==NM_TYPE_INPUT_MENU) && (old_choice!=choice)) { | | |
item[old_choice].group=0; | | |
strcpy(item[old_choice].text, item[old_choice].saved_text ); | | |
item[old_choice].value = -1; | | |
} | | |
if (old_choice>-1) | | |
item[old_choice].redraw=1; | | |
item[choice].redraw=1; | | |
break; | | |
case KEY_SPACEBAR: | | |
if ( choice > -1 ) { | | |
switch( item[choice].type ) { | | |
case NM_TYPE_MENU: | | |
case NM_TYPE_INPUT: | | |
case NM_TYPE_INPUT_MENU: | | |
break; | | |
case NM_TYPE_CHECK: | | |
if ( item[choice].value ) | | |
item[choice].value = 0; | | |
else | | |
item[choice].value = 1; | | |
item[choice].redraw=1; | | |
break; | | |
case NM_TYPE_RADIO: | | |
for (i=0; i<nitems; i++ ) { | | |
if ((i!=choice) && (item[i].type==NM_TYPE_RADIO) && (item[i].group==item[choice].group) && (item[i].value) ) { | | |
item[i].value = 0; | | |
item[i].redraw = 1; | | |
} | | |
} | | |
item[choice].value = 1; | | |
item[choice].redraw = 1; | | |
break; | | |
} | | |
} | | |
break; | | |
| | |
case KEY_ENTER: | | |
case KEY_PADENTER: | | |
if ( (choice>-1) && (item[choice].type==NM_TYPE_INPUT_MENU) && (item[choice].group==0)) { | | |
item[choice].group = 1; | | |
item[choice].redraw = 1; | | |
if ( !strncasecmp( item[choice].saved_text, TXT_EMPTY, strlen(TXT_EMPTY) ) ) { | | |
item[choice].text[0] = 0; | | |
item[choice].value = -1; | | |
} else { | | |
strip_end_whitespace(item[choice].text); | | |
} | | |
} else | | |
done = 1; | | |
break; | | |
| | |
case KEY_ESC: | | |
if ( (choice>-1) && (item[choice].type==NM_TYPE_INPUT_MENU) && (item[choice].group==1)) { | | |
item[choice].group=0; | | |
strcpy(item[choice].text, item[choice].saved_text ); | | |
item[choice].redraw=1; | | |
item[choice].value = -1; | | |
} else { | | |
done = 1; | | |
choice = -1; | | |
} | | |
break; | | |
| | |
case KEY_PRINT_SCREEN: save_screen_shot(0); break; | | |
| | |
#ifndef NDEBUG | | |
case KEY_BACKSP: | | |
if ( (choice>-1) && (item[choice].type!=NM_TYPE_INPUT)&&(item[choice].type!=NM_TYPE_INPUT_MENU)) | | |
Int3(); | | |
break; | | |
#endif | | |
| | |
} | | |
| | |
if ( choice > -1 ) { | | |
int ascii; | | |
| | |
if ( ((item[choice].type==NM_TYPE_INPUT)||((item[choice].type==NM_TYPE_INPUT_MENU)&&(item[choice].group==1)) )&& (old_choice==choice) ) { | | |
if ( k==KEY_LEFT || k==KEY_BACKSP || k==KEY_PAD4 ) { | | |
if (item[choice].value==-1) item[choice].value = strlen(item[choice].text); | | |
if (item[choice].value > 0) | | |
item[choice].value--; | | |
item[choice].text[item[choice].value] = 0; | | |
item[choice].redraw = 1; | | |
} else { | | |
ascii = key_to_ascii(k); | | |
if ((ascii < 255 ) && (item[choice].value < item[choice].text_len )) | | |
{ | | |
int allowed; | | |
| | |
if (item[choice].value==-1) { | | |
item[choice].value = 0; | | |
} | | |
| | |
allowed = char_allowed(ascii); | | |
if (!allowed && ascii==' ' && char_allowed('_')) { | | |
ascii = '_'; | | |
allowed=1; | | |
} | | |
| | |
if (allowed) { | | |
item[choice].text[item[choice].value++] = ascii; | | |
item[choice].text[item[choice].value] = 0; | | |
item[choice].redraw=1; | | |
} | | |
} | | |
} | | |
} else if ((item[choice].type!=NM_TYPE_INPUT) && (item[choice].type!=NM_TYPE_INPUT_MENU) ) { | | |
ascii = key_to_ascii(k); | | |
if (ascii < 255 ) { | | |
int choice1 = choice; | | |
ascii = toupper(ascii); | | |
do { | | |
int i,ch; | | |
choice1++; | | |
if (choice1 >= nitems ) choice1=0; | | |
for (i=0;(ch=item[choice1].text[i])!=0 && ch==' ';i++); | | |
if ( ( (item[choice1].type==NM_TYPE_MENU) || | | |
(item[choice1].type==NM_TYPE_CHECK) || | | |
(item[choice1].type==NM_TYPE_RADIO) || | | |
(item[choice1].type==NM_TYPE_NUMBER) || | | |
(item[choice1].type==NM_TYPE_SLIDER) ) | | |
&& (ascii==toupper(ch)) ) { | | |
k = 0; | | |
choice = choice1; | | |
if (old_choice>-1) | | |
item[old_choice].redraw=1; | | |
item[choice].redraw=1; | | |
} | | |
} while (choice1 != choice ); | | |
} | | |
} | | |
| | |
if ( (item[choice].type==NM_TYPE_NUMBER) || (item[choice].type==NM_TYPE_SLIDER)) { | | |
int ov=item[choice].value; | | |
switch( k ) { | | |
case KEY_PAD4: | | |
case KEY_LEFT: | | |
case KEY_MINUS: | | |
case KEY_MINUS+KEY_SHIFTED: | | |
case KEY_PADMINUS: | | |
item[choice].value -= 1; | | |
break; | | |
case KEY_RIGHT: | | |
case KEY_PAD6: | | |
case KEY_EQUAL: | | |
case KEY_EQUAL+KEY_SHIFTED: | | |
case KEY_PADPLUS: | | |
item[choice].value++; | | |
break; | | |
case KEY_PAGEUP: | | |
case KEY_PAD9: | | |
case KEY_SPACEBAR: | | |
item[choice].value += 10; | | |
break; | | |
case KEY_PAGEDOWN: | | |
case KEY_BACKSP: | | |
case KEY_PAD3: | | |
item[choice].value -= 10; | | |
break; | | |
} | | |
if (ov!=item[choice].value) | | |
item[choice].redraw=1; | | |
} | | |
| | |
} | | |
| | |
gr_set_current_canvas(bg.menu_canvas); | | |
// Redraw everything... | | |
for (i=0; i<nitems; i++ ) { | | |
if (item[i].redraw) { | | |
draw_item( &bg, &item[i], (i==choice && !all_text) ); | | |
item[i].redraw=0; | | |
} | | |
else if (i==choice && (item[i].type==NM_TYPE_INPUT || (item[i].type==NM_TYPE_INPUT_MENU && item[i].group))) | | |
update_cursor( &item[i]); | | |
} | | |
gr_update(); | | |
| | |
if ( gr_palette_faded_out ) { | | |
gr_palette_fade_in( gr_palette, 32, 0 ); | | |
} | | |
} | | |
| | |
// Restore everything... | | |
gr_set_current_canvas(bg.menu_canvas); | | |
if ( filename == NULL ) { | | |
// Save the background under the menu... | | |
gr_bitmap(0, 0, bg.saved); | | |
gr_free_bitmap(bg.saved); | | |
if (bg.background_is_sub) | | |
gr_free_sub_bitmap( bg.background ); | | |
else | | |
gr_free_bitmap( bg.background ); | | |
// free( bg.background ); | | |
} else { | | |
gr_bitmap(0, 0, bg.background); | | |
gr_free_bitmap(bg.background); | | |
} | | |
| | |
gr_free_sub_canvas( bg.menu_canvas ); | | |
| | |
gr_set_current_canvas( NULL ); | | |
grd_curcanv->cv_font = save_font; | | |
gr_set_current_canvas( save_canvas ); | | |
keyd_repeat = old_keyd_repeat; | | |
| | |
game_flush_inputs(); | | |
| | |
if (time_stopped) | | |
start_time(); | | |
| | |
//NO_SOUND_PAUSE if ( sound_stopped ) | | |
//NO_SOUND_PAUSE digi_resume_all(); | | |
| | |
return choice; | | |
| | |
} | | |
| | |
| | |
int nm_messagebox_fixedfont( char *title, int nchoices, ... ) | | int nm_messagebox_fixedfont( char *title, int nchoices, ... ) |
{ | | { |
int i; | | int i; |