diff options
author | Andrey Nazarov <skuller@skuller.net> | 2013-09-23 20:55:52 +0400 |
---|---|---|
committer | Andrey Nazarov <skuller@skuller.net> | 2013-09-23 20:55:52 +0400 |
commit | e92842f3743f77665c868f7835684555751b8553 (patch) | |
tree | bb2cfcafe3ce454bfdcb165d83742b9dd804619c | |
parent | 264186e258a3ec0930b6e8e48bfb6732a7ed973d (diff) |
Don't reset out-of-range cvars when using menus.
Display out-of-range values as ‘???’ and preserve custom settings upon
closing menu.
Also fix ‘toggle’ control with boolean cvars: properly save negated values.
Change menu script to use boolean toggles instead of bitmasks where
appropriate.
-rw-r--r-- | src/client/ui/menu.c | 70 | ||||
-rw-r--r-- | src/client/ui/q2pro.menu | 2 | ||||
-rw-r--r-- | src/client/ui/ui.h | 1 |
3 files changed, 56 insertions, 17 deletions
diff --git a/src/client/ui/menu.c b/src/client/ui/menu.c index 642bbaf..6ddd315 100644 --- a/src/client/ui/menu.c +++ b/src/client/ui/menu.c @@ -498,17 +498,16 @@ static void SpinControl_Push(menuSpinControl_t *s) { int val = s->cvar->integer; - if (val > s->numItems - 1) - val = s->numItems - 1; - if (val < 0) - val = 0; - - s->curvalue = val; + if (val < 0 || val >= s->numItems) + s->curvalue = -1; + else + s->curvalue = val; } static void SpinControl_Pop(menuSpinControl_t *s) { - Cvar_SetInteger(s->cvar, s->curvalue, FROM_MENU); + if (s->curvalue >= 0 && s->curvalue < s->numItems) + Cvar_SetInteger(s->cvar, s->curvalue, FROM_MENU); } static void SpinControl_Free(menuSpinControl_t *s) @@ -567,6 +566,9 @@ SpinControl_DoEnter */ static int SpinControl_DoEnter(menuSpinControl_t *s) { + if (!s->numItems) + return QMS_BEEP; + s->curvalue++; if (s->curvalue >= s->numItems) @@ -586,6 +588,9 @@ SpinControl_DoSlide */ static int SpinControl_DoSlide(menuSpinControl_t *s, int dir) { + if (!s->numItems) + return QMS_BEEP; + s->curvalue += dir; if (s->curvalue < 0) { @@ -608,6 +613,8 @@ SpinControl_Draw */ static void SpinControl_Draw(menuSpinControl_t *s) { + char *name; + UI_DrawString(s->generic.x + LCOLUMN_OFFSET, s->generic.y, s->generic.uiFlags | UI_RIGHT | UI_ALTCOLOR, s->generic.name); @@ -618,8 +625,13 @@ static void SpinControl_Draw(menuSpinControl_t *s) } } + if (s->curvalue < 0 || s->curvalue >= s->numItems) + name = "???"; + else + name = s->itemnames[s->curvalue]; + UI_DrawString(s->generic.x + RCOLUMN_OFFSET, s->generic.y, - s->generic.uiFlags, s->itemnames[s->curvalue]); + s->generic.uiFlags, name); } /* @@ -673,14 +685,17 @@ static void Pairs_Push(menuSpinControl_t *s) for (i = 0; i < s->numItems; i++) { if (!Q_stricmp(s->itemvalues[i], s->cvar->string)) { s->curvalue = i; - break; + return; } } + + s->curvalue = -1; } static void Pairs_Pop(menuSpinControl_t *s) { - Cvar_SetByVar(s->cvar, s->itemvalues[s->curvalue], FROM_MENU); + if (s->curvalue >= 0 && s->curvalue < s->numItems) + Cvar_SetByVar(s->cvar, s->itemvalues[s->curvalue], FROM_MENU); } static void Pairs_Free(menuSpinControl_t *s) @@ -713,14 +728,17 @@ static void Strings_Push(menuSpinControl_t *s) for (i = 0; i < s->numItems; i++) { if (!Q_stricmp(s->itemnames[i], s->cvar->string)) { s->curvalue = i; - break; + return; } } + + s->curvalue = -1; } static void Strings_Pop(menuSpinControl_t *s) { - Cvar_SetByVar(s->cvar, s->itemnames[s->curvalue], FROM_MENU); + if (s->curvalue >= 0 && s->curvalue < s->numItems) + Cvar_SetByVar(s->cvar, s->itemnames[s->curvalue], FROM_MENU); } /* @@ -733,7 +751,18 @@ TOGGLE CONTROL static void Toggle_Push(menuSpinControl_t *s) { - s->curvalue = (s->cvar->integer ? 1 : 0) ^ s->negate; + int val = s->cvar->integer; + + if (val == 0 || val == 1) + s->curvalue = val ^ s->negate; + else + s->curvalue = -1; +} + +static void Toggle_Pop(menuSpinControl_t *s) +{ + if (s->curvalue == 0 || s->curvalue == 1) + Cvar_SetInteger(s->cvar, s->curvalue ^ s->negate, FROM_MENU); } /* @@ -1466,14 +1495,17 @@ static menuSound_t Slider_DoSlide(menuSlider_t *s, int dir); static void Slider_Push(menuSlider_t *s) { + s->modified = qfalse; s->curvalue = s->cvar->value; cclamp(s->curvalue, s->minvalue, s->maxvalue); } static void Slider_Pop(menuSlider_t *s) { - cclamp(s->curvalue, s->minvalue, s->maxvalue); - Cvar_SetValue(s->cvar, s->curvalue, FROM_MENU); + if (s->modified) { + cclamp(s->curvalue, s->minvalue, s->maxvalue); + Cvar_SetValue(s->cvar, s->curvalue, FROM_MENU); + } } static void Slider_Free(menuSlider_t *s) @@ -1549,6 +1581,7 @@ static menuSound_t Slider_MouseMove(menuSlider_t *s) value = pos * (s->maxvalue - s->minvalue); steps = Q_rint(value / s->step); + s->modified = qtrue; s->curvalue = s->minvalue + steps * s->step; return QMS_SILENT; } @@ -1557,9 +1590,11 @@ static menuSound_t Slider_Key(menuSlider_t *s, int key) { switch (key) { case K_END: + s->modified = qtrue; s->curvalue = s->maxvalue; return QMS_MOVE; case K_HOME: + s->modified = qtrue; s->curvalue = s->minvalue; return QMS_MOVE; case K_MOUSE1: @@ -1577,6 +1612,7 @@ Slider_DoSlide */ static menuSound_t Slider_DoSlide(menuSlider_t *s, int dir) { + s->modified = qtrue; s->curvalue += dir * s->step; cclamp(s->curvalue, s->minvalue, s->maxvalue); @@ -2461,9 +2497,11 @@ void Menu_Pop(menuFrameWork_t *menu) Strings_Pop(item); break; case MTYPE_SPINCONTROL: - case MTYPE_TOGGLE: SpinControl_Pop(item); break; + case MTYPE_TOGGLE: + Toggle_Pop(item); + break; case MTYPE_KEYBIND: Keybind_Pop(item); break; diff --git a/src/client/ui/q2pro.menu b/src/client/ui/q2pro.menu index 2cedd9c..9296250 100644 --- a/src/client/ui/q2pro.menu +++ b/src/client/ui/q2pro.menu @@ -121,7 +121,7 @@ begin effects title "Effects Setup" values "dynamic lighting" gl_dynamic "no" "yes" "only switchable" values "entity cel-shading" gl_celshading no 1x 2x 3x - toggle "entity glowing" cl_noglow ~0 + toggle "entity glowing" cl_noglow ~ toggle "ground shadows" gl_shadows toggle "screen blending" gl_polyblend toggle "grenade explosions" cl_disable_explosions ~0 diff --git a/src/client/ui/ui.h b/src/client/ui/ui.h index 7c1df9c..71e2f5b 100644 --- a/src/client/ui/ui.h +++ b/src/client/ui/ui.h @@ -158,6 +158,7 @@ typedef struct menuField_s { typedef struct menuSlider_s { menuCommon_t generic; cvar_t *cvar; + qboolean modified; float minvalue; float maxvalue; |