Skip to content

Commit 72abfe2

Browse files
committed
MENU: Enable using Keyboard or Gamepad for sliders
1 parent 7228827 commit 72abfe2

10 files changed

Lines changed: 97 additions & 15 deletions

File tree

source/menu/defs/menu_defs.qc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ enum {
6868
#define MENU_SND_BEEP 2
6969
void(float type) Menu_PlaySound;
7070

71+
void() Menu_LeftArrowPressed;
72+
void() Menu_RightArrowPressed;
73+
7174
#ifdef MENU
7275

7376
void() Menu_Main;

source/menu/m_menu.qc

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ vector MENU_TEXT_SMALL = '12 12 0';
1313
vector MENU_TEXT_MEDIUM = '14 14 0';
1414
vector MENU_TEXT_LARGE = '28 28 0';
1515

16+
float menu_leftarrow_pressed;
17+
float menu_rightarrow_pressed;
18+
1619
void() input_tester =
1720
{
1821
float char = 0;
@@ -561,11 +564,11 @@ void(vector pos, vector size, vector minmaxsteps, string cvar_s, string name, st
561564
};
562565

563566
//
564-
// Menu_CvarSlider(order, minmaxsteps, cvar_s, is_int, no_text, zero_is_one)
567+
// Menu_CvarSlider(order, button_id, minmaxsteps, cvar_s, is_int, no_text, zero_is_one)
565568
// Draws a Slider at the given order position
566569
// that controls a cvar.
567570
//
568-
void(float order, vector minmaxsteps, string cvar_s, float is_int, float no_text, float zero_is_one) Menu_CvarSlider =
571+
void(float order, string button_id, vector minmaxsteps, string cvar_s, float is_int, float no_text, float zero_is_one) Menu_CvarSlider =
569572
{
570573
float current = cvar(cvar_s);
571574
float old = current;
@@ -575,6 +578,24 @@ void(float order, vector minmaxsteps, string cvar_s, float is_int, float no_text
575578

576579
my_slider(strcat(cvar_s, "sldr"), [position_x, (position_y - 17) + size_y * 0.5], [size_x, size_y * 0.5], minmaxsteps, current);
577580

581+
// For keyboard/gamepad navigation -- we need to check if the button associated
582+
// with this slider is active and then do input checks to test if we should
583+
// adjust the related cvar.
584+
if (sui_is_hovered(button_id)) {
585+
float interval = ((minmaxsteps[1] - minmaxsteps[0]) / minmaxsteps[2]);
586+
if (menu_leftarrow_pressed) {
587+
current -= interval;
588+
} else if (menu_rightarrow_pressed) {
589+
current += interval;
590+
}
591+
592+
if (current < minmaxsteps[0])
593+
current = minmaxsteps[0];
594+
595+
if (current > minmaxsteps[1])
596+
current = minmaxsteps[1];
597+
}
598+
578599
if (current != old) {
579600
if (is_int)
580601
cvar_set(cvar_s, ftos(rint(current)));
@@ -881,6 +902,16 @@ void(float type) Menu_PlaySound =
881902
localsound(sound, 0, cvar("nzp_uivolume"));
882903
};
883904

905+
void() Menu_LeftArrowPressed =
906+
{
907+
menu_leftarrow_pressed = TRUE;
908+
};
909+
910+
void() Menu_RightArrowPressed =
911+
{
912+
menu_rightarrow_pressed = TRUE;
913+
};
914+
884915
float last_menu;
885916
void(vector size) root_menu =
886917
{
@@ -922,6 +953,9 @@ void(vector size) root_menu =
922953
default: break;
923954
}
924955

956+
menu_leftarrow_pressed = false;
957+
menu_rightarrow_pressed = false;
958+
925959
// Menu enter sound
926960
if (last_menu != current_menu) {
927961
Menu_PlaySound(MENU_SND_ENTER);

source/menu/menu_aces.qc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ void() Menu_Accessibility =
116116

117117
// Text Backdrop
118118
Menu_Button(2, "ac_text", "TEXT BACKDROP", "Opacity of backdrop for text elements on HUD.") ? 0 : 0;
119-
Menu_CvarSlider(2, [0, 1, 20], "cl_textopacity", false, false, false);
119+
Menu_CvarSlider(2, "ac_text", [0, 1, 20], "cl_textopacity", false, false, false);
120120

121121
// Accessible Colors
122122
Menu_Button(3, "ac_color", "ACCESSIBLE COLORS", "Uses enhanced Player colors to improve visibilty.") ? Menu_Accessibility_UpdateColorblindFilter() : 0;

source/menu/menu_audi.qc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,13 @@ void() Menu_Audio =
5353
Menu_DrawMapPanel();
5454

5555
Menu_Button(1, "am_maste", "MASTER VOLUME", "Volume for all Audio.") ? 0 : 0;
56-
Menu_CvarSlider(1, [0, 1, 10], "volume", false, true, false);
56+
Menu_CvarSlider(1, "am_maste", [0, 1, 10], "volume", false, true, false);
5757

5858
Menu_Button(2, "am_menu", "INTERFACE VOLUME", "Volume for UI/Menus.") ? 0 : 0;
59-
Menu_CvarSlider(2, [0, 1, 10], "nzp_uivolume", false, true, false);
59+
Menu_CvarSlider(2, "am_menu", [0, 1, 10], "nzp_uivolume", false, true, false);
6060

6161
Menu_Button(3, "am_bgm", "MUSIC VOLUME", "Volume for Background Music.") ? 0 : 0;
62-
Menu_CvarSlider(3, [0, 1, 10], "nzp_bgmvolume", false, true, false);
62+
Menu_CvarSlider(3, "am_bgm", [0, 1, 10], "nzp_bgmvolume", false, true, false);
6363

6464
Menu_DrawDivider(12.25);
6565
Menu_Button(-2, "am_apply", "APPLY", "Save & Apply Settings.") ? Menu_Audio_ApplySettings() : 0;

source/menu/menu_coop.qc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ void() Menu_Coop_Create =
218218

219219
// Max players
220220
Menu_Button(4, "ccm_maxplayers", "MAX PLAYERS", "Change the maximum number of players who can join your server.") ? 0 : 0;
221-
Menu_CvarSlider(4, [1, 8, 7], "maxplayers", true, false, false);
221+
Menu_CvarSlider(4, "ccm_maxplayers", [1, 8, 7], "maxplayers", true, false, false);
222222

223223
Menu_DrawDivider(5);
224224
Menu_Button(5.25, "ccm_choosemap", "CHOOSE MAP", "Select a Map to start the Game.") ? Menu_StartCoop() : 0;

source/menu/menu_ctrl.qc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ void() Menu_Control =
118118
Menu_DrawOptionValue(1, ads_string);
119119

120120
Menu_Button(2, "cm_sens", "SENSITIVITY", "Alter Look Sensitivity.") ? 0 : 0;
121-
Menu_CvarSlider(2, [1, 10, 10], "sensitivity", false, false, false);
121+
Menu_CvarSlider(2, "cm_sens", [1, 10, 10], "sensitivity", false, false, false);
122122

123123
Menu_Button(3, "cm_invs", "INVERT LOOK", "Invert Y-Axis Camera Input.") ? Menu_Control_InvertLook() : 0;
124124
string invert_string = "";

source/menu/menu_gpad.qc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,10 @@ void() Menu_Gamepad =
121121
Menu_DrawOptionValue(3, aa_string);
122122

123123
Menu_Button(4, "gp_senx", "X AXIS SENSITIVITY", "Alter X-Axis Look Sensitivity.") ? 0 : 0;
124-
Menu_CvarSlider(4, [0, 4, 16], "joypitchsensitivity", false, false, false);
124+
Menu_CvarSlider(4, "gp_senx", [0, 4, 16], "joypitchsensitivity", false, false, false);
125125

126126
Menu_Button(5, "gp_seny", "Y AXIS SENSITIVITY", "Alter Y-Axis Look Sensitivity.") ? 0 : 0;
127-
Menu_CvarSlider(5, [0, 4, 16], "joyyawsensitivity", false, false, false);
127+
Menu_CvarSlider(5, "gp_seny", [0, 4, 16], "joyyawsensitivity", false, false, false);
128128

129129
Menu_DrawDivider(12.25);
130130
Menu_Button(-2, "gp_apply", "APPLY", "Save & Apply Settings.") ? Menu_Gamepad_ApplySettings() : 0;

source/menu/menu_gset.qc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ void() Menu_GameSettings =
135135

136136
// Start Round
137137
Menu_Button(3, "ge_rond", "START ROUND", "Round to begin the Game on.") ? 0 : 0;
138-
Menu_CvarSlider(3, [0, 50, 10], "sv_startround", true, false, true);
138+
Menu_CvarSlider(3, "ge_rond", [0, 50, 10], "sv_startround", true, false, true);
139139

140140
// Magic
141141
string magic_string = "";
@@ -159,7 +159,7 @@ void() Menu_GameSettings =
159159

160160
// Horde Size
161161
Menu_Button(6, "ge_hord", "HORDE SIZE", "Maximum Zombies that can Active at once.") ? 0 : 0;
162-
Menu_CvarSlider(6, [2, 64, 31], "sv_maxai", true, false, false);
162+
Menu_CvarSlider(6, "ge_hord", [2, 64, 31], "sv_maxai", true, false, false);
163163

164164
// Fast Rounds
165165
string fast_string = "";

source/menu/menu_vide.qc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ void() Menu_Video =
246246
// Max FPS
247247
if (cvar("vid_vsync") == 0) {
248248
Menu_Button(4, "vm_maxps", "MAX FPS", "Configure Maximum FPS Value.") ? 0 : 0;
249-
Menu_CvarSlider(4, [10, 500, 490], "cl_maxfps", true, false, false);
249+
Menu_CvarSlider(4, "vm_maxps", [10, 500, 490], "cl_maxfps", true, false, false);
250250
} else {
251251
Menu_GreyButton(4, "[VSYNC ON] MAX FPS");
252252
}
@@ -260,11 +260,11 @@ void() Menu_Video =
260260

261261
// Field of View
262262
Menu_Button(6, "vm_fov", "FIELD OF VIEW", "Change Camera Field of View.") ? 0 : 0;
263-
Menu_CvarSlider(6, [10, 150, 140], "fov", true, false, false);
263+
Menu_CvarSlider(6, "vm_fov", [10, 150, 140], "fov", true, false, false);
264264

265265
// Gamma
266266
Menu_Button(7, "vm_gamma", "GAMMA", "Adjust game Black Level.") ? 0 : 0;
267-
Menu_CvarSlider(7, [0.3, 2, 17], "gamma", false, true, false);
267+
Menu_CvarSlider(7, "vm_gamma", [0.3, 2, 17], "gamma", false, true, false);
268268

269269
// Ultrawide Mode
270270
Menu_Button(8, "vm_uwide", "ULTRAWIDE MODE", "Condenses HUD closer to center of Display.") ? Menu_Video_UpdateUltrawide() : 0;

source/menu/sui_sys.qc

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,8 @@ void() sui_reset_frame =
180180
// solution but in this highly imperative world of QuakeC we can live with it
181181

182182
float _holding_click;
183+
float _holding_leftarrow;
184+
float _holding_rightarrow;
183185
vector _cursor_click;
184186
vector _cursor_position;
185187
vector _cursor_relative_click;
@@ -241,6 +243,8 @@ void() sui_reset_actions =
241243
_release_action_count = 0;
242244
_last_clicked_action_count = 0;
243245
_holding_click = FALSE;
246+
_holding_leftarrow = FALSE;
247+
_holding_rightarrow = FALSE;
244248
};
245249

246250
// Per frame reset?
@@ -389,6 +393,26 @@ void(vector pos) _sui_mouse_move =
389393
last_hovered_id = "";
390394
};
391395

396+
void() _sui_menukey_leftarrow =
397+
{
398+
if (_holding_leftarrow == FALSE)
399+
{
400+
// Send a signal for the button press
401+
Menu_LeftArrowPressed();
402+
}
403+
_holding_leftarrow = TRUE;
404+
}
405+
406+
void() _sui_menukey_rightarrow =
407+
{
408+
if (_holding_rightarrow == FALSE)
409+
{
410+
// Send a signal for the button press
411+
Menu_RightArrowPressed();
412+
}
413+
_holding_rightarrow = TRUE;
414+
}
415+
392416
void() _sui_menukey_downarrow =
393417
{
394418
string current_hovered_option = _hover_actions[0];
@@ -599,6 +623,8 @@ void() _sui_mouse1_up =
599623
_release_action_count = _hold_action_count;
600624
_hold_action_count = 0;
601625
_holding_click = FALSE;
626+
_holding_leftarrow = FALSE;
627+
_holding_rightarrow = FALSE;
602628
};
603629

604630
// HACK!
@@ -854,6 +880,16 @@ float(float evtype, float scanx, float chary, float devid) sui_input_event =
854880
_sui_menukey_enter();
855881
return TRUE;
856882
}
883+
else if (scanx == K_LEFTARROW || scanx == K_GP_DPAD_LEFT)
884+
{
885+
_sui_menukey_leftarrow();
886+
return TRUE;
887+
}
888+
else if (scanx == K_RIGHTARROW || scanx == K_GP_DPAD_RIGHT)
889+
{
890+
_sui_menukey_rightarrow();
891+
return TRUE;
892+
}
857893
else
858894
{
859895
if ((scanx == K_ESCAPE || scanx == K_BACKSPACE) && _sui_binding_command != "")
@@ -873,6 +909,15 @@ float(float evtype, float scanx, float chary, float devid) sui_input_event =
873909
_sui_mouse1_up();
874910
return TRUE;
875911
}
912+
else
913+
{
914+
_holding_leftarrow = FALSE;
915+
_holding_rightarrow = FALSE;
916+
917+
// Let the engine still handle it's own
918+
// input events on normal key releases.
919+
return FALSE;
920+
}
876921
default:
877922
return FALSE;
878923
}

0 commit comments

Comments
 (0)