15 #define GETTEXT_DOMAIN "wesnoth-lib"
45 #define LOG_DP LOG_STREAM(info, log_display)
58 , recall_list_(recall_list)
71 LOG_DP <<
"size: " << units.size();
74 for(
const auto& u_ptr : units) {
75 LOG_DP <<
"\tunit[" << (idx++) <<
"]: " << u_ptr->id() <<
" name = '" << u_ptr->name() <<
"'";
81 static const inline std::string
maybe_inactive(
const std::string& str,
bool active)
91 std::string lvl = std::to_string(
level);
100 }
else if(
level < 1) {
102 }
else if(
level == 1) {
104 }
else if(
level == 2) {
105 return "<b>" + lvl +
"</b>";
107 return"<b><span color='#ffffff'>" + lvl +
"</span></b>";
113 std::stringstream str;
115 if(unit_recall_cost < 0) {
116 unit_recall_cost = team_recall_cost;
119 if(unit_recall_cost > team_recall_cost) {
120 str <<
"<span color='#ff0000'>" << unit_recall_cost <<
"</span>";
121 }
else if(unit_recall_cost == team_recall_cost) {
122 str << unit_recall_cost;
123 }
else if(unit_recall_cost < team_recall_cost) {
124 str <<
"<span color='#00ff00'>" << unit_recall_cost <<
"</span>";
138 int controlled_recruiters = 0;
141 ++controlled_recruiters;
145 std::stringstream
msg;
146 if(controlled_recruiters >= 2) {
149 msg <<
" (" << leader->name();
msg <<
")";
158 label& title = find_widget<label>(
"title",
true);
162 = find_widget<text_box>(
"filter_box",
false,
true);
167 listbox& list = find_widget<listbox>(
"recall_list");
177 find_widget<button>(
"rename"),
181 find_widget<button>(
"dismiss"),
185 find_widget<button>(
"show_help"),
198 wb_gold = whiteb->get_spent_gold_for(
team_.
side());
212 mods +=
"~BLIT(" +
overlay +
")";
220 column[
"tooltip"] =
_(
"This unit cannot be recalled because you will not have enough gold at this point in your plan.");
222 column[
"tooltip"] =
_(
"This unit cannot be recalled because you do not have enough gold.");
225 column[
"use_markup"] =
"true";
228 row_data.emplace(
"unit_image", column);
231 row_data.emplace(
"unit_type", column);
239 row_data.emplace(
"unit_recall_cost", column);
243 row_data.emplace(
"unit_name", column);
246 row_data.emplace(
"unit_level", column);
248 std::stringstream exp_str;
256 row_data.emplace(
"unit_experience", column);
262 if(
const auto* race =
unit->
race()) {
263 filter_text +=
" " + race->name(
unit->
gender()) +
" " + race->plural_name();
271 filter_text +=
" " + std::string(
"vvv");
276 traits += (traits.empty() ?
"" :
"\n") + trait;
277 filter_text +=
" " + trait;
283 row_data.emplace(
"unit_traits", column);
312 listbox& list = find_widget<listbox>(
"recall_list");
321 std::string name = selected_unit.
name();
322 const std::string dialog_title(
_(
"Rename Unit"));
323 const std::string dialog_label(
_(
"Name:"));
325 if(gui2::dialogs::edit_text::execute(dialog_title, dialog_label, name)) {
326 selected_unit.
rename(name);
331 std::ostringstream filter_text;
332 filter_text << selected_unit.
type_name() <<
" " << name <<
" " << std::to_string(selected_unit.
level());
333 for(
const std::string& trait : selected_unit.
trait_names()) {
334 filter_text <<
" " << trait;
347 listbox& list = find_widget<listbox>(
"recall_list");
359 ?
_(
"Do you really want to dismiss him?")
360 :
_(
"Do you really want to dismiss her?"));
362 }
else if(u.
level() > 1) {
364 ?
_(
"Do you really want to dismiss him?")
365 :
_(
"Do you really want to dismiss her?"));
369 ?
_(
"Do you really want to dismiss him?")
370 :
_(
"Do you really want to dismiss her?"));
391 LOG_DP <<
"Dismissing a unit, side = " << u.
side() <<
", id = '" << u.
id() <<
"'";
392 LOG_DP <<
"That side's recall list:";
397 assert(dismissed_unit);
415 const int selected_row
416 = find_widget<listbox>(
"recall_list").get_selected_row();
418 if(selected_row == -1) {
424 find_widget<unit_preview_pane>(
"unit_details")
425 .set_displayed_unit(selected_unit);
427 find_widget<button>(
"rename").set_active(!selected_unit.
unrenamable());
432 listbox& list = find_widget<listbox>(
"recall_list");
442 listbox& list = find_widget<listbox>(
"recall_list");
444 const std::vector<std::string> words =
utils::split(text,
' ');
450 boost::dynamic_bitset<> show_items;
457 for(
const auto & word : words) {
466 show_items[
i] = found;
474 find_widget<button>(
"rename").set_active(any_shown);
475 find_widget<button>(
"dismiss").set_active(any_shown);
virtual const unit_map & units() const override
Main class to show messages to the user.
@ yes_no_buttons
Shows a yes and no button.
Abstract base class for all modal dialogs.
int get_retval() const
Returns the cached window exit code.
std::vector< std::string > filter_options_
virtual void pre_show() override
Actions to be taken before showing the window.
void list_item_clicked()
Callbacks.
void filter_text_changed(const std::string &text)
std::vector< unit_const_ptr > & recall_list_
virtual void post_show() override
Actions to be taken after the window has been shown.
std::vector< std::string > last_words_
widget * find(const std::string &id, const bool must_be_active) override
See widget::find.
t_string get_image() const
Wrapper for label.
void set_image(const t_string &label)
Wrapper for set_label.
void set_row_shown(const unsigned row, const bool shown)
Makes a row visible or invisible.
void set_active_sorting_option(const order_pair &sort_by, const bool select_first=false)
Sorts the listbox by a pre-set sorting option.
std::pair< int, sort_order::type > order_pair
grid & add_row(const widget_item &item, const int index=-1)
When an item in the list is selected by the user we need to update the state.
const grid * get_row_grid(const unsigned row) const
Returns the grid of the wanted row.
void register_translatable_sorting_option(const int col, translatable_sorter_func_t f)
Registers a special sorting function specifically for translatable values.
bool any_rows_shown() const
void register_sorting_option(const int col, const Func &f)
void remove_row(const unsigned row, unsigned count=1)
Removes a row in the listbox.
void clear()
Removes all the rows in the listbox, clearing it.
int get_selected_row() const
Returns the first selected row.
unsigned get_item_count() const
Returns the number of items in the listbox.
const order_pair get_active_sorting_option()
void set_text_changed_callback(std::function< void(text_box_base *textbox, const std::string text)> cb)
Set the text_changed callback.
A widget that allows the user to input text in single line.
void set_retval(const int retval, const bool close_window=true)
Sets there return value of the window.
void keyboard_capture(widget *widget)
void invalidate_layout()
Updates the size of the window.
void add_to_keyboard_chain(widget *widget)
Adds the widget to the keyboard chain.
unit_ptr find_if_matches_id(const std::string &unit_id)
Find a unit by id.
static config get_disband(const std::string &unit_id)
static bool run_and_throw(const std::string &commandname, const config &data, bool use_undo=true, bool show=true, synced_command::error_handler_function error_handler=default_error_function)
const std::string & str() const
This class stores all the data for a single 'side' (in game nomenclature).
bool is_local_human() const
recall_list_manager & recall_list()
const std::set< std::string > & recruits() const
Container associating units to locations.
unit_iterator find_leader(int side)
static std::string alignment_description(unit_alignments::type align, unit_race::GENDER gender=unit_race::MALE)
Implementation detail of unit_type::alignment_description.
This class represents a single unit of a specific type.
static const std::string & leader_crown()
The path to the leader crown overlay.
static std::string _(const char *str)
unit_alignments::type alignment() const
The alignment of this unit.
int level() const
The current level of this unit.
const t_string & type_name() const
Gets the translatable name of this unit's type.
bool unrenamable() const
Whether this unit can be renamed.
int recall_cost() const
How much gold it costs to recall this unit, or -1 if the side's default recall cost is used.
void rename(const std::string &name)
Attempts to rename this unit's translatable display name, taking the 'unrenamable' flag into account.
const unit_race * race() const
Gets this unit's race.
int experience() const
The current number of experience points this unit has.
bool can_recruit() const
Whether this unit can recruit other units - ie, are they a leader unit.
const std::string & id() const
Gets this unit's id.
int side() const
The side this unit belongs to.
unsigned int experience_to_advance() const
The number of experience points this unit needs to level up, or 0 if current XP > max XP.
int max_experience() const
The max number of experience points this unit can have.
unit_race::GENDER gender() const
The gender of this unit.
const t_string & name() const
Gets this unit's translatable display name.
bool can_advance() const
Checks whether this unit has any options to advance to.
color_t xp_color() const
Color for this unit's XP.
std::string image_mods() const
Gets an IPF string containing all IPF image mods.
const std::vector< std::string > & overlays() const
Get the unit's overlay images.
std::string absolute_image() const
The name of the file to game_display (used in menus).
const std::vector< t_string > & trait_names() const
Gets the names of the currently registered traits.
bool loyal() const
Gets whether this unit is loyal - ie, it costs no upkeep.
#define log_scope2(domain, description)
const std::string unicode_en_dash
std::string span_color(const color_t &color)
Returns a Pango formatting string using the provided color_t object.
static std::string get_title_suffix(int side_num)
static listbox::order_pair sort_default
static const std::string maybe_inactive(const std::string &str, bool active)
static std::string format_level_string(const int level)
static void dump_recall_list_to_console(const T &units)
static const color_t inactive_row_color(0x96, 0x96, 0x96)
static listbox::order_pair sort_last
REGISTER_DIALOG(editor_edit_unit)
static std::string format_cost_string(int unit_recall_cost, const int team_recall_cost)
void connect_signal_notify_modified(dispatcher &dispatcher, const signal_notification &signal)
Connects a signal handler for getting a notification upon modification.
void connect_signal_mouse_left_click(dispatcher &dispatcher, const signal &signal)
Connects a signal handler for a left mouse button click.
std::map< std::string, widget_item > widget_data
std::map< std::string, t_string > widget_item
void show_message(const std::string &title, const std::string &msg, const std::string &button_caption, const bool auto_close, const bool message_use_markup, const bool title_use_markup)
Shows a message to the user.
@ OK
Dialog was closed with the OK button.
@ CANCEL
Dialog was closed with the CANCEL button.
void show_help(const std::string &show_topic)
Open the help browser, show topic with id show_topic.
Functions to load and save images from/to disk.
play_controller * controller
bool ci_search(const std::string &s1, const std::string &s2)
std::size_t index(const std::string &str, const std::size_t index)
Codepoint index corresponding to the nth character in a UTF-8 string.
std::vector< std::string > split(const config_attribute_value &val)
static void msg(const char *act, debug_info &i, const char *to="", const char *result="")
std::shared_ptr< const unit > unit_const_ptr
std::shared_ptr< unit > unit_ptr
The basic class for representing 8-bit RGB or RGBA colour values.
Applies the planned unit map for the duration of the struct's life.
static lg::log_domain log_display("display")