From 989db7d5c850e9cce2ef0e43dc18ccbfbfc8e1f9 Mon Sep 17 00:00:00 2001 From: ac-stef Date: Tue, 9 Feb 2016 17:53:55 +0100 Subject: [PATCH] change behaviour of menuitemtextinput Now, if the last line of a menu is a text input item, pressing enter in that line will not only execute the assigned command, but also close the menu. With this, menus without the annoying "[OK]"-button can be created. Also: emptied text input fields don't magically fill up again, when you deselect them. DOCREF menuitemtextinput --- source/src/menus.cpp | 35 ++++++++++++++++++++++++----------- source/src/protos.h | 2 +- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/source/src/menus.cpp b/source/src/menus.cpp index 0a570609..20aa8a8f 100644 --- a/source/src/menus.cpp +++ b/source/src/menus.cpp @@ -247,14 +247,15 @@ struct mitemmanual : mitem if(on && hoveraction) execute(hoveraction); } - virtual void select() + virtual int select() { + int result = 0; if(action && action[0]) { gmenu *oldmenu = curmenu; push("arg1", text); setcontext("menu", curmenu->name); - int result = execute(action); + result = execute(action); resetcontext(); pop("arg1"); if(result >= 0 && oldmenu == curmenu) @@ -263,6 +264,7 @@ struct mitemmanual : mitem menustack.shrink(0); } } + return result; } virtual const char *getdesc() { return desc; } virtual const char *gettext() { return text; } @@ -515,8 +517,7 @@ struct mitemtextinput : mitemtext if(on && hoveraction) execute(hoveraction); SDL_EnableUNICODE(on); - if(!strlen(input.buf)) setdefaultvalue(); - if(action && !on && modified) + if(action && !on && modified && parent->items.find(this) != parent->items.length() - 1) { modified = false; push("arg1", input.buf); @@ -536,7 +537,18 @@ struct mitemtextinput : mitemtext modified = false; } - virtual void select() { } + virtual int select() + { + int result = 0; + if(parent->menusel == parent->items.length() - 1) + { + const char *tmp = text; + text = input.buf; + result = mitemmanual::select(); + text = tmp; + } + return result; + } void setdefaultvalue() { @@ -693,10 +705,11 @@ struct mitemkeyinput : mitem capture = false; } - virtual void select() + virtual int select() { capture = true; keyname = empty; + return 0; } virtual void key(int code, bool isdown, int unicode) @@ -736,15 +749,17 @@ struct mitemcheckbox : mitem virtual int width() { return text_width(text) + FONTH + FONTH/3; } - virtual void select() + virtual int select() { + int result = 0; checked = !checked; if(action && action[0]) { push("arg1", checked ? "1" : "0"); - execute(action); + result = execute(action); pop("arg1"); } + return result; } virtual void init() @@ -1190,9 +1205,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) { - m.select(); - if(m.getaction()!=NULL && !strcmp(m.getaction(), "-1")) return true; // don't playsound S_MENUENTER if menuitem action == -1 (null/blank/text only item) - Bukz 2013feb13 - audiomgr.playsound(S_MENUENTER, SP_HIGHEST); + if(m.select() != -1) audiomgr.playsound(S_MENUENTER, SP_HIGHEST); return true; } return false; diff --git a/source/src/protos.h b/source/src/protos.h index 7973f7b9..123fb8b7 100644 --- a/source/src/protos.h +++ b/source/src/protos.h @@ -190,7 +190,7 @@ struct mitem virtual void render(int x, int y, int w); virtual int width() = 0; - virtual void select() {} + virtual int select() { return 0; } virtual void focus(bool on) { } virtual void key(int code, bool isdown, int unicode) { } virtual void init() {}