diff --git a/source/src/main.cpp b/source/src/main.cpp index b641e4b4..d1b1a57a 100644 --- a/source/src/main.cpp +++ b/source/src/main.cpp @@ -598,10 +598,10 @@ int main(int argc, char **argv) initlog("cfg"); extern void *scoremenu, *teammenu, *ctfmenu, *servmenu, *kickmenu, *banmenu, *forceteammenu, *giveadminmenu, *docmenu, *applymenu; - scoremenu = addmenu("score", "frags\tdeath\tratio\tpj\tping\tcn\tname", false, renderscores, false, true); - teammenu = addmenu("team score", "frags\tdeath\tratio\tpj\tping\tcn\tname", false, renderscores, false, true); - ctfmenu = addmenu("ctf score", "flags\tfrags\tdeath\tratio\tpj\tping\tcn\tname", false, renderscores, false, true); - servmenu = addmenu("server", "ping\tplr\tserver", true, refreshservers); + scoremenu = addmenu("score", "frags\tdeath\tratio\tpj\tping\tcn\tname", false, renderscores, NULL, false, true); + teammenu = addmenu("team score", "frags\tdeath\tratio\tpj\tping\tcn\tname", false, renderscores, NULL, false, true); + ctfmenu = addmenu("ctf score", "flags\tfrags\tdeath\tratio\tpj\tping\tcn\tname", false, renderscores, NULL, false, true); + servmenu = addmenu("server", "ping\tplr\tserver", true, refreshservers, serverskey); kickmenu = addmenu("kick player", NULL, true, refreshsopmenu); banmenu = addmenu("ban player", NULL, true, refreshsopmenu); forceteammenu = addmenu("force team", NULL, true, refreshsopmenu); diff --git a/source/src/menus.cpp b/source/src/menus.cpp index 11cfbdd4..f787435f 100644 --- a/source/src/menus.cpp +++ b/source/src/menus.cpp @@ -463,12 +463,12 @@ struct mitemcheckbox : mitem // console iface -void *addmenu(const char *name, const char *title, bool allowinput, void (__cdecl *refreshfunc)(void *, bool), bool hotkeys, bool forwardkeys) +void *addmenu(const char *name, const char *title, bool allowinput, void (__cdecl *refreshfunc)(void *, bool), bool (__cdecl *keyfunc)(void *, int, bool, int), bool hotkeys, bool forwardkeys) { name = newstring(name); gmenu &menu = menus[name]; menu.name = name; - menu.title = title ? newstring(title) : NULL; + menu.title = title; menu.header = menu.footer = NULL; menu.menusel = 0; menu.mdl = NULL; @@ -476,6 +476,7 @@ void *addmenu(const char *name, const char *title, bool allowinput, void (__cdec menu.inited = false; menu.hotkeys = hotkeys; menu.refreshfunc = refreshfunc; + menu.keyfunc = keyfunc; menu.initaction = NULL; menu.dirlist = NULL; menu.forwardkeys = forwardkeys; @@ -485,7 +486,7 @@ void *addmenu(const char *name, const char *title, bool allowinput, void (__cdec void newmenu(char *name, char *hotkeys, char *forwardkeys) { - addmenu(name, NULL, true, NULL, atoi(hotkeys) > 0, atoi(forwardkeys) > 0); + addmenu(name, NULL, true, NULL, NULL, atoi(hotkeys) > 0, atoi(forwardkeys) > 0); } void menureset(void *menu) @@ -500,6 +501,12 @@ void menumanual(void *menu, char *text, char *action, color *bgcolor, const char m.items.add(new mitemmanual(&m, text, action, NULL, bgcolor, desc)); } +void menutitle(void *menu, const char *title) +{ + gmenu &m = *(gmenu *)menu; + m.title = title; +} + void menuheader(void *menu, char *header, char *footer) { gmenu &m = *(gmenu *)menu; @@ -652,7 +659,9 @@ bool menukey(int code, bool isdown, int unicode, SDLMod mod) } default: { - if(!curmenu->allowinput || !curmenu->items.inrange(menusel)) return false; + if(!curmenu->allowinput) return false; + 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); return !curmenu->forwardkeys; diff --git a/source/src/protos.h b/source/src/protos.h index f58878e4..addec997 100644 --- a/source/src/protos.h +++ b/source/src/protos.h @@ -96,9 +96,10 @@ extern void rendermenu(); extern bool menuvisible(); extern void menureset(void *menu); extern void menumanual(void *menu, char *text, char *action = NULL, color *bgcolor = NULL, const char *desc = NULL); +extern void menutitle(void *menu, const char *title = NULL); extern void menuheader(void *menu, char *header = NULL, char *footer = NULL); extern bool menukey(int code, bool isdown, int unicode, SDLMod mod = KMOD_NONE); -extern void *addmenu(const char *name, const char *title = NULL, bool allowinput = true, void (__cdecl *refreshfunc)(void *, bool) = NULL, bool hotkeys = false, bool forwardkeys = false); +extern void *addmenu(const char *name, const char *title = NULL, bool allowinput = true, void (__cdecl *refreshfunc)(void *, bool) = NULL, bool (__cdecl *keyfunc)(void *, int, bool, int) = NULL, bool hotkeys = false, bool forwardkeys = false); extern void rendermenumdl(); extern void menuset(void *m, bool save = true); extern void menuselect(void *menu, int sel); @@ -147,6 +148,7 @@ struct gmenu int menusel; bool allowinput, inited, hotkeys, forwardkeys; void (__cdecl *refreshfunc)(void *, bool); + bool (__cdecl *keyfunc)(void *, int, bool, int); char *initaction; const char *mdl; @@ -157,7 +159,6 @@ struct gmenu virtual ~gmenu() { DELETEA(name); - DELETEA(title); DELETEA(mdl); DELETEP(dirlist); DELETEA(initaction); @@ -179,6 +180,7 @@ extern bool resolverwait(const char *name, ENetAddress *address); extern int connectwithtimeout(ENetSocket sock, const char *hostname, ENetAddress &remoteaddress); extern void writeservercfg(); extern void refreshservers(void *menu, bool init); +extern bool serverskey(void *menu, int code, bool isdown, int unicode); struct serverinfo { diff --git a/source/src/serverbrowser.cpp b/source/src/serverbrowser.cpp index 6c3841e7..e79be737 100644 --- a/source/src/serverbrowser.cpp +++ b/source/src/serverbrowser.cpp @@ -452,7 +452,8 @@ void checkpings() } } -VARP(serversort, 0, 0, 1); +#define NUMSERVSORT 2 +VARP(serversort, 0, 0, NUMSERVSORT-1); int sicompare(serverinfo **ap, serverinfo **bp) { @@ -502,6 +503,12 @@ void refreshservers(void *menu, bool init) servers.sort(sicompare); if(menu) { + static const char *title[NUMSERVSORT] = + { + "\fs\f0ping\fr\tplr\tserver", + "ping\t\fs\f0plr\fr\tserver" + }; + menutitle(menu, title[serversort]); menureset(menu); loopv(servers) { @@ -525,6 +532,22 @@ void refreshservers(void *menu, bool init) } } +bool serverskey(void *menu, int code, bool isdown, int unicode) +{ + if(!isdown) return false; + switch(code) + { + case SDLK_LEFT: + serversort = (serversort+NUMSERVSORT-1) % NUMSERVSORT; + return true; + + case SDLK_RIGHT: + serversort = (serversort+1) % NUMSERVSORT; + return true; + } + return false; +} + void clearservers() { resolverclear();