The Battle for Wesnoth  1.19.0-dev
unit_advance.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2016 - 2024
3  Part of the Battle for Wesnoth Project https://www.wesnoth.org/
4 
5  This program is free software; you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation; either version 2 of the License, or
8  (at your option) any later version.
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY.
11 
12  See the COPYING file for more details.
13 */
14 
15 #define GETTEXT_DOMAIN "wesnoth-lib"
16 
18 
20 #include "gui/widgets/button.hpp"
21 #include "gui/widgets/listbox.hpp"
23 #include "gui/widgets/window.hpp"
24 #include "units/unit.hpp"
25 #include "units/types.hpp"
26 #include "help/help.hpp"
27 
28 #include <functional>
29 
30 namespace gui2::dialogs
31 {
32 
33 REGISTER_DIALOG(unit_advance)
34 
35 unit_advance::unit_advance(const std::vector<unit_const_ptr>& samples, std::size_t real)
36  : modal_dialog(window_id())
37  , previews_(samples)
38  , selected_index_(0)
39  , last_real_advancement_(real)
40 {
41 }
42 
44 {
45  listbox& list = find_widget<listbox>(&window, "advance_choice", false);
46 
48 
49  window.keyboard_capture(&list);
50 
52  find_widget<button>(&window, "show_help", false),
53  std::bind(&unit_advance::show_help, this));
54 
55  for(std::size_t i = 0; i < previews_.size(); i++) {
56  const unit& sample = *previews_[i];
57 
58  widget_data row_data;
59  widget_item column;
60 
61  std::string image_string, name = sample.type_name();
62 
63  // This checks if we've finished iterating over the last unit type advancements
64  // and are into the modification-based advancements.
65  if(i >= last_real_advancement_) {
66  const auto& back = sample.get_modifications().child_range("advancement").back();
67 
68  if(back.has_attribute("image")) {
69  image_string = back["image"].str();
70  }
71 
72  name = back["description"].str();
73  }
74 
75  if(image_string.empty()) {
76  image_string = sample.type().image() + sample.image_mods();
77  }
78 
79  column["label"] = image_string;
80  row_data.emplace("advancement_image", column);
81 
82  column["label"] = name;
83  row_data.emplace("advancement_name", column);
84 
85  list.add_row(row_data);
86  }
87 
89 
90  // Disable ESC existing
92 }
93 
95 {
96  const int selected_row
97  = find_widget<listbox>(get_window(), "advance_choice", false).get_selected_row();
98 
99  if(selected_row == -1) {
100  return;
101  }
102 
103  find_widget<unit_preview_pane>(get_window(), "advancement_details", false)
104  .set_displayed_unit(*previews_[selected_row]);
105 }
106 
108 {
109  help::show_help("advancement");
110 }
111 
113 {
114  if(get_retval() == retval::OK) {
115  selected_index_ = find_widget<listbox>(&window, "advance_choice", false)
116  .get_selected_row();
117  }
118 }
119 
120 } // namespace dialogs
child_itors child_range(config_key_type key)
Definition: config.cpp:273
Abstract base class for all modal dialogs.
int get_retval() const
Returns the cached window exit code.
window * get_window()
Returns a pointer to the dialog's window.
const std::vector< unit_const_ptr > & previews_
virtual void pre_show(window &window) override
Actions to be taken before showing the window.
virtual void post_show(window &window) override
Actions to be taken after the window has been shown.
The listbox class.
Definition: listbox.hpp:43
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.
Definition: listbox.cpp:59
base class of top level items, the only item which needs to store the final canvases to draw on.
Definition: window.hpp:63
void keyboard_capture(widget *widget)
Definition: window.cpp:1215
void set_escape_disabled(const bool escape_disabled)
Disable the escape key.
Definition: window.hpp:340
const std::string & image() const
Definition: types.hpp:176
This class represents a single unit of a specific type.
Definition: unit.hpp:133
std::size_t i
Definition: function.cpp:968
const t_string & type_name() const
Gets the translatable name of this unit's type.
Definition: unit.hpp:369
const unit_type & type() const
This unit's type, accounting for gender and variation.
Definition: unit.hpp:355
std::string image_mods() const
Gets an IPF string containing all IPF image mods.
Definition: unit.cpp:2730
config & get_modifications()
Get the raw modifications.
Definition: unit.hpp:1479
This file contains the window object, this object is a top level container which has the event manage...
REGISTER_DIALOG(tod_new_schedule)
void connect_signal_notify_modified(dispatcher &dispatcher, const signal_notification &signal)
Connects a signal handler for getting a notification upon modification.
Definition: dispatcher.cpp:203
void connect_signal_mouse_left_click(dispatcher &dispatcher, const signal &signal)
Connects a signal handler for a left mouse button click.
Definition: dispatcher.cpp:177
std::map< std::string, widget_item > widget_data
Definition: widget.hpp:34
std::map< std::string, t_string > widget_item
Definition: widget.hpp:31
@ OK
Dialog was closed with the OK button.
Definition: retval.hpp:35
void show_help(const std::string &show_topic, int xloc, int yloc)
Open the help browser, show topic with id show_topic.
Definition: help.cpp:140
std::shared_ptr< const unit > unit_const_ptr
Definition: ptr.hpp:27