std::vector<config> command_executor::get_menu_images(display& disp, const std::vector<std::string>& items) { std::vector<config> result; for(size_t i = 0; i < items.size(); ++i) { std::string const& item = items[i]; const hotkey::HOTKEY_COMMAND hk = hotkey::get_id(item); result.emplace_back(); //see if this menu item has an associated image std::string img(get_menu_image(disp, item, i)); if (img.empty() == false) { result.back()["icon"] = img; } const theme::menu* menu = disp.get_theme().get_menu_item(item); if (hk == hotkey::HOTKEY_NULL) { if (menu) result.back()["label"] = menu->title(); else { std::string label(item.begin(), item.begin() + item.find_last_not_of(' ') + 1); // TODO: To away with the fugly markup, both '=' and 0x01 size_t i = label.find_first_of('='); if(i != std::string::npos) result.back()["label"] = label.substr(i + 1); else { i = label.find_first_of(1); if(i != std::string::npos) { result.back()["details"] = label.substr(i + 1); result.back()["image"] = label.substr(1, i - 1); } else { result.back()["label"] = label; } } } } else { if (menu) result.back()["label"] = menu->title(); else { std::string desc = hotkey::get_description(item); if (hk == HOTKEY_ENDTURN) { const theme::action *b = disp.get_theme().get_action_item("button-endturn"); if (b) { desc = b->title(); } } result.back()["label"] = desc; result.back()["details"] = hotkey::get_names(item); } } } return result; }
std::vector<std::string> command_executor::get_menu_images(display& disp, const std::vector<std::string>& items) { std::vector<std::string> result; bool has_image = false; for (size_t i = 0; i < items.size(); ++i) { std::string const& item = items[i]; const hotkey::HOTKEY_COMMAND hk = hotkey::get_id(item); std::stringstream str; //see if this menu item has an associated image std::string img(get_menu_image(disp, item, i)); if (img.empty() == false) { has_image = true; str << IMAGE_PREFIX << img << COLUMN_SEPARATOR; } const theme::menu* menu = disp.get_theme().get_menu_item(item); if (hk == hotkey::HOTKEY_NULL) { if (menu) str << menu->title(); else str << item.substr(0, item.find_last_not_of(' ') + 1) << COLUMN_SEPARATOR; } else { if (menu) str << menu->title(); else { std::string desc = hotkey::get_description(item); if (hk == HOTKEY_ENDTURN) { const theme::action *b = disp.get_theme().get_action_item("button-endturn"); if (b) { desc = b->title(); } } str << desc << COLUMN_SEPARATOR << hotkey::get_names(item); } } result.push_back(str.str()); } //If any of the menu items have an image, create an image column if (has_image) { for (std::vector<std::string>::iterator i = result.begin(); i != result.end(); ++i) { if (*(i->begin()) != IMAGE_PREFIX) { i->insert(i->begin(), COLUMN_SEPARATOR); } } } return result; }
void command_executor::show_menu(const std::vector<std::string>& items_arg, int xloc, int yloc, bool /*context_menu*/, display& gui) { std::vector<std::string> items = items_arg; if (items.empty()) return; std::vector<config> menu = get_menu_images(gui, items); int res = -1; { SDL_Rect pos = {xloc, yloc, 1, 1}; gui2::tdrop_down_list mmenu(pos, menu, -1, false); mmenu.show(gui.video()); if(mmenu.get_retval() == gui2::twindow::OK) { res = mmenu.selected_item(); } } // This will kill the dialog. if (res < 0 || size_t(res) >= items.size()) return; const theme::menu* submenu = gui.get_theme().get_menu_item(items[res]); if (submenu) { int y,x; SDL_GetMouseState(&x,&y); this->show_menu(submenu->items(), x, y, submenu->is_context(), gui); } else { const hotkey::hotkey_command& cmd = hotkey::get_hotkey_command(items[res]); hotkey::execute_command(cmd,this,res); set_button_state(); } }
std::string command_executor::get_menu_image(display& disp, const std::string& command, int index) const { const std::string base_image_name = "icons/action/" + command + "_25.png"; const std::string pressed_image_name = "icons/action/" + command + "_25-pressed.png"; const hotkey::HOTKEY_COMMAND hk = hotkey::get_id(command); const hotkey::ACTION_STATE state = get_action_state(hk, index); const theme::menu* menu = disp.get_theme().get_menu_item(command); if (menu) return "buttons/fold-arrow.png"; // TODO should not be hardcoded if (file_exists(game_config::path + "/images/" + base_image_name)) { switch (state) { case ACTION_ON: case ACTION_SELECTED: return pressed_image_name + "~CROP(3,3,18,18)"; default: return base_image_name + "~CROP(3,3,18,18)"; } } switch (get_action_state(hk, index)) { case ACTION_ON: return game_config::images::checked_menu; case ACTION_OFF: return game_config::images::unchecked_menu; case ACTION_SELECTED: return game_config::images::selected_menu; case ACTION_DESELECTED: return game_config::images::deselected_menu; default: return get_action_image(hk, index); } }
void command_executor::show_menu(const std::vector<std::string>& items_arg, int xloc, int yloc, bool /*context_menu*/, display& gui) { std::vector<std::string> items = items_arg; if (items.empty()) return; std::vector<std::string> menu = get_menu_images(gui, items); int res = 0; { gui::dialog mmenu = gui::dialog(gui,"","", gui::MESSAGE, gui::dialog::hotkeys_style); mmenu.set_menu(menu); res = mmenu.show(xloc, yloc); } // This will kill the dialog. if (res < 0 || size_t(res) >= items.size()) return; const theme::menu* submenu = gui.get_theme().get_menu_item(items[res]); if (submenu) { int y,x; SDL_GetMouseState(&x,&y); this->show_menu(submenu->items(), x, y, submenu->is_context(), gui); } else { const hotkey::hotkey_command& cmd = hotkey::get_hotkey_command(items[res]); hotkey::execute_command(gui,cmd,this,res); set_button_state(gui); } }
void command_executor::get_menu_images(display& disp, std::vector<config>& items) { for(size_t i = 0; i < items.size(); ++i) { config& item = items[i]; const std::string& item_id = item["id"]; const hotkey::HOTKEY_COMMAND hk = hotkey::get_id(item_id); //see if this menu item has an associated image std::string img(get_menu_image(disp, item_id, i)); if (img.empty() == false) { item["icon"] = img; } const theme::menu* menu = disp.get_theme().get_menu_item(item_id); if(menu) { item["label"] = menu->title(); } else if(hk != hotkey::HOTKEY_NULL) { std::string desc = hotkey::get_description(item_id); if(hk == HOTKEY_ENDTURN) { const theme::action *b = disp.get_theme().get_action_item("button-endturn"); if (b) { desc = b->title(); } } item["label"] = desc; item["details"] = hotkey::get_names(item_id); } else if(item["label"].empty()) { // If no matching hotkey was found and a custom label wasn't already set, treat // the id as a plaintext description. This is because either type of value can // be written to the id field by the WMI manager. The plaintext description is // used in the case the menu item specifies the relevant entry is *not* a hotkey. item["label"] = item_id; } } }
bool show_theme_dialog(display& disp) { int action = 0; std::vector<std::string> options = disp.get_theme().get_known_themes(); if(!options.empty()){ std::string current_theme=_("Saved Theme Preference: ")+preferences::theme(); action = gui::show_dialog(disp,NULL,"",current_theme,gui::OK_CANCEL,&options); if(action >= 0){ preferences::set_theme(options[action]); //it would be preferable for the new theme to take effect //immediately, however, this will have to do for now. gui2::show_transient_message(disp.video(),"",_("New theme will take effect on next new or loaded game.")); return(1); } }else{ gui2::show_transient_message(disp.video(),"",_("No known themes. Try changing from within an existing game.")); } return(0); }
std::string command_executor::get_menu_image(display& disp, const std::string& command, int index) const { // TODO: Find a way to do away with the fugly special markup if(command[0] == '&') { size_t n = command.find_first_of('='); if(n != std::string::npos) return command.substr(1, n - 1); } const std::string base_image_name = "icons/action/" + command + "_25.png"; const std::string pressed_image_name = "icons/action/" + command + "_25-pressed.png"; const hotkey::HOTKEY_COMMAND hk = hotkey::get_id(command); const hotkey::ACTION_STATE state = get_action_state(hk, index); const theme::menu* menu = disp.get_theme().get_menu_item(command); if (menu) { return "icons/arrows/short_arrow_right_25.png~CROP(3,3,18,18)"; // TODO should not be hardcoded } if (filesystem::file_exists(game_config::path + "/images/" + base_image_name)) { switch (state) { case ACTION_ON: case ACTION_SELECTED: return pressed_image_name + "~CROP(3,3,18,18)"; default: return base_image_name + "~CROP(3,3,18,18)"; } } switch (get_action_state(hk, index)) { case ACTION_ON: return game_config::images::checked_menu; case ACTION_OFF: return game_config::images::unchecked_menu; case ACTION_SELECTED: return game_config::images::selected_menu; case ACTION_DESELECTED: return game_config::images::deselected_menu; default: return get_action_image(hk, index); } }