15 #define GETTEXT_DOMAIN "wesnoth-lib" 47 #include <boost/dynamic_bitset.hpp> 50 #define LOG_DP LOG_STREAM(info, log_display) 63 , recall_list_(recall_list)
76 LOG_DP <<
"size: " << units.size();
79 for(
const auto& u_ptr : units) {
80 LOG_DP <<
"\tunit[" << (idx++) <<
"]: " << u_ptr->id() <<
" name = '" << u_ptr->name() <<
"'";
86 static const inline std::string
maybe_inactive(
const std::string& str,
bool active)
96 std::string lvl = std::to_string(level);
105 }
else if(level < 1) {
107 }
else if(level == 1) {
109 }
else if(level == 2) {
110 return "<b>" + lvl +
"</b>";
112 return"<b><span color='#ffffff'>" + lvl +
"</span></b>";
118 std::stringstream str;
120 if(unit_recall_cost < 0) {
121 unit_recall_cost = team_recall_cost;
124 if(unit_recall_cost > team_recall_cost) {
125 str <<
"<span color='#ff0000'>" << unit_recall_cost <<
"</span>";
126 }
else if(unit_recall_cost == team_recall_cost) {
127 str << unit_recall_cost;
128 }
else if(unit_recall_cost < team_recall_cost) {
129 str <<
"<span color='#00ff00'>" << unit_recall_cost <<
"</span>";
143 int controlled_recruiters = 0;
146 ++controlled_recruiters;
150 std::stringstream
msg;
151 if(controlled_recruiters >= 2) {
154 msg <<
" (" << leader->name(); msg <<
")";
163 label& title = find_widget<label>(&
window,
"title",
true);
167 = find_widget<text_box>(&
window,
"filter_box",
false,
true);
172 listbox& list = find_widget<listbox>(&
window,
"recall_list",
false);
178 window.keyboard_capture(filter);
179 window.add_to_keyboard_chain(&list);
182 find_widget<button>(&window,
"rename",
false),
186 find_widget<button>(&window,
"dismiss",
false),
190 find_widget<button>(&window,
"show_help",
false),
203 wb_gold = whiteb->get_spent_gold_for(
team_.
side());
210 const bool recallable = (recall_cost <=
team_.
gold() - wb_gold);
217 mods +=
"~BLIT(" +
overlay +
")";
225 column[
"tooltip"] =
_(
"This unit cannot be recalled because you will not have enough gold at this point in your plan.");
227 column[
"tooltip"] =
_(
"This unit cannot be recalled because you do not have enough gold.");
230 column[
"use_markup"] =
"true";
233 row_data.emplace(
"unit_image", column);
236 row_data.emplace(
"unit_type", column);
244 row_data.emplace(
"unit_recall_cost", column);
248 row_data.emplace(
"unit_name", column);
251 row_data.emplace(
"unit_level", column);
253 std::stringstream exp_str;
261 row_data.emplace(
"unit_experience", column);
272 filter_text +=
" " + std::string(
"vvv");
277 traits += (traits.empty() ?
"" :
"\n") + trait;
278 filter_text +=
" " + trait;
284 row_data.emplace(
"unit_traits", column);
289 image *gold_icon =
dynamic_cast<image*
>(grid.
find(
"gold_icon",
false));
298 const unit& u = *recall_list_[
i];
303 return !recall_list_[
i]->trait_names().empty() ? recall_list_[
i]->trait_names().front().str() :
"";
322 std::string name = selected_unit.
name();
323 const std::string dialog_title(
_(
"Rename Unit"));
324 const std::string dialog_label(
_(
"Name:"));
326 if(gui2::dialogs::edit_text::execute(dialog_title, dialog_label, name)) {
327 selected_unit.
rename(name);
332 std::ostringstream filter_text;
333 filter_text << selected_unit.
type_name() <<
" " << name <<
" " << std::to_string(selected_unit.
level());
334 for(
const std::string& trait : selected_unit.
trait_names()) {
335 filter_text <<
" " << trait;
360 ?
_(
"Do you really want to dismiss him?")
361 :
_(
"Do you really want to dismiss her?"));
363 }
else if(u.
level() > 1) {
364 message <<
_(
"This unit is an experienced one, having advanced levels.") <<
" " << (u.
gender() ==
unit_race::MALE 365 ?
_(
"Do you really want to dismiss him?")
366 :
_(
"Do you really want to dismiss her?"));
370 ?
_(
"Do you really want to dismiss him?")
371 :
_(
"Do you really want to dismiss her?"));
374 if(!message.str().empty()) {
392 LOG_DP <<
"Dismissing a unit, side = " << u.
side() <<
", id = '" << u.
id() <<
"'";
393 LOG_DP <<
"That side's recall list:";
398 assert(dismissed_unit);
416 const int selected_row
417 = find_widget<listbox>(
get_window(),
"recall_list",
false).get_selected_row();
419 if(selected_row == -1) {
425 find_widget<unit_preview_pane>(
get_window(),
"unit_details",
false)
426 .set_displayed_unit(selected_unit);
433 listbox& list = find_widget<listbox>(&
window,
"recall_list",
false);
445 const std::vector<std::string> words =
utils::split(text,
' ');
451 boost::dynamic_bitset<> show_items;
458 for(
const auto & word : words) {
467 show_items[
i] = found;
const order_pair get_active_sorting_option()
Define the common log macros for the gui toolkit.
static const std::string maybe_inactive(const std::string &str, bool active)
window(const builder_window::window_resolution &definition)
< Needs to be initialized in show.
play_controller * controller
Dialog was closed with the CANCEL button.
void set_active_sorting_option(const order_pair &sort_by, const bool select_first=false)
Sorts the listbox by a pre-set sorting option.
#define REGISTER_DIALOG(window_id)
Wrapper for REGISTER_DIALOG2.
void set_text_changed_callback(std::function< void(text_box_base *textbox, const std::string text)> cb)
Set the text_changed callback.
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.
void show_help(const std::string &show_topic, int xloc, int yloc)
Open the help browser, show topic with id show_topic.
virtual const unit_map & units() const override
This class represents a single unit of a specific type.
void connect_signal_mouse_left_click(dispatcher &dispatcher, const signal &signal)
Connects a signal handler for a left mouse button click.
unit_iterator find_leader(int side)
Main class to show messages to the user.
unit_race::GENDER gender() const
The gender of this unit.
static const color_t inactive_row_color(0x96, 0x96, 0x96)
void rename(const std::string &name)
Attempts to rename this unit's translatable display name, taking the 'unrenamable' flag into account...
virtual void post_show(window &window) override
Actions to be taken after the window has been shown.
std::pair< int, sort_order::type > order_pair
t_string get_image() const
Wrapper for label.
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.
std::vector< unit_const_ptr > & recall_list_
static listbox::order_pair sort_default
void register_translatable_sorting_option(const int col, translatable_sorter_func_t f)
Registers a special sorting function specifically for translatable values.
std::string absolute_image() const
The name of the file to game_display (used in menus).
static void msg(const char *act, debug_info &i, const char *to="", const char *result="")
A label displays a text, the text can be wrapped but no scrollbars are provided.
int get_selected_row() const
Returns the first selected row.
static std::string _(const char *str)
std::shared_ptr< unit > unit_ptr
static lg::log_domain log_display("display")
Class for a single line text area.
static listbox::order_pair sort_last
unsigned int experience_to_advance() const
The number of experience points this unit needs to level up, or 0 if current XP > max XP...
std::shared_ptr< const unit > unit_const_ptr
static std::string format_level_string(const int level)
std::string span_color(const color_t &color)
Returns a Pango formatting string using the provided color_t object.
void filter_text_changed(const std::string &text)
This class stores all the data for a single 'side' (in game nomenclature).
static const std::string & leader_crown()
The path to the leader crown overlay.
std::map< std::string, t_string > widget_item
const std::string & id() const
Gets this unit's id.
unit_ptr find_if_matches_id(const std::string &unit_id)
Find a unit by id.
std::vector< std::string > filter_options_
This file contains the settings handling of the widget library.
Applies the planned unit map for the duration of the struct's life.
void clear()
Removes all the rows in the listbox, clearing it.
color_t xp_color() const
Color for this unit's XP.
const t_string & name() const
Gets this unit's translatable display name.
The basic class for representing 8-bit RGB or RGBA colour values.
int max_experience() const
The max number of experience points this unit can have.
widget * find(const std::string &id, const bool must_be_active) override
See widget::find.
unsigned get_item_count() const
Returns the number of items in the listbox.
Shows a yes and no button.
int level() const
The current level of this unit.
#define log_scope2(domain, description)
const std::vector< t_string > & trait_names() const
Gets the names of the currently registered traits.
const std::vector< std::string > & overlays() const
Get the unit's overlay images.
bool any_rows_shown() const
const t_string & type_name() const
Gets the translatable name of this unit's type.
static std::string format_cost_string(int unit_recall_cost, const int team_recall_cost)
window * get_window()
Returns a pointer to the dialog's window.
bool loyal() const
Gets whether this unit is loyal - ie, it costs no upkeep.
virtual void pre_show(window &window) override
Actions to be taken before showing the window.
bool ci_search(const std::string &s1, const std::string &s2)
void list_item_clicked()
Callbacks.
const std::string unicode_en_dash
bool can_recruit() const
Whether this unit can recruit other units - ie, are they a leader unit.
void set_retval(const int retval, const bool close_window=true)
Sets there return value of the window.
static std::string get_title_suffix(int side_num)
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.
static void dump_recall_list_to_console(const T &units)
std::vector< std::string > last_words_
static config get_disband(const std::string &unit_id)
virtual void set_active(const bool active) override
See styled_widget::set_active.
const grid * get_row_grid(const unsigned row) const
Returns the grid of the wanted row.
void set_image(const t_string &label)
Wrapper for set_label.
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)
int get_retval() const
Returns the cached window exit code.
bool is_local_human() const
int experience() const
The current number of experience points this unit has.
std::vector< std::string > split(const config_attribute_value &val)
Abstract base class for all modal dialogs.
Functions to load and save images from/to disk.
bool can_advance() const
Checks whether this unit has any options to advance to.
recall_list_manager & recall_list()
void remove_row(const unsigned row, unsigned count=1)
Removes a row in the listbox.
Container associating units to locations.
void invalidate_layout()
Updates the size of the window.
std::map< std::string, widget_item > widget_data
int side() const
The side this unit belongs to.
Dialog was closed with the OK button.
void register_sorting_option(const int col, const Func &f)
const std::string & str() const
base class of top level items, the only item which needs to store the final canvases to draw on...
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 set_row_shown(const unsigned row, const bool shown)
Makes a row visible or invisible.
std::string image_mods() const
Gets an IPF string containing all IPF image mods.
void connect_signal_notify_modified(dispatcher &dispatcher, const signal_notification &signal)
Connects a signal handler for getting a notification upon modification.
const std::set< std::string > & recruits() const