void tmp_method_selection::pre_show(CVideo& /*video*/, twindow& window) { user_name_ = preferences::login(); ttext_box* user_widget = find_widget<ttext_box>( &window, "user_name", false, true); user_widget->set_value(user_name_); user_widget->set_maximum_length(mp::max_login_size); window.keyboard_capture(user_widget); tlistbox* list = find_widget<tlistbox>(&window, "method_list", false, true); window.add_to_keyboard_chain(list); }
/** * @todo This function enables the wml markup for all items, but the interface * is a bit hacky. Especially the fiddling in the internals of the listbox is * ugly. There needs to be a clean interface to set whether a widget has a * markup and what kind of markup. These fixes will be post 1.6. */ void twml_message_::pre_show(CVideo& /*video*/, twindow& window) { window.canvas(1).set_variable("portrait_image", variant(portrait_)); window.canvas(1).set_variable("portrait_mirror", variant(mirror_)); // Set the markup tlabel& title = find_widget<tlabel>(&window, "title", false); title.set_label(title_); title.set_use_markup(true); title.set_can_wrap(true); tcontrol& message = find_widget<tcontrol>(&window, "message", false); message.set_label(message_); message.set_use_markup(true); // The message label might not always be a scroll_label but the capturing // shouldn't hurt. window.keyboard_capture(&message); // Find the input box related fields. tlabel& caption = find_widget<tlabel>(&window, "input_caption", false); ttext_box& input = find_widget<ttext_box>(&window, "input", true); if(has_input_) { caption.set_label(input_caption_); caption.set_use_markup(true); input.set_value(*input_text_); input.set_maximum_length(input_maximum_length_); window.keyboard_capture(&input); window.set_click_dismiss(false); window.set_escape_disabled(true); } else { caption.set_visible(twidget::tvisible::invisible); input.set_visible(twidget::tvisible::invisible); } // Find the option list related fields. tlistbox& options = find_widget<tlistbox>(&window, "input_list", true); if(!option_list_.empty()) { std::map<std::string, string_map> data; for(size_t i = 0; i < option_list_.size(); ++i) { /** * @todo This syntax looks like a bad hack, it would be nice to write * a new syntax which doesn't use those hacks (also avoids the problem * with special meanings for certain characters. */ tlegacy_menu_item item(option_list_[i]); if(item.is_default()) { // Number of items hasn't been increased yet so i is ok. *chosen_option_ = i; } // Add the data. data["icon"]["label"] = item.icon(); data["label"]["label"] = item.label(); data["label"]["use_markup"] = "true"; data["description"]["label"] = item.description(); data["description"]["use_markup"] = "true"; options.add_row(data); } // Avoid negative and 0 since item 0 is already selected. if(*chosen_option_ > 0 && static_cast<size_t>(*chosen_option_) < option_list_.size()) { options.select_row(*chosen_option_); } if(!has_input_) { window.keyboard_capture(&options); window.set_click_dismiss(false); window.set_escape_disabled(true); } else { window.add_to_keyboard_chain(&options); // click_dismiss has been disabled due to the input. } } else { options.set_visible(twidget::tvisible::invisible); } window.set_click_dismiss(!has_input_ && option_list_.empty()); }
void tunit_create::pre_show(twindow& window) { ttoggle_button& male_toggle = find_widget<ttoggle_button>(&window, "male_toggle", false); ttoggle_button& female_toggle = find_widget<ttoggle_button>(&window, "female_toggle", false); gender_toggle.add_member(&male_toggle, unit_race::MALE); gender_toggle.add_member(&female_toggle, unit_race::FEMALE); gender_toggle.set_member_states(last_gender); gender_toggle.set_callback_on_value_change( dialog_callback<tunit_create, &tunit_create::gender_toggle_callback>); tlistbox& list = find_widget<tlistbox>(&window, "unit_type_list", false); ttext_box* filter = find_widget<ttext_box>(&window, "filter_box", false, true); filter->set_text_changed_callback( std::bind(&tunit_create::filter_text_changed, this, _1, _2)); window.keyboard_capture(filter); window.add_to_keyboard_chain(&list); #ifdef GUI2_EXPERIMENTAL_LISTBOX connect_signal_notify_modified(*list, std::bind(&tunit_create::list_item_clicked, *this, std::ref(window))); #else list.set_callback_value_change( dialog_callback<tunit_create, &tunit_create::list_item_clicked>); #endif list.clear(); for(const auto & i : unit_types.types()) { if(i.second.do_not_list()) continue; // Make sure this unit type is built with the data we need. unit_types.build_unit_type(i.second, unit_type::FULL); units_.push_back(&i.second); std::map<std::string, string_map> row_data; string_map column; column["label"] = units_.back()->race()->plural_name(); row_data.emplace("race", column); column["label"] = units_.back()->type_name(); row_data.emplace("unit_type", column); list.add_row(row_data); // Select the previous choice, if any. if(choice_.empty() != true && choice_ == i.first) { list.select_row(list.get_item_count() - 1); } } if(units_.empty()) { ERR_GUI_G << "no unit types found for unit create dialog; not good" << std::endl; } list.register_sorting_option(0, [this](const int i) { return (*units_[i]).race()->plural_name().str(); }); list.register_sorting_option(1, [this](const int i) { return (*units_[i]).type_name().str(); }); list_item_clicked(window); }
/** * @todo This function enables the wml markup for all items, but the interface * is a bit hacky. Especially the fiddling in the internals of the listbox is * ugly. There needs to be a clean interface to set whether a widget has a * markup and what kind of markup. These fixes will be post 1.6. */ void twml_message_::pre_show(CVideo& /*video*/, twindow& window) { window.canvas(1).set_variable("portrait_image", variant(portrait_)); window.canvas(1).set_variable("portrait_mirror", variant(mirror_)); // Set the markup tlabel& title = find_widget<tlabel>(&window, "title", false); title.set_label(title_); title.set_use_markup(true); tcontrol& message = find_widget<tcontrol>(&window, "message", false); message.set_label(message_); message.set_use_markup(true); // The message label might not always be a scroll_label but the capturing // shouldn't hurt. window.keyboard_capture(&message); // Find the input box related fields. tlabel& caption = find_widget<tlabel>(&window, "input_caption", false); ttext_box& input = find_widget<ttext_box>(&window, "input", true); if(has_input_) { caption.set_label(input_caption_); caption.set_use_markup(true); input.set_value(*input_text_); input.set_maximum_length(input_maximum_lenght_); window.keyboard_capture(&input); window.set_click_dismiss(false); window.set_escape_disabled(true); } else { caption.set_visible(twidget::INVISIBLE); input.set_visible(twidget::INVISIBLE); } // Find the option list related fields. tlistbox& options = find_widget<tlistbox>(&window, "input_list", true); /* * The options have some special markup: * A line starting with a * means select that line. * A line starting with a & means more special markup. * - The part until the = is the name of an image. * - The part until the second = is the first column. * - The rest is the third column (the wiki only specifies two columns * so only implement two of them). */ /** * @todo This syntax looks like a bad hack, it would be nice to write * a new syntax which doesn't use those hacks (also avoids the problem * with special meanings for certain characters. */ if(!option_list_.empty()) { std::map<std::string, string_map> data; for(size_t i = 0; i < option_list_.size(); ++i) { std::string icon; std::string label = option_list_[i]; std::string description; // Handle selection. if(!label.empty() && label[0] == '*') { // Number of items hasn't been increased yet so i is ok. *chosen_option_ = i; label.erase(0, 1); } // Handle the special case with an image. std::string::size_type pos = label.find('='); if (pos != std::string::npos && (label[0] == '&' || pos == 0)) { if (pos) icon = label.substr(1, pos - 1); label.erase(0, pos + 1); } // Search for an '=' symbol that is not inside markup. std::string::size_type prev = 0; bool open = false; while ((pos = label.find('=', prev)) != std::string::npos) { for (std::string::size_type i = prev; i != pos; ++i) { switch (label[i]) { case '<': open = true; break; case '>': open = false; break; } } if (!open) break; prev = pos + 1; } if (pos != std::string::npos) { description = label.substr(pos + 1); label.erase(pos); } // Add the data. data["icon"]["label"] = icon; data["label"]["label"] = label; data["label"]["use_markup"] = "true"; data["description"]["label"] = description; data["description"]["use_markup"] = "true"; options.add_row(data); } // Avoid negetive and 0 since item 0 is already selected. if(*chosen_option_ > 0 && static_cast<size_t>(*chosen_option_) < option_list_.size()) { options.select_row(*chosen_option_); } if(!has_input_) { window.keyboard_capture(&options); window.set_click_dismiss(false); window.set_escape_disabled(true); } else { window.add_to_keyboard_chain(&options); // click_dismiss has been disabled due to the input. } } else { options.set_visible(twidget::INVISIBLE); } window.set_click_dismiss(!has_input_ && option_list_.empty()); }
void tunit_recall::pre_show(twindow& window) { tlabel& title = find_widget<tlabel>(&window, "title", true); title.set_label(title.label() + get_title_suffix(team_.side())); ttext_box* filter = find_widget<ttext_box>(&window, "filter_box", false, true); filter->set_text_changed_callback( std::bind(&tunit_recall::filter_text_changed, this, _1, _2)); tlistbox& list = find_widget<tlistbox>(&window, "recall_list", false); #ifdef GUI2_EXPERIMENTAL_LISTBOX connect_signal_notify_modified(*list, std::bind(&tunit_recall::list_item_clicked, *this, std::ref(window))); #else list.set_callback_value_change( dialog_callback<tunit_recall, &tunit_recall::list_item_clicked>); #endif list.clear(); window.keyboard_capture(filter); window.add_to_keyboard_chain(&list); connect_signal_mouse_left_click( find_widget<tbutton>(&window, "dismiss", false), std::bind(&tunit_recall::dismiss_unit, this, std::ref(window))); connect_signal_mouse_left_click( find_widget<tbutton>(&window, "show_help", false), std::bind(&tunit_recall::show_help, this, std::ref(window))); for(const unit_const_ptr& unit : recall_list_) { std::map<std::string, string_map> row_data; string_map column; std::string mods = unit->image_mods(); if(unit->can_recruit()) { mods += "~BLIT(" + unit::leader_crown() + ")"; } for(const std::string& overlay : unit->overlays()) { mods += "~BLIT(" + overlay + ")"; } column["use_markup"] = "true"; column["label"] = unit->absolute_image() + mods; row_data.emplace("unit_image", column); column["label"] = unit->type_name(); row_data.emplace("unit_type", column); column["label"] = format_cost_string(unit->recall_cost(), team_.recall_cost()); row_data.emplace("unit_recall_cost", column); const std::string& name = !unit->name().empty() ? unit->name().str() : utils::unicode_en_dash; column["label"] = name; row_data.emplace("unit_name", column); column["label"] = format_level_string(unit->level()); row_data.emplace("unit_level", column); std::stringstream exp_str; exp_str << font::span_color(unit->xp_color()) << unit->experience() << "/" << (unit->can_advance() ? std::to_string(unit->max_experience()) : utils::unicode_en_dash) << "</span>"; column["label"] = exp_str.str(); row_data.emplace("unit_experience", column); // Since the table widgets use heavy formatting, we save a bare copy // of certain options to filter on. std::string filter_text = unit->type_name() + " " + name + " " + std::to_string(unit->level()); std::string traits; for(const std::string& trait : unit->trait_names()) { traits += (traits.empty() ? "" : "\n") + trait; filter_text += " " + trait; } column["label"] = !traits.empty() ? traits : utils::unicode_en_dash; row_data.emplace("unit_traits", column); list.add_row(row_data); filter_options_.push_back(filter_text); } list.register_sorting_option(0, [this](const int i) { return recall_list_[i]->type_name().str(); }); list.register_sorting_option(1, [this](const int i) { return recall_list_[i]->name().str(); }); list.register_sorting_option(2, [this](const int i) { return recall_list_[i]->level(); }); list.register_sorting_option(3, [this](const int i) { return recall_list_[i]->experience(); }); list.register_sorting_option(4, [this](const int i) { return !recall_list_[i]->trait_names().empty() ? recall_list_[i]->trait_names().front().str() : ""; }); list_item_clicked(window); }
/** * @todo This function enables the wml markup for all items, but the interface * is a bit hacky. Especially the fiddling in the internals of the listbox is * ugly. There needs to be a clean interface to set whether a widget has a * markup and what kind of markup. These fixes will be post 1.6. */ void twml_message_::pre_show(twindow& window) { set_restore(true); window.canvas(1).set_variable("portrait_image", variant(portrait_)); window.canvas(1).set_variable("portrait_mirror", variant(mirror_)); // Set the markup tlabel& title = find_widget<tlabel>(&window, "title", false); title.set_label(title_); title.set_use_markup(true); title.set_can_wrap(true); tcontrol& message = find_widget<tcontrol>(&window, "message", false); message.set_label(message_); message.set_use_markup(true); // The message label might not always be a scroll_label but the capturing // shouldn't hurt. window.keyboard_capture(&message); // Find the input box related fields. tlabel& caption = find_widget<tlabel>(&window, "input_caption", false); ttext_box& input = find_widget<ttext_box>(&window, "input", true); if(has_input_) { caption.set_label(input_caption_); caption.set_use_markup(true); input.set_value(*input_text_); input.set_maximum_length(input_maximum_length_); window.keyboard_capture(&input); window.set_click_dismiss(false); window.set_escape_disabled(true); } else { caption.set_visible(twidget::tvisible::invisible); input.set_visible(twidget::tvisible::invisible); } // Find the option list related fields. tlistbox& options = find_widget<tlistbox>(&window, "input_list", true); if(!option_list_.empty()) { std::map<std::string, string_map> data; for(const twml_message_option& item : option_list_) { // Add the data. data["icon"]["label"] = item.image(); data["label"]["label"] = item.label(); data["label"]["use_markup"] = "true"; data["description"]["label"] = item.description(); data["description"]["use_markup"] = "true"; options.add_row(data); } // Avoid negative and 0 since item 0 is already selected. if(*chosen_option_ > 0 && static_cast<size_t>(*chosen_option_) < option_list_.size()) { options.select_row(*chosen_option_); } if(!has_input_) { window.keyboard_capture(&options); window.set_click_dismiss(false); window.set_escape_disabled(true); } else { window.add_to_keyboard_chain(&options); // click_dismiss has been disabled due to the input. } } else { options.set_visible(twidget::tvisible::invisible); } window.set_click_dismiss(!has_input_ && option_list_.empty()); }