void play_controller::hotkey_handler::show_menu(const std::vector<std::string>& items_arg, int xloc, int yloc, bool context_menu, display& disp) { if (context_menu) { last_context_menu_x_ = xloc; last_context_menu_y_ = yloc; } std::vector<std::string> items = items_arg; const hotkey::hotkey_command* cmd; std::vector<std::string>::iterator i = items.begin(); while(i != items.end()) { if (*i == "AUTOSAVES") { // Autosave visibility is similar to LOAD_GAME hotkey cmd = &hotkey::hotkey_command::get_command_by_command(hotkey::HOTKEY_LOAD_GAME); } else { cmd = &hotkey::get_hotkey_command(*i); } // Remove WML commands if they would not be allowed here if(*i == "wml") { if(!context_menu || !viewing_team_is_playing() || events::commands_disabled || !viewing_team().is_local_human() || (linger() && !game_config::debug)){ i = items.erase(i); continue; } // Remove commands that can't be executed or don't belong in this type of menu } else if(!can_execute_command(*cmd) || (context_menu && !in_context_menu(cmd->id))) { i = items.erase(i); continue; } ++i; } // Add special non-hotkey items to the menu and remember their indices expand_autosaves(items); expand_wml_commands(items); if(items.empty()) return; command_executor::show_menu(items, xloc, yloc, context_menu, disp); }
bool playsingle_controller::hotkey_handler::can_execute_command(const hotkey::hotkey_command& cmd, int index) const { hotkey::HOTKEY_COMMAND command = cmd.id; bool res = true; switch (command){ case hotkey::HOTKEY_WML: { int prefixlen = wml_menu_hotkey_prefix.length(); if(cmd.command.compare(0, prefixlen, wml_menu_hotkey_prefix) != 0) { return false; } game_events::wmi_container::const_iterator it = gamestate().get_wml_menu_items().find(cmd.command.substr(prefixlen)); if(it == gamestate().get_wml_menu_items().end()) { return false; } return !(**it).is_synced() || play_controller_.can_use_synced_wml_menu(); } case hotkey::HOTKEY_UNIT_HOLD_POSITION: case hotkey::HOTKEY_END_UNIT_TURN: return !browse() && !linger() && !events::commands_disabled; case hotkey::HOTKEY_RECRUIT: case hotkey::HOTKEY_REPEAT_RECRUIT: case hotkey::HOTKEY_RECALL: return (!browse() || whiteboard_manager_->is_active()) && !linger() && !events::commands_disabled; case hotkey::HOTKEY_ENDTURN: return (!browse() || linger()) && !events::commands_disabled; case hotkey::HOTKEY_DELAY_SHROUD: return !linger() && (viewing_team().uses_fog() || viewing_team().uses_shroud()) && viewing_team_is_playing() && viewing_team().is_local_human() && !events::commands_disabled; case hotkey::HOTKEY_UPDATE_SHROUD: return !linger() && viewing_team_is_playing() && viewing_team().is_local_human() && !events::commands_disabled && viewing_team().auto_shroud_updates() == false; // Commands we can only do if in debug mode case hotkey::HOTKEY_CREATE_UNIT: case hotkey::HOTKEY_CHANGE_SIDE: case hotkey::HOTKEY_KILL_UNIT: return !events::commands_disabled && game_config::debug && play_controller_.get_map_const().on_board(mouse_handler_.get_last_hex()); case hotkey::HOTKEY_CLEAR_LABELS: res = !is_observer(); break; case hotkey::HOTKEY_LABEL_TEAM_TERRAIN: case hotkey::HOTKEY_LABEL_TERRAIN: { const terrain_label *label = gui()->labels().get_label(mouse_handler_.get_last_hex()); res = !events::commands_disabled && play_controller_.get_map_const().on_board(mouse_handler_.get_last_hex()) && !gui()->shrouded(mouse_handler_.get_last_hex()) && !is_observer() && (!label || !label->immutable()); break; } case hotkey::HOTKEY_CONTINUE_MOVE: { if(browse() || events::commands_disabled) return false; if( (menu_handler_.current_unit().valid()) && (menu_handler_.current_unit()->move_interrupted())) return true; const unit_map::const_iterator i = play_controller_.get_units_const().find(mouse_handler_.get_selected_hex()); if (!i.valid()) return false; return i->move_interrupted(); } case hotkey::HOTKEY_WB_TOGGLE: return !is_observer(); case hotkey::HOTKEY_WB_EXECUTE_ACTION: case hotkey::HOTKEY_WB_EXECUTE_ALL_ACTIONS: return whiteboard_manager_->can_enable_execution_hotkeys(); case hotkey::HOTKEY_WB_DELETE_ACTION: return whiteboard_manager_->can_enable_modifier_hotkeys(); case hotkey::HOTKEY_WB_BUMP_UP_ACTION: case hotkey::HOTKEY_WB_BUMP_DOWN_ACTION: return whiteboard_manager_->can_enable_reorder_hotkeys(); case hotkey::HOTKEY_WB_SUPPOSE_DEAD: { //@todo re-enable this once we figure out a decent UI for suppose_dead return false; } default: return play_controller::hotkey_handler::can_execute_command(cmd, index); } return res; }