The Battle for Wesnoth  1.17.0-dev
unit_advance.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2016 - 2021
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/image.hpp"
22 #include "gui/widgets/label.hpp"
23 #include "gui/widgets/listbox.hpp"
25 #include "gui/widgets/settings.hpp"
26 #include "gui/widgets/window.hpp"
27 #include "units/unit.hpp"
28 #include "units/types.hpp"
29 #include "help/help.hpp"
30 
31 #include <functional>
32 
33 namespace gui2::dialogs
34 {
35 
36 REGISTER_DIALOG(unit_advance)
37 
38 unit_advance::unit_advance(const std::vector<unit_const_ptr>& samples, std::size_t real)
39  : previews_(samples)
40  , selected_index_(0)
41  , last_real_advancement_(real)
42 {
43 }
44 
46 {
47  listbox& list = find_widget<listbox>(&window, "advance_choice", false);
48 
50 
51  window.keyboard_capture(&list);
52 
54  find_widget<button>(&window, "show_help", false),
55  std::bind(&unit_advance::show_help, this));
56 
57  for(std::size_t i = 0; i < previews_.size(); i++) {
58  const unit& sample = *previews_[i];
59 
60  std::map<std::string, string_map> row_data;
61  string_map column;
62 
63  std::string image_string, name = sample.type_name();
64 
65  // This checks if we've finished iterating over the last unit type advancements
66  // and are into the modification-based advancements.
67  if(i >= last_real_advancement_) {
68  const auto& back = sample.get_modifications().child_range("advancement").back();
69 
70  if(back.has_attribute("image")) {
71  image_string = back["image"].str();
72  }
73 
74  name = back["description"].str();
75  }
76 
77  if(image_string.empty()) {
78  image_string = sample.type().image() + sample.image_mods();
79  }
80 
81  column["label"] = image_string;
82  row_data.emplace("advancement_image", column);
83 
84  column["label"] = name;
85  row_data.emplace("advancement_name", column);
86 
87  list.add_row(row_data);
88  }
89 
91 
92  // Disable ESC existing
93  window.set_escape_disabled(true);
94 }
95 
97 {
98  const int selected_row
99  = find_widget<listbox>(get_window(), "advance_choice", false).get_selected_row();
100 
101  if(selected_row == -1) {
102  return;
103  }
104 
105  find_widget<unit_preview_pane>(get_window(), "advancement_details", false)
106  .set_displayed_unit(*previews_[selected_row]);
107 }
108 
110 {
111  help::show_help("advancement");
112 }
113 
115 {
116  if(get_retval() == retval::OK) {
117  selected_index_ = find_widget<listbox>(&window, "advance_choice", false)
118  .get_selected_row();
119  }
120 }
121 
122 } // namespace dialogs
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:144
This class represents a single unit of a specific type.
Definition: unit.hpp:121
virtual void post_show(window &window) override
Actions to be taken after the window has been shown.
This file contains the window object, this object is a top level container which has the event manage...
child_itors child_range(config_key_type key)
Definition: config.cpp:344
STL namespace.
window * get_window() const
Returns a pointer to the dialog&#39;s window.
const unit_type & type() const
This unit&#39;s type, accounting for gender and variation.
Definition: unit.hpp:346
std::shared_ptr< const unit > unit_const_ptr
Definition: ptr.hpp:27
The listbox class.
Definition: listbox.hpp:43
void connect_signal_notify_modified(dispatcher &dispatcher, const signal_notification_function &signal)
Connects a signal handler for getting a notification upon modification.
Definition: dispatcher.cpp:187
This file contains the settings handling of the widget library.
void connect_signal_mouse_left_click(dispatcher &dispatcher, const signal_function &signal)
Connects a signal handler for a left mouse button click.
Definition: dispatcher.cpp:172
const t_string & type_name() const
Gets the translatable name of this unit&#39;s type.
Definition: unit.hpp:360
std::size_t i
Definition: function.cpp:967
std::map< std::string, t_string > string_map
Definition: widget.hpp:26
grid & add_row(const string_map &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:68
const std::string & image() const
Definition: types.hpp:179
int get_retval() const
Returns the cached window exit code.
Dialog was closed with the OK button.
Definition: retval.hpp:35
config & get_modifications()
Get the raw modifications.
Definition: unit.hpp:1468
base class of top level items, the only item which needs to store the final canvases to draw on...
Definition: window.hpp:65
const std::vector< unit_const_ptr > & previews_
std::string image_mods() const
Gets an IPF string containing all IPF image mods.
Definition: unit.cpp:2592
virtual void pre_show(window &window) override
Actions to be taken before showing the window.