make it so menu items can get called for any keypress. this is optionally

done by setting the allkeys param to 1. when this is the case, if the menu
item function returns 0, normal processing is done, otherwise processing
stops.
This commit is contained in:
Bill Currie 2002-02-01 17:32:40 +00:00
parent 8503b43897
commit cf2f42ea6a
4 changed files with 42 additions and 24 deletions

View file

@ -133,16 +133,18 @@ void () scan_saves =
}
};
void (string text, integer key) load_f =
integer (string text, integer key) load_f =
{
scan_saves ();
Menu_SelectMenu ("load");
return 0;
};
void (string text, integer key) save_f =
integer (string text, integer key) save_f =
{
scan_saves ();
Menu_SelectMenu ("save");
return 0;
};
integer () load_draw =
@ -241,9 +243,10 @@ integer () quit =
return 0;
};
void (string text, integer key) quit_f =
integer (string text, integer key) quit_f =
{
quit ();
return 0;
};
integer (integer key, integer unicode, integer down) quit_keyevent =
@ -278,7 +281,7 @@ void () quit_menu =
Menu_End ();
};
void (string text, integer key) sp_start =
integer (string text, integer key) sp_start =
{
Menu_SelectMenu (NIL);
Cbuf_AddText ("disconnect\n");
@ -290,6 +293,7 @@ void (string text, integer key) sp_start =
Cbuf_AddText ("noexit 0\n");
Cbuf_AddText ("samelevel 0\n");
Cbuf_AddText ("map start\n");
return 0;
};
void () single_player_menu =
@ -300,9 +304,9 @@ void () single_player_menu =
Menu_CenterPic (160, 4, "gfx/ttl_sgl.lmp");
Menu_Pic (72, 32, "gfx/sp_menu.lmp");
Menu_Cursor (spinner);
Menu_Item (54, 32, "", sp_start);
Menu_Item (54, 52, "", load_f);
Menu_Item (54, 72, "", save_f);
Menu_Item (54, 32, "", sp_start, 0);
Menu_Item (54, 52, "", load_f, 0);
Menu_Item (54, 72, "", save_f, 0);
Menu_End ();
};
@ -443,8 +447,8 @@ void () multi_player_menu =
Menu_KeyEvent (multi_player_keyevent);
join_menu ();
if (do_single_player)
Menu_Item (54, 52, "", quit_f);
Menu_Item (54, 72, "", quit_f);
Menu_Item (54, 52, "", quit_f, 0);
Menu_Item (54, 72, "", quit_f, 0);
Menu_Cursor (spinner);
Menu_End ();
};
@ -453,7 +457,7 @@ void () multi_player_menu =
void () help_menu =
{
Menu_Item (54, 92, "", quit_f);
Menu_Item (54, 92, "", quit_f, 0);
};
void () main_menu =
@ -469,7 +473,7 @@ void () main_menu =
multi_player_menu ();
options_menu ();
help_menu ();
Menu_Item (54, 112, "", quit_f);
Menu_Item (54, 112, "", quit_f, 0);
Menu_End ();
};

View file

@ -3,7 +3,7 @@ void (integer val) Menu_FadeScreen = #0;
void (integer () func) Menu_Draw = #0;
void (integer x, integer y, string name) Menu_Pic = #0;
void (integer x, integer y, string name) Menu_CenterPic = #0;
void (integer x, integer y, string text, void (string text, integer key) func) Menu_Item = #0;
void (integer x, integer y, string text, integer (string text, integer key) func, integer allkeys) Menu_Item = #0;
void (void (integer x, integer y) func) Menu_Cursor = #0;
void (integer (integer key, integer unicode, integer down) func) Menu_KeyEvent = #0;
void () Menu_End = #0;

View file

