void lobby_main::post_build(window& win) { /** @todo Should become a global hotkey after 1.8, then remove it here. */ win.register_hotkey(hotkey::HOTKEY_FULLSCREEN, std::bind(fullscreen, std::ref(win.video()))); /*** Local hotkeys. ***/ win.register_hotkey(hotkey::HOTKEY_PREFERENCES, [this](event::dispatcher& w, hotkey::HOTKEY_COMMAND)->bool { show_preferences_button_callback(dynamic_cast<window&>(w)); return true; }); }
void mp_staging::select_leader_callback(window& window, ng::side_engine_ptr side, grid& row_grid) { gui2::dialogs::faction_select dlg(side->flg(), std::to_string(side->color() + 1), side->index() + 1); dlg.show(window.video()); if(dlg.get_retval() == window::OK) { update_leader_display(side, row_grid); set_state_changed(); } }
/* * This function is used to test the tooltip placement algorithms as * described in the »Tooltip placement« section in the GUI2 design * document. * * Use a 1024 x 768 screen size, set the maximum loop iteration to: * - 0 to test with a normal tooltip placement. * - 30 to test with a larger normal tooltip placement. * - 60 to test with a huge tooltip placement. * - 150 to test with a borderline to insanely huge tooltip placement. * - 180 to test with an insanely huge tooltip placement. */ static void debug_tooltip(window& window, bool& handled, const point& coordinate) { std::string message = "Hello world."; for(int i = 0; i < 0; ++i) { message += " More greetings."; } gui2::tip::remove(); gui2::tip::show(window.video(), "tooltip", message, coordinate); handled = true; }
void campaign_selection::pre_show(window& window) { /***** Setup campaign tree. *****/ tree_view& tree = find_widget<tree_view>(&window, "campaign_tree", false); tree.set_selection_change_callback( std::bind(&campaign_selection::campaign_selected, this, std::ref(window))); window.keyboard_capture(&tree); /***** Setup campaign details. *****/ multi_page& pages = find_widget<multi_page>(&window, "campaign_details", false); unsigned id = 0; for(const auto & level : engine_.get_levels_by_type_unfiltered(ng::level::TYPE::SP_CAMPAIGN)) { const config& campaign = level->data(); /*** Add tree item ***/ std::map<std::string, string_map> data; string_map item; item["label"] = campaign["icon"]; data.emplace("icon", item); item["label"] = campaign["name"]; data.emplace("name", item); item["label"] = campaign["completed"].to_bool() ? "misc/laurel.png" : "misc/blank-hex.png"; data.emplace("victory", item); tree.add_node("campaign", data).set_id(std::to_string(id++)); /*** Add detail item ***/ item.clear(); data.clear(); item["label"] = campaign["description"]; item["use_markup"] = "true"; if(!campaign["description_alignment"].empty()) { item["text_alignment"] = campaign["description_alignment"]; } data.emplace("description", item); item["label"] = campaign["image"]; data.emplace("image", item); pages.add_page(data); } if(!engine_.get_const_extras_by_type(ng::create_engine::MOD).empty()) { std::map<std::string, string_map> data; string_map item; item["label"] = "Modifications"; data.emplace("tree_view_node_label", item); tree_view_node& mods_node = tree.add_node("campaign_group", data); std::vector<std::string> enabled = engine_.active_mods(); id = 0; for(const auto& mod : engine_.get_const_extras_by_type(ng::create_engine::MOD)) { data.clear(); item.clear(); bool active = std::find(enabled.begin(), enabled.end(), mod->id) != enabled.end(); /*** Add tree item ***/ item["label"] = mod->name; data.emplace("checkb", item); tree_view_node& node = mods_node.add_child("modification", data); toggle_button* checkbox = dynamic_cast<toggle_button*>(node.find("checkb", true)); VALIDATE(checkbox, missing_widget("checkb")); checkbox->set_value(active); checkbox->set_label(mod->name); checkbox->set_callback_state_change(std::bind(&campaign_selection::mod_toggled, this, id, _1)); ++id; } } campaign_selected(window); /***** Setup advanced settings button *****/ button* advanced_settings_button = find_widget<button>(&window, "advanced_settings", false, false); if(advanced_settings_button) { advanced_settings_button->connect_click_handler( std::bind(&campaign_selection::show_settings, this, std::ref(window.video()))); } }
void title_screen::pre_show(window& win) { win.set_click_dismiss(false); win.set_enter_disabled(true); win.set_escape_disabled(true); // Each time the dialog shows, we set this to false redraw_background_ = false; #ifdef DEBUG_TOOLTIP win.connect_signal<event::SDL_MOUSE_MOTION>( std::bind(debug_tooltip, std::ref(win), _3, _5), event::dispatcher::front_child); #endif win.connect_signal<event::SDL_VIDEO_RESIZE>(std::bind(&title_screen::on_resize, this, std::ref(win))); // // General hotkeys // win.register_hotkey(hotkey::TITLE_SCREEN__RELOAD_WML, [](event::dispatcher& w, hotkey::HOTKEY_COMMAND) { dynamic_cast<window&>(w).set_retval(RELOAD_GAME_DATA); return true; }); win.register_hotkey(hotkey::HOTKEY_FULLSCREEN, std::bind(fullscreen, std::ref(win.video()))); win.register_hotkey(hotkey::LUA_CONSOLE, std::bind(&launch_lua_console, std::ref(win))); // // Background and logo images // if(game_config::images::game_title.empty()) { ERR_CF << "No title image defined" << std::endl; } win.get_canvas()[0].set_variable("title_image", variant(game_config::images::game_title)); if(game_config::images::game_title_background.empty()) { ERR_CF << "No title background image defined" << std::endl; } win.get_canvas()[0].set_variable("background_image", variant(game_config::images::game_title_background)); find_widget<image>(&win, "logo-bg", false).set_image(game_config::images::game_logo_background); find_widget<image>(&win, "logo", false).set_image(game_config::images::game_logo); // // Version string // const std::string version_string = formatter() << ("Version") << " " << game_config::revision; if(label* version_label = find_widget<label>(&win, "revision_number", false, false)) { version_label->set_label(version_string); } win.get_canvas()[0].set_variable("revision_number", variant(version_string)); // // Tip-of-the-day browser // multi_page& tip_pages = find_widget<multi_page>(&win, "tips", false); std::vector<game_tip> tips(settings::get_tips()); if(tips.empty()) { WRN_CF << "There are no tips of day available." << std::endl; } for(const auto& tip : tips) { string_map widget; std::map<std::string, string_map> page; widget["use_markup"] = "true"; widget["label"] = tip.text(); page.emplace("tip", widget); widget["label"] = tip.source(); page.emplace("source", widget); tip_pages.add_page(page); } update_tip(win, true); register_button(win, "next_tip", hotkey::TITLE_SCREEN__NEXT_TIP, std::bind(&title_screen::update_tip, this, std::ref(win), true)); register_button(win, "previous_tip", hotkey::TITLE_SCREEN__PREVIOUS_TIP, std::bind(&title_screen::update_tip, this, std::ref(win), false)); // // Help // register_button(win, "help", hotkey::HOTKEY_HELP, [this](window&) { help::help_manager help_manager(&game_config_manager::get()->game_config()); help::show_help(game_.video()); }); // // About // register_button(win, "about", hotkey::HOTKEY_NULL, std::bind(&game_version::display, std::ref(win.video()))); // // Tutorial // register_button(win, "tutorial", hotkey::TITLE_SCREEN__TUTORIAL, [this](window& w) { game_.set_tutorial(); w.set_retval(LAUNCH_GAME); }); // // Campaign // register_button(win, "campaign", hotkey::TITLE_SCREEN__CAMPAIGN, [this](window& w) { try{ if(game_.new_campaign()) { w.set_retval(LAUNCH_GAME); } } catch (const config::error& e) { gui2::show_error_message(game_.video(), e.what()); } }); // // Multiplayer // register_button(win, "multiplayer", hotkey::TITLE_SCREEN__MULTIPLAYER, [this](window& w) { while(true) { gui2::dialogs::mp_method_selection dlg; dlg.show(game_.video()); if(dlg.get_retval() != gui2::window::OK) { return; } const int res = dlg.get_choice(); if(res == 2 && preferences::mp_server_warning_disabled() < 2) { if(!gui2::dialogs::mp_host_game_prompt::execute(game_.video())) { continue; } } switch(res) { case 0: game_.select_mp_server(preferences::server_list().front().address); w.set_retval(MP_CONNECT); break; case 1: game_.select_mp_server(""); w.set_retval(MP_CONNECT); break; case 2: game_.select_mp_server("localhost"); w.set_retval(MP_HOST); break; case 3: w.set_retval(MP_LOCAL); break; } return; } }); // // Load game // register_button(win, "load", hotkey::HOTKEY_LOAD_GAME, [this](window& w) { if(game_.load_game()) { w.set_retval(LAUNCH_GAME); } else { game_.clear_loaded_game(); } }); // // Addons // register_button(win, "addons", hotkey::TITLE_SCREEN__ADDONS, [this](window&) { // NOTE: we need the help_manager to get access to the Add-ons section in the game help! help::help_manager help_manager(&game_config_manager::get()->game_config()); if(manage_addons(game_.video())) { game_config_manager::get()->reload_changed_game_config(); } }); // // Editor // register_button(win, "editor", hotkey::TITLE_SCREEN__EDITOR, [&](window& w) { w.set_retval(MAP_EDITOR); }); // // Cores // register_button(win, "cores", hotkey::TITLE_SCREEN__CORES, [this](window&) { int current = 0; std::vector<config> cores; for(const config& core : game_config_manager::get()->game_config().child_range("core")) { cores.push_back(core); if(core["id"] == preferences::core_id()) { current = cores.size() - 1; } } gui2::dialogs::core_selection core_dlg(cores, current); if(core_dlg.show(game_.video())) { const std::string& core_id = cores[core_dlg.get_choice()]["id"]; preferences::set_core_id(core_id); game_config_manager::get()->reload_changed_game_config(); } }); if(game_config_manager::get()->game_config().child_range("core").size() <= 1) { find_widget<button>(&win, "cores", false).set_visible(window::visibility::invisible); } // // Language // register_button(win, "language", hotkey::HOTKEY_LANGUAGE, [this](window& w) { try { if(game_.change_language()) { t_string::reset_translations(); ::image::flush_cache(); on_resize(w); } } catch(std::runtime_error& e) { gui2::show_error_message(game_.video(), e.what()); } }); // // Preferences // register_button(win, "preferences", hotkey::HOTKEY_PREFERENCES, [this](window&) { game_.show_preferences(); }); // // Credits // register_button(win, "credits", hotkey::TITLE_SCREEN__CREDITS, [&](window& w) { w.set_retval(SHOW_ABOUT); }); // // Quit // register_button(win, "quit", hotkey::HOTKEY_QUIT_TO_DESKTOP, [&](window& w) { w.set_retval(QUIT_GAME); }); // // Debug clock // register_button(win, "clock", hotkey::HOTKEY_NULL, std::bind(&title_screen::show_debug_clock_window, this, std::ref(win.video()))); find_widget<button>(&win, "clock", false).set_visible(show_debug_clock_button ? widget::visibility::visible : widget::visibility::invisible); }
void unit_recall::show_help(window& window) { help::show_help(window.video(), "recruit_and_recall"); }
void unit_recall::dismiss_unit(window& window) { LOG_DP << "Recall list units:\n"; dump_recall_list_to_console(recall_list_); listbox& list = find_widget<listbox>(&window, "recall_list", false); const int index = list.get_selected_row(); const unit& u = *recall_list_[index].get(); // If the unit is of level > 1, or is close to advancing, we warn the player about it std::stringstream message; if(u.loyal()) { message << _("This unit is loyal and requires no upkeep.") << " " << (u.gender() == unit_race::MALE ? _("Do you really want to dismiss him?") : _("Do you really want to dismiss her?")); } else if(u.level() > 1) { message << _("This unit is an experienced one, having advanced levels.") << " " << (u.gender() == unit_race::MALE ? _("Do you really want to dismiss him?") : _("Do you really want to dismiss her?")); } else if(u.experience() > u.max_experience()/2) { message << _("This unit is close to advancing a level.") << " " << (u.gender() == unit_race::MALE ? _("Do you really want to dismiss him?") : _("Do you really want to dismiss her?")); } if(!message.str().empty()) { const int res = gui2::show_message(window.video(), _("Dismiss Unit"), message.str(), message::yes_no_buttons); if(res != gui2::window::OK) { return; } } recall_list_.erase(recall_list_.begin() + index); // Remove the entry from the dialog list list.remove_row(index); list_item_clicked(window); // Remove the entry from the filter list filter_options_.erase(filter_options_.begin() + index); assert(filter_options_.size() == list.get_item_count()); LOG_DP << "Dismissing a unit, side = " << u.side() << ", id = '" << u.id() << "'\n"; LOG_DP << "That side's recall list:\n"; dump_recall_list_to_console(team_.recall_list()); // Find the unit in the recall list. unit_ptr dismissed_unit = team_.recall_list().find_if_matches_id(u.id()); assert(dismissed_unit); // Record the dismissal, then delete the unit. synced_context::run_and_throw("disband", replay_helper::get_disband(dismissed_unit->id())); // Close the dialog if all units are dismissed if(list.get_item_count() == 0) { window.set_retval(window::CANCEL); } }