| 1137 | } |
| 1138 | |
| 1139 | bool menukey(int code, bool isdown, SDL_Keymod mod) |
| 1140 | { |
| 1141 | if(!curmenu) return false; |
| 1142 | int n = curmenu->items.length(), menusel = curmenu->menusel; |
| 1143 | |
| 1144 | if(curmenu->items.inrange(menusel) && !curmenu->items[menusel]->greyedout) |
| 1145 | { |
| 1146 | mitem *m = curmenu->items[menusel]; |
| 1147 | if(m->mitemtype == mitem::TYPE_KEYINPUT && ((mitemkeyinput *)m)->capture) |
| 1148 | { |
| 1149 | m->key(code, isdown); |
| 1150 | return true; |
| 1151 | } |
| 1152 | } |
| 1153 | |
| 1154 | if(isdown) |
| 1155 | { |
| 1156 | int pagesize = MAXMENU - curmenu->headeritems(); |
| 1157 | |
| 1158 | switch(code) |
| 1159 | { |
| 1160 | case SDLK_PAGEUP: menusel -= pagesize; break; |
| 1161 | case SDLK_PAGEDOWN: |
| 1162 | if(menusel+pagesize>=n && menusel/pagesize!=(n-1)/pagesize) menusel = n-1; |
| 1163 | else menusel += pagesize; |
| 1164 | break; |
| 1165 | case SDLK_ESCAPE: |
| 1166 | case SDL_AC_BUTTON_RIGHT: |
| 1167 | if(!curmenu->allowinput) return false; |
| 1168 | menuset(menustack.empty() ? NULL : menustack.pop(), false); |
| 1169 | return true; |
| 1170 | break; |
| 1171 | case SDLK_UP: |
| 1172 | case SDL_AC_BUTTON_WHEELUP: |
| 1173 | if(iskeypressed(SDL_SCANCODE_LCTRL)) return menukey(SDLK_LEFT); |
| 1174 | if(iskeypressed(SDL_SCANCODE_LALT)) return menukey(SDLK_RIGHTBRACKET); |
| 1175 | if(!curmenu->allowinput) return false; |
| 1176 | menusel = movemenuselection(menusel, -1); |
| 1177 | break; |
| 1178 | case SDLK_DOWN: |
| 1179 | case SDL_AC_BUTTON_WHEELDOWN: |
| 1180 | if(iskeypressed(SDL_SCANCODE_LCTRL)) return menukey(SDLK_RIGHT); |
| 1181 | if(iskeypressed(SDL_SCANCODE_LALT)) return menukey(SDLK_LEFTBRACKET); |
| 1182 | if(!curmenu->allowinput) return false; |
| 1183 | menusel = movemenuselection(menusel, 1); |
| 1184 | break; |
| 1185 | case SDLK_TAB: |
| 1186 | if(!curmenu->allowinput) return false; |
| 1187 | if(mod & KMOD_LSHIFT) menusel = movemenuselection(menusel, -1); |
| 1188 | else menusel = movemenuselection(menusel, 1); |
| 1189 | break; |
| 1190 | |
| 1191 | case SDLK_1: |
| 1192 | case SDLK_2: |
| 1193 | case SDLK_3: |
| 1194 | case SDLK_4: |
| 1195 | case SDLK_5: |
| 1196 | case SDLK_6: |
no test coverage detected