From 60afec244512c09f6b8dd3d3d21c6007d51b465f Mon Sep 17 00:00:00 2001 From: Spoike Date: Sat, 4 Aug 2018 15:09:18 +0000 Subject: [PATCH] Menusys changes: Added autorun setting. Fixed greying of options that are not supported by the engine. Fixed keyboard navigation for general widgets (special menus might still be annoying). git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5285 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- quakec/menusys/menu/options.qc | 2 +- quakec/menusys/menu/options_audio.qc | 52 +++++----- quakec/menusys/menu/options_basic.qc | 36 +++++-- quakec/menusys/menu/options_effects.qc | 12 +-- quakec/menusys/menusys/mitem_checkbox.qc | 9 ++ quakec/menusys/menusys/mitem_colours.qc | 37 ++++++- quakec/menusys/menusys/mitem_combo.qc | 21 +++- quakec/menusys/menusys/mitem_edittext.qc | 9 ++ quakec/menusys/menusys/mitem_exmenu.qc | 4 +- quakec/menusys/menusys/mitem_frame.qc | 126 ++++++++++++++++++----- quakec/menusys/menusys/mitem_menu.qc | 4 +- quakec/menusys/menusys/mitem_slider.qc | 9 ++ quakec/menusys/menusys/mitem_tabs.qc | 4 +- quakec/menusys/menusys/mitems.qc | 5 - 14 files changed, 248 insertions(+), 82 deletions(-) diff --git a/quakec/menusys/menu/options.qc b/quakec/menusys/menu/options.qc index 4b93318b..b5a46b7d 100644 --- a/quakec/menusys/menu/options.qc +++ b/quakec/menusys/menu/options.qc @@ -50,7 +50,7 @@ nonstatic void(mitem_desktop desktop) M_Options = {fr.add(spawn(mitem_text, item_text:"Save Settings", item_command:"cfg_save", item_scale:16, item_flags:IF_CENTERALIGN), fl, [0, pos], [0, 16]); pos += 16;} if (assumefalsecheckcommand("cvarreset")) {fr.add(spawn(mitem_text, item_text:"Reset to Defaults", item_command:"m_reset", item_scale:16, item_flags:IF_CENTERALIGN), fl, [0, pos], [0, 16]); pos += 16;} - + //random art for style #if 1//def CSQC m.addm(spawn (mitem_spinnymodel, item_text: "progs/suit.mdl"), [0, 12*-16/2], [160, 12*16/2]); diff --git a/quakec/menusys/menu/options_audio.qc b/quakec/menusys/menu/options_audio.qc index 087416b4..cfd7dcee 100644 --- a/quakec/menusys/menu/options_audio.qc +++ b/quakec/menusys/menu/options_audio.qc @@ -44,33 +44,31 @@ nonstatic void(mitem_desktop desktop) M_Options_Audio = //ambient fade fr.add(menuitemcheck_spawn(_("Static Sounds"), "cl_staticsounds", '280 8'), fl, [0, pos], [0, 8]); pos += 8; fr.add(menuitemcheck_spawn(_("Mix in Background"),"s_inactive", '280 8'), fl, [0, pos], [0, 8]); pos += 8; - if (assumefalsecheckcommand("+voip")) - { - pos += 8; - fr.add(menuitemcombo_spawn(_("Microphone Device"), "cl_voip_capturedevice", '280 8', cvar_string("_cl_voip_capturedevice_opts")), - fl, [0, pos], [0, 8]); pos += 8; - fr.add(menuitemslider_spawn(_("VOIP Playback Vol"),"cl_voip_play", '0 2 0.1', '280 8'), fl, [0, pos], [0, 8]); pos += 8; - fr.add(menuitemcheck_spawn(_("VOIP Test"), "cl_voip_test", '280 8'), fl, [0, pos], [0, 8]); pos += 8; - fr.add(menuitemslider_spawn(_("VOIP Record Vol"), "cl_voip_micamp", '0 4 0.1', '280 8'), fl, [0, pos], [0, 8]); pos += 8; - fr.add(menuitemcombo_spawn(_("VOIP Mode"), "cl_voip_send", '280 8', _( - "0 \"Push-To-Talk\" 1 " - "\"Voice Activation\" " - "2 \"Continuous\"" - )), fl, [0, pos], [0, 8]); pos += 8; - //VAD threshhold - //ducking - //noise cancelation - fr.add(menuitemcombo_spawn(_("VOIP Codec"), "cl_voip_codec", '280 8',_( - "0 \"speex (narrow 11khz)\" " - //"1 \"raw (wasteful)\" " - "2 \"opus\" " - "3 \"speex (narrow 8khz)\" " - "4 \"speex (wide 16khz)\" " - "5 \"speex (ultrawide 32khz)\" " - )), fl, [0, pos], [0, 8]); pos += 8; - - fr.add(menuitemslider_spawn(_("Opus bitrate"), "cl_voip_bitrate", '0.5 128 0.5','280 8'), fl, [0, pos], [0, 8]); pos += 8; - } + + pos += 8; + fr.add(menuitemcombo_spawn(_("Microphone Device"), "cl_voip_capturedevice", '280 8', cvar_string("_cl_voip_capturedevice_opts")), + fl, [0, pos], [0, 8]); pos += 8; + fr.add(menuitemslider_spawn(_("VOIP Playback Vol"),"cl_voip_play", '0 2 0.1', '280 8'), fl, [0, pos], [0, 8]); pos += 8; + fr.add(menuitemcheck_spawn(_("VOIP Test"), "cl_voip_test", '280 8'), fl, [0, pos], [0, 8]); pos += 8; + fr.add(menuitemslider_spawn(_("VOIP Record Vol"), "cl_voip_micamp", '0 4 0.1', '280 8'), fl, [0, pos], [0, 8]); pos += 8; + fr.add(menuitemcombo_spawn(_("VOIP Mode"), "cl_voip_send", '280 8', _( + "0 \"Push-To-Talk\" 1 " + "\"Voice Activation\" " + "2 \"Continuous\"" + )), fl, [0, pos], [0, 8]); pos += 8; + //VAD threshhold + //ducking + //noise cancelation + fr.add(menuitemcombo_spawn(_("VOIP Codec"), "cl_voip_codec", '280 8',_( + "0 \"speex (narrow 11khz)\" " + //"1 \"raw (wasteful)\" " + "2 \"opus\" " + "3 \"speex (narrow 8khz)\" " + "4 \"speex (wide 16khz)\" " + "5 \"speex (ultrawide 32khz)\" " + )), fl, [0, pos], [0, 8]); pos += 8; + + fr.add(menuitemslider_spawn(_("Opus bitrate"), "cl_voip_bitrate", '0.5 128 0.5','280 8'), fl, [0, pos], [0, 8]); pos += 8; addmenuback(m); }; \ No newline at end of file diff --git a/quakec/menusys/menu/options_basic.qc b/quakec/menusys/menu/options_basic.qc index d4e4db64..da3e50c1 100644 --- a/quakec/menusys/menu/options_basic.qc +++ b/quakec/menusys/menu/options_basic.qc @@ -1,7 +1,6 @@ - class mitem_playerpreview : mitem_spinnymodel { -#if defined(FTE_QC_CUSTOMSKINS) +#if 1//defined(FTE_QC_CUSTOMSKINS) virtual void(vector pos) item_draw = { //if you wanted to get more advanced, you could use q3 skins here. @@ -39,12 +38,16 @@ class options_basic : mitem_exmenu { if (key == "m_pitchsign") return TRUE; + if (key == "cl_run") + return TRUE; return super::isvalid(key); }; virtual string(string key) get = { if (key == "m_pitchsign") return (autocvar_m_pitch<0)?"1":"0"; + if (key == "cl_run") + return (stof(super::get("cl_forwardspeed")) > 200)?"1":"0"; return super::get(key); }; virtual void(string key, string newval) set = @@ -59,6 +62,27 @@ class options_basic : mitem_exmenu if (invert) cvar_set("m_pitch", ftos(-autocvar_m_pitch)); } + else if (key == "cl_run") + { + float setbackspeed = (super::get("cl_backspeed") != ""); + if (stof(newval)) + { + super::set("cl_forwardspeed", "400"); + super::set("cl_sidespeed", "400"); + if (setbackspeed) + super::set("cl_backspeed", "400"); + super::set("cl_movespeedkey", "0.5"); //makes +speed act like +walk + } + else + { + //these are the defaults from winquake. + super::set("cl_forwardspeed", "200"); + super::set("cl_sidespeed", "350"); + if (setbackspeed) + super::set("cl_backspeed", "200"); + super::set("cl_movespeedkey", "2.0"); + } + } else super::set(key, newval); }; @@ -87,14 +111,14 @@ nonstatic void(mitem_desktop desktop) M_Options_Basic = fr.add(menuitemcombo_spawn(_("Player Skin"), "skin", '280 8', skinopts()), fl, [0, pos], [0, 8]); pos += 8; - if (assumefalsecheckcommand("topcolor")) - fr.add(menuitemcolour_spawn(_("Upper Colour"), "topcolor", '280 8'), fl, [0, pos], [0, 8]); pos += 8; - if (assumefalsecheckcommand("bottomcolor")) - fr.add(menuitemcolour_spawn(_("Lower Colour"), "bottomcolor", '280 8'), fl, [0, pos], [0, 8]); pos += 8; /*aka: arse colour*/ + fr.add(menuitemcolour_spawn(_("Upper Colour"), "topcolor", '280 8'), fl, [0, pos], [0, 8]); pos += 8; + fr.add(menuitemcolour_spawn(_("Lower Colour"), "bottomcolor", '280 8'), fl, [0, pos], [0, 8]); pos += 8; /*aka: arse colour*/ pos += 8; + fr.add(menuitemcheck_spawn (_("Always Run"), "cl_run", '280 8'), fl, [0, pos], [0, 8]); pos += 8; fr.add(menuitemcheck_spawn (_("Invert Mouse"), "m_pitchsign", '280 8'), fl, [0, pos], [0, 8]); pos += 8; fr.add(menuitemslider_spawn(_("Sensitivity"), "sensitivity", '3 20 1', '280 8'), fl, [0, pos], [0, 8]); pos += 8; fr.add(menuitemslider_spawn(_("Fov"), "fov", '80 130 5', '280 8'), fl, [0, pos], [0, 8]); pos += 8; + fr.add(menuitemslider_spawn(_("Viewmodel Fov"), "r_viewmodel_fov", '80 130 5', '280 8'), fl, [0, pos], [0, 8]); pos += 8; fr.add(menuitemslider_spawn(_("Gamma"), dp("v_gamma", "gamma"), '0.4 1.3 0.1', '280 8'), fl, [0, pos], [0, 8]); pos += 8; fr.add(menuitemslider_spawn(_("Contrast"), dp("v_contrast", "contrast"), '0.8 1.8 0.1', '280 8'), fl, [0, pos], [0, 8]); pos += 8; fr.add(menuitemslider_spawn(_("Brightness"), dp("v_brightness", "brightness"),'0.0 0.5 0.1', '280 8'), fl, [0, pos], [0, 8]); pos += 8; diff --git a/quakec/menusys/menu/options_effects.qc b/quakec/menusys/menu/options_effects.qc index d0dbcf93..22e115e5 100644 --- a/quakec/menusys/menu/options_effects.qc +++ b/quakec/menusys/menu/options_effects.qc @@ -18,10 +18,8 @@ nonstatic void(mitem_desktop desktop) M_Options_Effects = fr.add(menuitemcheck_spawn(_("Show Framerate"), dp("showfps", "show_fps"), '280 8'), fl, [0, pos], [0, 8]); pos += 8; fr.add(menuitemcheck_spawn(_("Bloom"), "r_bloom", '280 8'), fl, [0, pos], [0, 8]); pos += 8; - if (assumefalsecheckcommand("r_drawflat")) - fr.add(menuitemcheck_spawn(_("Simple Textures"), "r_drawflat", '280 8'), fl, [0, pos], [0, 8]); pos += 8; - if (assumefalsecheckcommand("r_softwarebanding")) - fr.add(menuitemcheck_spawn(_("Colourmapped Rendering"), "r_softwarebanding", '280 8'), fl, [0, pos], [0, 8]); pos += 8; + fr.add(menuitemcheck_spawn(_("Simple Textures"), "r_drawflat", '280 8'), fl, [0, pos], [0, 8]); pos += 8; + fr.add(menuitemcheck_spawn(_("Paletted Rendering"), "r_softwarebanding", '280 8'), fl, [0, pos], [0, 8]); pos += 8; fr.add(menuitemcheck_spawn(_("HDR"), "r_hdr_irisadaptation", '280 8'), fl, [0, pos], [0, 8]); pos += 8; fr.add(menuitemcheck_spawn(_("Coronas"), "r_coronas", '280 8'), fl, [0, pos], [0, 8]); pos += 8; fr.add(menuitemcheck_spawn(_("High Res Textures"), "gl_load24bit", '280 8'), fl, [0, pos], [0, 8]); pos += 8; @@ -37,8 +35,7 @@ nonstatic void(mitem_desktop desktop) M_Options_Effects = "2 \"Ripples\" " "3 \"Reflections\" " )), fl, [0, pos], [0, 8]); pos += 8; - if (assumefalsecheckcommand("r_projection")) - fr.add(menuitemcombo_spawn(_("View Projection"), "r_projection", '280 8', _( + fr.add(menuitemcombo_spawn(_("View Projection"), "r_projection", '280 8', _( "0 \"Standard\" " "1 \"Stereographic / Pannini\" " "2 \"Fish-Eye\" " @@ -46,8 +43,7 @@ nonstatic void(mitem_desktop desktop) M_Options_Effects = "4 \"Lambert Azimuthal Equal-Area\" " "5 \"Equirectangular\" " )), fl, [0, pos], [0, 8]); pos += 8; - if (assumefalsecheckcommand("ffov")) - fr.add(menuitemcombo_spawn(_("View Projection Angle"), "ffov", '280 8', _( + fr.add(menuitemcombo_spawn(_("View Projection Fov"), "ffov", '280 8', _( "90 \"Normal\" " "180 \"180 degrees\" " "270 \"270 degrees\" " diff --git a/quakec/menusys/menusys/mitem_checkbox.qc b/quakec/menusys/menusys/mitem_checkbox.qc index 2d589668..b6ebd129 100644 --- a/quakec/menusys/menusys/mitem_checkbox.qc +++ b/quakec/menusys/menusys/mitem_checkbox.qc @@ -51,6 +51,15 @@ class mitem_check : mitem if (isvalid(item_command)) item_flags |= IF_SELECTABLE; }; + + virtual void() item_resized = + { + if (isvalid(item_command)) + item_flags |= IF_SELECTABLE; + else + item_flags &= ~IF_SELECTABLE; + super::item_resized(); + }; }; //optional, can spawn direcly diff --git a/quakec/menusys/menusys/mitem_colours.qc b/quakec/menusys/menusys/mitem_colours.qc index 2d5a5856..1588baba 100644 --- a/quakec/menusys/menusys/mitem_colours.qc +++ b/quakec/menusys/menusys/mitem_colours.qc @@ -8,6 +8,15 @@ class mitem_colours : mitem { virtual void(vector pos) item_draw; virtual float(vector pos, float scan, float char, float down) item_keypress; + + virtual void() item_resized = + { + if (isvalid(item_command)) + item_flags |= IF_SELECTABLE; + else + item_flags &= ~IF_SELECTABLE; + super::item_resized(); + }; }; //http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c @@ -93,7 +102,31 @@ static vector(string v) hextorgb = return r; } else - return '0 0 0'; + { + float legacycolour = stof(v); + switch(legacycolour) + { + case 0: return [0xeb, 0xeb, 0xeb]/255; + case 1: return [0x8f, 0x6f, 0x23]/255; + case 2: return [0x8b, 0x8b, 0xcb]/255; + case 3: return [0x6b, 0x6b, 0x0f]/255; + case 4: return [0x7f, 0x00, 0x00]/255; + case 5: return [0xaf, 0x67, 0x23]/255; + case 6: return [0xff, 0xf3, 0x1b]/255; + case 7: return [0xe3, 0xb3, 0x97]/255; + + case 8: return [0xab, 0x8b, 0xa3]/255; + case 9: return [0xbb, 0x73, 0x97]/255; + case 10: return [0xdb, 0xc3, 0xbb]/255; + case 11: return [0x6f, 0x83, 0x7b]/255; + case 12: return [0xff, 0xf3, 0x1b]/255; + case 13: return [0x00, 0x00, 0xff]/255; + //14+15 are fullbrights, so not valid. + + default: + return '0 0 0'; + } + } }; static string(vector v) rgbtohex = { @@ -136,6 +169,8 @@ void(vector pos) mitem_colours::item_draw = for (step = 0; step < STEPS; step += 1, pos_x += stride) { rgb = hsvtorgb([step/STEPS, 1, 1]); + if (!(item_flags & IF_SELECTABLE)) + rgb *= 0.2; ui.drawfill(pos, [stride, item_size_y-2], rgb, item_alpha, 0); } #else diff --git a/quakec/menusys/menusys/mitem_combo.qc b/quakec/menusys/menusys/mitem_combo.qc index bd4a878f..23f419bd 100644 --- a/quakec/menusys/menusys/mitem_combo.qc +++ b/quakec/menusys/menusys/mitem_combo.qc @@ -23,6 +23,15 @@ class mitem_combo : mitem float visrows; virtual void() item_remove; + + virtual void() item_resized = + { + if (isvalid(item_command)) + item_flags |= IF_SELECTABLE; + else + item_flags &= ~IF_SELECTABLE; + super::item_resized(); + }; }; class mitem_combo_popup : mitem @@ -222,8 +231,14 @@ float(vector pos, float scan, float char, float down) mitem_combo::item_keypress i = 0; curval = argv(i); } - else if (scan == K_MOUSE1) + else if (scan == K_MOUSE1 || scan == K_ENTER) { + if (scan == K_ENTER && cfriend) + { + cfriend.item_remove(); + return TRUE; + } + visrows = ((c>18)?18/2:c/2); if (!cfriend) { @@ -245,7 +260,7 @@ float(vector pos, float scan, float char, float down) mitem_combo::item_keypress cfriend.item_flags |= IF_SELECTABLE; cfriend.totop(); - if (cfriend.item_flags & IF_MFOCUSED) + if (scan == K_MOUSE1 && (cfriend.item_flags & IF_MFOCUSED)) { //if they clicked inside the popup, change the selected item. f = ui.mousepos[1] - (pos_y + item_size_y); @@ -258,6 +273,8 @@ float(vector pos, float scan, float char, float down) mitem_combo::item_keypress cfriend.item_flags &~= IF_SELECTABLE; cfriend.item_size = cfriend.maxs = '0 0'; item_parent.item_focuschange(this, IF_MFOCUSED|IF_KFOCUSED); + + cfriend.item_remove(); } } } diff --git a/quakec/menusys/menusys/mitem_edittext.qc b/quakec/menusys/menusys/mitem_edittext.qc index 5a24c215..825065a5 100644 --- a/quakec/menusys/menusys/mitem_edittext.qc +++ b/quakec/menusys/menusys/mitem_edittext.qc @@ -8,6 +8,15 @@ class mitem_edit : mitem virtual float(vector pos, float scan, float char, float down) item_keypress; virtual void() item_remove; float spos; + + virtual void() item_resized = + { + if (isvalid(item_command)) + item_flags |= IF_SELECTABLE; + else + item_flags &= ~IF_SELECTABLE; + super::item_resized(); + }; }; void() mitem_edit::item_remove = diff --git a/quakec/menusys/menusys/mitem_exmenu.qc b/quakec/menusys/menusys/mitem_exmenu.qc index 58bac556..7dbd8f46 100644 --- a/quakec/menusys/menusys/mitem_exmenu.qc +++ b/quakec/menusys/menusys/mitem_exmenu.qc @@ -24,9 +24,9 @@ class mitem_exmenu : mitem_frame item_remove(); } else if (scan == K_UPARROW && down) - this.item_focuschange(menu_nextitem(this, item_kactivechild?item_kactivechild:item_mactivechild), IF_KFOCUSED); + menu_selectnextitem(this, TRUE); else if (scan == K_DOWNARROW && down) - this.item_focuschange(menu_previousitem(this, item_kactivechild?item_kactivechild:item_mactivechild), IF_KFOCUSED); + menu_selectnextitem(this, FALSE); else if (scan >= K_F1 && scan <= K_F12) //allow f1-f12 to work, but every other button event gets canceled. ret = FALSE; } diff --git a/quakec/menusys/menusys/mitem_frame.qc b/quakec/menusys/menusys/mitem_frame.qc index f4a1b3b1..9a119766 100644 --- a/quakec/menusys/menusys/mitem_frame.qc +++ b/quakec/menusys/menusys/mitem_frame.qc @@ -356,43 +356,117 @@ void() mitem_vslider::mitem_vslider = item_size[1] = 128; }; - -mitem(mitem_frame menu, mitem item) menu_previousitem = +//does NOT wrap. +//does NOT pass go. +static mitem(mitem item, float upwards) menu_simplenextitem = { - if (!item) - item = menu.item_children; - local mitem stop = item; - local mitem prev; - if (!stop) - return stop; - while(1) + mitem_frame menu = item.item_parent; + mitem prev; + if (upwards) + { + if (item) + { + item = item.item_next; + if (!item) + return __NULL__; + return item; + } + else + return __NULL__; + } + else { for(prev = menu.item_children; prev.item_next; prev = prev.item_next) { if (prev.item_next == item) - break; + return prev; } - if (prev == stop || (prev.item_flags & IF_SELECTABLE)) - return prev; - item = prev; + return __NULL__; } }; -mitem(mitem_frame menu, mitem item) menu_nextitem = -{ - if (!item) - item = menu.item_children; - local mitem stop = item; - if (!stop) - return stop; - while(1) - { - item = item.item_next; - if (!item) - item = menu.item_children; - if (item == stop || (item.item_flags & IF_SELECTABLE)) +//finds the next/prev item through multiple children, returning NULL when it runs out of items in the sequence. +//call this with item==null to find the first item in the sequence (to handle wraps). +static mitem(mitem_frame menu, float upwards, mitem item) menu_findnextitem = +{ + mitem_frame frame; + mitem citem; + + if (item && (item.item_flags & IF_ISFRAME)) + { + frame = (mitem_frame)item; + citem = menu_findnextitem(frame, upwards, frame.item_kactivechild?frame.item_kactivechild:frame.item_mactivechild); + if (citem) + return citem; + } + + for(;;) + { + if (!item) + { //we go for the opposite end here, as we assume to be starting/unfocused + item = menu.item_children; + if (!upwards && item) + { + while(item.item_next) + item = item.item_next; + } + } + else + item = menu_simplenextitem(item, upwards); + + if (!item) + { //we reached the end of the list, let the parent frame try its next + return __NULL__; + } + + if (item.item_flags & IF_ISFRAME) + { //if the next item is a frame, try and select its first element instead + frame = (mitem_frame)item; + citem = menu_findnextitem(frame, upwards, __NULL__); + if (citem) + return citem; + } + + if (item.item_flags & IF_INVISIBLE) + continue; + if (item.item_flags & IF_SELECTABLE) return item; } + +}; +static void(mitem item) menu_deselectitem = +{ + if (!item) + return; + if (item && (item.item_flags & IF_ISFRAME)) + { + mitem_frame frame = (mitem_frame)item; + if (frame.item_kactivechild) + menu_deselectitem(frame.item_kactivechild); + } + item.item_focuschange(__NULL__, IF_KFOCUSED); //deselect the previous one +}; +static void(mitem item) menu_selectitem = +{ + if (!item) + return; + mitem_frame menu = item.item_parent; + if (menu) + { + if (menu.item_kactivechild != item) + menu_deselectitem(menu.item_kactivechild); + menu_selectitem(menu); + menu.item_focuschange(item, IF_KFOCUSED); //focus on the new + } +}; +void(mitem_frame rootmenu, float upwards) menu_selectnextitem = +{ + mitem item = menu_findnextitem(rootmenu, upwards, rootmenu.item_kactivechild?rootmenu.item_kactivechild:rootmenu.item_mactivechild); + if (!item) + item = menu_findnextitem(rootmenu, upwards, __NULL__); + + menu_selectitem(item); + item.item_focuschange(item, IF_KFOCUSED); //focus on the new }; float(vector pos, float scan, float char, float down) mitem_frame::item_keypress = diff --git a/quakec/menusys/menusys/mitem_menu.qc b/quakec/menusys/menusys/mitem_menu.qc index ad133b29..ab7f261f 100644 --- a/quakec/menusys/menusys/mitem_menu.qc +++ b/quakec/menusys/menusys/mitem_menu.qc @@ -197,9 +197,9 @@ float(vector pos, float scan, float char, float down) mitem_menu::item_keypress } } else if (scan == K_UPARROW && down) - this.item_focuschange(menu_nextitem(this, item_kactivechild?item_kactivechild:item_mactivechild), IF_KFOCUSED); + menu_selectnextitem(this, TRUE); else if (scan == K_DOWNARROW && down) - this.item_focuschange(menu_previousitem(this, item_kactivechild?item_kactivechild:item_mactivechild), IF_KFOCUSED); + menu_selectnextitem(this, FALSE); else if (scan == K_MOUSE2 && down && !(this.item_flags & IF_NOKILL)) { //unhandled right click closes menus, if we're allowed localcmd(strcat(item_command, "\n")); //console command to exec if someone clicks the close button. diff --git a/quakec/menusys/menusys/mitem_slider.qc b/quakec/menusys/menusys/mitem_slider.qc index 38f48fb8..c671df85 100644 --- a/quakec/menusys/menusys/mitem_slider.qc +++ b/quakec/menusys/menusys/mitem_slider.qc @@ -8,6 +8,15 @@ class mitem_hslider : mitem virtual float(vector pos, float scan, float char, float down) item_keypress; vector item_slidercontrols; //min, max, step + + virtual void() item_resized = + { + if (isvalid(item_command)) + item_flags |= IF_SELECTABLE; + else + item_flags &= ~IF_SELECTABLE; + super::item_resized(); + }; }; void(vector pos) mitem_hslider::item_draw = { diff --git a/quakec/menusys/menusys/mitem_tabs.qc b/quakec/menusys/menusys/mitem_tabs.qc index c3fbabd3..47ef7e66 100644 --- a/quakec/menusys/menusys/mitem_tabs.qc +++ b/quakec/menusys/menusys/mitem_tabs.qc @@ -21,9 +21,9 @@ class mitem_tab : mitem_frame virtual float(vector pos, float scan, float char, float down) item_keypress = { if (scan == K_UPARROW && down) - this.item_focuschange(menu_nextitem(this, item_kactivechild?item_kactivechild:item_mactivechild), IF_KFOCUSED); + menu_selectnextitem(this, TRUE); else if (scan == K_DOWNARROW && down) - this.item_focuschange(menu_previousitem(this, item_kactivechild?item_kactivechild:item_mactivechild), IF_KFOCUSED); + menu_selectnextitem(this, FALSE); else if (super::item_keypress(pos, scan, char, down)) return TRUE; else diff --git a/quakec/menusys/menusys/mitems.qc b/quakec/menusys/menusys/mitems.qc index f71f68b7..782b580f 100644 --- a/quakec/menusys/menusys/mitems.qc +++ b/quakec/menusys/menusys/mitems.qc @@ -103,11 +103,6 @@ class mitem mitem_frame item_parent; //the item that contains us. make mitem_frame? mitem item_next; //the next child within the parent - -#ifdef MENU -// vector mins; //gravity mins -// vector maxs; //gravity mins -#endif float resizeflags;