add option to grey out menu items

greyed out menu items are a) grey and b) can't be operated

  menuitemgreyedout 0|1

    menu items added after this command are greyed out (1) or not (0)

DOCREF menuitemgreyedout
This commit is contained in:
ac-stef
2017-07-09 11:30:29 +02:00
parent e29bb2aa2d
commit 59c3d1756d
4 changed files with 48 additions and 35 deletions
+3 -5
View File
@@ -1475,16 +1475,14 @@ newmenu "Deleted entities"
menuinit [
resetcurmenu
if (unlistdeletedentity) [
menuitemgreyedout (! $editing)
looplisti (getdeletedentities) [type x y z a1 a2 a3 a4 a5 a6 a7] [
push desc (concat $type (concatword "[" $x "|" $y "|" $z "]") (concatword "(" $a1 ", " $a2 ", " $a3 ", " $a4 ", " $a5 ", " $a6 ", " $a7 ")"))
if (strcmp $type mapmodel) [desc = (concat $desc (mapmodelslotname $a2))]
if (&& $editing (strcmp $type sound)) [desc = (concat $desc (at (editmapsoundslot $a1) 0))]
if $editing [
menuitem (pop desc) (concat gotoposition $x $y $z $a1 0 ";" undelent $i)
][
menuitem (pop desc) -1
]
menuitem (pop desc) (concat gotoposition $x $y $z $a1 0 ";" undelent $i)
]
menuitemgreyedout 0
menuitem "\f3clear this list" "unlistdeletedentity all"
] [
menuitem "no deleted entities" -1
+3 -5
View File
@@ -411,11 +411,9 @@ menuinit [
menuitemtextinput "Filter mouse (for bad ones):" "$mfilter" [ mfilter $arg1 ]
menuitem "" -1
menuitemradio "Sniper-scope sensitivity: " 0 1 "$autoscopesens" [manual automatic] [ autoscopesens $arg1 ; refreshcurmenu]
if $autoscopesens [
menuitem [@"\f4Sniper-scope sensitivity scale: \n\f4"@scopesensscale] -1
][
menuitemtextinput "Sniper-scope sensitivity scale: " "$scopesensscale" [ scopesensscale $arg1 ]
]
menuitemgreyedout (! $autoscopesens)
menuitemtextinput "Sniper-scope sensitivity scale: " "$scopesensscale" [ scopesensscale $arg1 ]
menuitemgreyedout 0
menuitem "" -1
menuitem "Customize crosshairs\i\3" [ showmenu [Customize crosshairs] ]
]
+39 -24
View File
@@ -107,7 +107,7 @@ void menuselect(void *menu, int sel)
if(sel!=oldsel)
{
if(m.items.inrange(oldsel)) m.items[oldsel]->focus(false);
m.items[sel]->focus(true);
if(!m.items[sel]->greyedout) m.items[sel]->focus(true);
audiomgr.playsound(S_MENUSELECT, SP_HIGHEST);
if(m.persistentselection)
{
@@ -186,6 +186,8 @@ color mitem::gray(0.2f, 0.2f, 0.2f);
color mitem::white(1.0f, 1.0f, 1.0f);
color mitem::whitepulse(1.0f, 1.0f, 1.0f);
bool mitem::menugreyedout = false;
// text item
struct mitemmanual : mitem
@@ -198,16 +200,17 @@ struct mitemmanual : mitem
virtual void render(int x, int y, int w)
{
int c = greyedout ? 128 : 255;
mitem::render(x, y, w);
const char *nl = strchr(text, '\n');
if(nl)
{
string l;
copystring(l, text, min(MAXSTRLEN, (int)strcspn(text, "\n") + 1));
draw_text(l, x, y);
draw_text(nl + 1, x + w - max(menurighttabwidth, text_width(nl + 1)), y);
draw_text(l, x, y, c, c, c);
draw_text(nl + 1, x + w - max(menurighttabwidth, text_width(nl + 1)), y, c, c, c);
}
else draw_text(text, x, y);
else draw_text(text, x, y, c, c, c);
}
virtual void focus(bool on)
@@ -270,13 +273,13 @@ struct mitemimagemanual : mitemmanual
mitem::render(x, y, w);
if(image || altfont)
{
int xs = 0;
int xs = 0, c = greyedout ? 128 : 255;
if(image)
{
xs = (FONTH*image->xs)/image->ys;
framedquadtexture(image->id, x, y, xs, FONTH, 0, 255, true);
}
draw_text(text, !image || *text == '\t' ? x : x+xs + FONTH/2, y);
draw_text(text, !image || *text == '\t' ? x : x+xs + FONTH/2, y, c, c, c);
if(altfont && strchr(text, '\a'))
{
char *r = newstring(text), *re, *l = r;
@@ -286,7 +289,7 @@ struct mitemimagemanual : mitemmanual
x += text_width(l);
l = re + 2;
pushfont(altfont->name);
draw_textf("%c", x, y, re[1]);
draw_textf("%s%c", x, y, greyedout ? "\f4" : "", re[1]);
popfont();
}
delete[] r;
@@ -342,8 +345,9 @@ struct mitemmapload : mitemmanual
virtual void render(int x, int y, int w)
{
int c = greyedout ? 128 : 255;
mitem::render(x, y, w);
draw_text(text, x, y);
draw_text(text, x, y, c, c, c);
if(isselection())
{
if(!image && !maptitle)
@@ -395,13 +399,14 @@ struct mitemtextinput : mitemtext
virtual void render(int x, int y, int w)
{
int c = greyedout ? 128 : 255;
bool sel = isselection();
if(sel)
{
renderbg(x+w-menurighttabwidth, y-FONTH/6, menurighttabwidth, menuselbgcolor);
renderbg(x, y-FONTH/6, w-menurighttabwidth-FONTH/2, menuseldescbgcolor);
}
draw_text(text, x, y);
draw_text(text, x, y, c, c, c);
int cibl = (int)strlen(input.buf); // current input-buffer length
int iboff = input.pos > 14 ? (input.pos < cibl ? input.pos - 14 : cibl - 14) : (input.pos == -1 ? (cibl > 14 ? cibl - 14 : 0) : 0); // input-buffer offset
string showinput, tempinputbuf; int sc = 14;
@@ -424,7 +429,7 @@ struct mitemtextinput : mitemtext
sc++;
}
copystring(showinput, tempinputbuf + iboff, sc + 1);
draw_text(showinput, x+w-menurighttabwidth, y, 255, 255, 255, 255, sel ? (input.pos>=0 ? (input.pos > sc ? sc : input.pos) : cibl) : -1);
draw_text(showinput, x+w-menurighttabwidth, y, c, c, c, 255, sel && !greyedout ? (input.pos>=0 ? (input.pos > sc ? sc : input.pos) : cibl) : -1);
}
virtual void focus(bool on)
@@ -529,14 +534,15 @@ struct mitemslider : mitem
renderbg(x, y, w - pos - FONTH/2, menuseldescbgcolor);
if(pos - ow > FONTH/2) renderbg(x + w - pos + ow + FONTH/2, y, pos - ow - FONTH/2, menuseldescbgcolor);
}
draw_text(text, x, y);
draw_text(curval, x + (isradio ? w - pos : tw), y);
int c = greyedout ? 128 : 255;
draw_text(text, x, y, c, c, c);
draw_text(curval, x + (isradio ? w - pos : tw), y, c, c, c);
if(!isradio)
{
blendbox(x+w-menurighttabwidth, y+FONTH/3, x+w, y+FONTH*2/3, false, -1, &gray);
int offset = (int)(cval/((float)range)*menurighttabwidth);
blendbox(x+w-menurighttabwidth+offset-FONTH/6, y, x+w-menurighttabwidth+offset+FONTH/6, y+FONTH, false, -1, sel ? &whitepulse : &white);
blendbox(x+w-menurighttabwidth+offset-FONTH/6, y, x+w-menurighttabwidth+offset+FONTH/6, y+FONTH, false, -1, greyedout ? &gray : (sel ? &whitepulse : &white));
}
}
@@ -633,15 +639,15 @@ struct mitemkeyinput : mitem
virtual void render(int x, int y, int w)
{
int tw = text_width(keyname ? keyname : " ");
int tw = text_width(keyname ? keyname : " "), c = greyedout ? 128 : 255;
static color capturec(0.4f, 0, 0);
if(isselection())
{
blendbox(x+w-tw-FONTH, y-FONTH/6, x+w+FONTH, y+FONTH+FONTH/6, false, -1, capture ? &capturec : NULL);
blendbox(x, y-FONTH/6, x+w-tw-FONTH, y+FONTH+FONTH/6, false, -1, menuseldescbgcolor);
}
draw_text(text, x, y);
draw_text(keyname, x+w-tw, y);
draw_text(text, x, y, c, c, c);
draw_text(keyname, x+w-tw, y, c, c, c);
}
virtual void init()
@@ -744,8 +750,9 @@ struct mitemcheckbox : mitem
bool sel = isselection();
const static int boxsize = FONTH;
int offs = ((menurighttabwidth - FONTH) * ((msctrl % 41) ? pos : (50 + 50 * sinf(totalmillis / 300.0f + y)))) / 100;
int c = greyedout ? 128 : 255;
draw_text(text, x, y);
draw_text(text, x, y, c, c, c);
if(sel)
{
renderbg(x, y, w-boxsize-offs-FONTH/2, menuseldescbgcolor);
@@ -754,11 +761,12 @@ struct mitemcheckbox : mitem
}
x -= offs;
blendbox(x+w-boxsize, y, x+w, y+boxsize, false, -1, &gray);
color *col = greyedout ? &gray : (sel ? &whitepulse : &white);
if(checked)
{
int x1 = x+w-boxsize-FONTH/6, x2 = x+w+FONTH/6, y1 = y-FONTH/6, y2 = y+boxsize+FONTH/6;
line(x1, y1, x2, y2, sel ? &whitepulse : &white);
line(x2, y1, x1, y2, sel ? &whitepulse : &white);
line(x1, y1, x2, y2, col);
line(x2, y1, x1, y2, col);
}
}
@@ -791,6 +799,7 @@ void *addmenu(const char *name, const char *title, bool allowinput, void (__cdec
m->allowblink = false;
m->forwardkeys = forwardkeys;
lastmenu = m;
mitem::menugreyedout = false;
return m;
}
@@ -910,6 +919,12 @@ void menuselection(char *menu, int *line)
}
COMMAND(menuselection, "si");
void menuitemgreyedout(int *onoff)
{
mitem::menugreyedout = *onoff != 0;
}
COMMAND(menuitemgreyedout, "i");
void menuitem(char *text, char *action, char *hoveraction, char *desc)
{
if(!lastmenu) return;
@@ -1079,7 +1094,7 @@ bool menukey(int code, bool isdown, int unicode, SDLMod mod)
if(!curmenu) return false;
int n = curmenu->items.length(), menusel = curmenu->menusel;
if(curmenu->items.inrange(menusel))
if(curmenu->items.inrange(menusel) && !curmenu->items[menusel]->greyedout)
{
mitem *m = curmenu->items[menusel];
if(m->mitemtype == mitem::TYPE_KEYINPUT && ((mitemkeyinput *)m)->capture)
@@ -1138,7 +1153,7 @@ bool menukey(int code, bool isdown, int unicode, SDLMod mod)
if(curmenu->allowinput && curmenu->hotkeys)
{
int idx = code-SDLK_1;
if(curmenu->items.inrange(idx))
if(curmenu->items.inrange(idx) && !curmenu->items[idx]->greyedout)
{
menuselect(curmenu, idx);
mitem &m = *curmenu->items[idx];
@@ -1152,7 +1167,7 @@ bool menukey(int code, bool isdown, int unicode, SDLMod mod)
if(curmenu->keyfunc && (*curmenu->keyfunc)(curmenu, code, isdown, unicode)) return true;
if(!curmenu->items.inrange(menusel)) return false;
mitem &m = *curmenu->items[menusel];
m.key(code, isdown, unicode);
if(!m.greyedout) m.key(code, isdown, unicode);
if(code == SDLK_HOME && m.mitemtype != mitem::TYPE_TEXTINPUT) menuselect(curmenu, (menusel = 0));
return !curmenu->forwardkeys;
}
@@ -1181,7 +1196,7 @@ bool menukey(int code, bool isdown, int unicode, SDLMod mod)
mitem &m = *curmenu->items[menusel];
if(code==SDLK_RETURN || code==SDLK_SPACE || code==SDL_AC_BUTTON_LEFT || code==SDL_AC_BUTTON_MIDDLE)
{
if(m.select() != -1) audiomgr.playsound(S_MENUENTER, SP_HIGHEST);
if(!m.greyedout && m.select() != -1) audiomgr.playsound(S_MENUENTER, SP_HIGHEST);
return true;
}
return false;
@@ -1255,7 +1270,7 @@ void gmenu::open()
lastmenu = oldlastmenu;
}
if(items.inrange(menuselinit)) { menusel = menuselinit; menuselinit = -1; }
if(items.inrange(menusel)) items[menusel]->focus(true);
if(items.inrange(menusel) && !items[menusel]->greyedout) items[menusel]->focus(true);
init();
resetcontext();
}
+3 -1
View File
@@ -185,8 +185,10 @@ struct mitem
{
struct gmenu *parent;
color *bgcolor;
bool greyedout;
static bool menugreyedout;
mitem(gmenu *parent, color *bgcolor, int type) : parent(parent), bgcolor(bgcolor), mitemtype(type) {}
mitem(gmenu *parent, color *bgcolor, int type) : parent(parent), bgcolor(bgcolor), greyedout(menugreyedout), mitemtype(type) {}
virtual ~mitem() {}
virtual void render(int x, int y, int w);