@ -10,7 +10,7 @@ void (integer x, integer y) opt_cursor =
Draw_Character (x, y, 12 + (integer (time * 4) & 1));
};
void (string text, integer key) video_options_f =
integer (string text, integer key) video_options_f =
{
local integer selected_crosshair;
local float gamma;
@ -44,13 +44,15 @@ void (string text, integer key) video_options_f =
cvar_set("vid_gamma", ftos(gamma));
break;
}
return 0;
};
void (string text, integer key) control_options_f =
integer (string text, integer key) control_options_f =
{
switch (text) {
case "in_grab":
Cbuf_AddText ("toggle in_grab\n");
return;
break;
case "autorun":
if(cvar("cl_forwardspeed") < 400) {
Cbuf_AddText ("set cl_forwardspeed 400\n");
@ -59,7 +61,7 @@ void (string text, integer key) control_options_f =
Cbuf_AddText ("set cl_forwardspeed 200\n");
Cbuf_AddText ("set cl_backspeed 200\n");
}
return;
break;
case "set_key":
if(set_key_flag) {
set_key_flag = 0;
@ -68,6 +70,7 @@ void (string text, integer key) control_options_f =
}
break;
}
return 0;
};
@ -212,11 +215,11 @@ void () options_controls_menu =
Menu_CenterPic (160, 4, "gfx/p_option.lmp");
Menu_Draw (options_controls_draw);
Menu_KeyEvent (options_controls_keyevent);
Menu_Item (54, 60, "in_grab", control_options_f);
Menu_Item (54, 70, "autorun", control_options_f);
Menu_Item (54, 90, "set_key", control_options_f);
Menu_Item (54, 100, "set_key", control_options_f);
Menu_Item (54, 110, "set_key", control_options_f);
Menu_Item (54, 60, "in_grab", control_options_f, 0);
Menu_Item (54, 70, "autorun", control_options_f, 0);
Menu_Item (54, 90, "set_key", control_options_f, 0);
Menu_Item (54, 100, "set_key", control_options_f, 0);
Menu_Item (54, 110, "set_key", control_options_f, 0);
Menu_End ();
};
@ -256,9 +259,9 @@ void () options_video_menu =
Menu_Draw (options_video_draw);
Menu_KeyEvent (options_video_keyevent);
Menu_Item (54, 60, "fullscreen", video_options_f);
Menu_Item (54, 70, "crosshair", video_options_f);
Menu_Item (54, 80, "gamma", video_options_f);
Menu_Item (54, 60, "fullscreen", video_options_f, 0);
Menu_Item (54, 70, "crosshair", video_options_f, 0);
Menu_Item (54, 80, "gamma", video_options_f, 0);
Menu_End ();
};

View file

@ -62,6 +62,7 @@ typedef struct menu_item_s {
func_t keyevent;
func_t draw;
unsigned fadescreen:1;
unsigned allkeys:1;
const char *text;
menu_pic_t *pics;
} menu_item_t;
@ -204,6 +205,7 @@ bi_Menu_Item (progs_t *pr)
int y = G_INT (pr, OFS_PARM1);
const char *text = G_STRING (pr, OFS_PARM2);
func_t func = G_FUNCTION (pr, OFS_PARM3);
int allkeys = G_INT (pr, OFS_PARM4);
menu_item_t *mi = calloc (sizeof (menu_item_t), 1);
mi->x = x;
@ -211,6 +213,7 @@ bi_Menu_Item (progs_t *pr)
mi->text = strdup (text);
mi->func = func;
mi->parent = menu;
mi->allkeys = allkeys;
menu_add_item (menu, mi);
}
@ -465,6 +468,14 @@ Menu_KeyEvent (knum_t key, short unicode, qboolean down)
PR_ExecuteProgram (&menu_pr_state, menu->keyevent);
if (G_INT (&menu_pr_state, OFS_RETURN))
return;
} else if (menu->items && menu->items[menu->cur_item]->func
&& menu->items[menu->cur_item]->allkeys) {
G_INT (&menu_pr_state, OFS_PARM0) = key;
G_INT (&menu_pr_state, OFS_PARM1) = unicode;
G_INT (&menu_pr_state, OFS_PARM2) = down;
PR_ExecuteProgram (&menu_pr_state, menu->items[menu->cur_item]->func);
if (G_INT (&menu_pr_state, OFS_RETURN))
return;
}
if (!menu || !menu->items)
return;