The Battle for Wesnoth  1.15.5+dev
unit_advance.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2016 - 2018 by the Battle for Wesnoth Project https://www.wesnoth.org/
3 
4  This program is free software; you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation; either version 2 of the License, or
7  (at your option) any later version.
8  This program is distributed in the hope that it will be useful,
9  but WITHOUT ANY WARRANTY.
10 
11  See the COPYING file for more details.
12 */
13 
14 #define GETTEXT_DOMAIN "wesnoth-lib"
15 
17 
19 #include "gui/widgets/button.hpp"
20 #include "gui/widgets/image.hpp"
21 #include "gui/widgets/label.hpp"
22 #include "gui/widgets/listbox.hpp"
24 #include "gui/widgets/settings.hpp"
25 #include "gui/widgets/window.hpp"
26 #include "units/unit.hpp"
27 #include "units/types.hpp"
28 #include "help/help.hpp"
29 
30 #include "utils/functional.hpp"
31 
32 namespace gui2
33 {
34 namespace dialogs
35 {
36 
37 REGISTER_DIALOG(unit_advance)
38 
39 unit_advance::unit_advance(const unit_ptr_vector& samples, std::size_t real)
40  : previews_(samples)
41  , selected_index_(0)
42  , last_real_advancement_(real)
43 {
44 }
45 
47 {
48  listbox& list = find_widget<listbox>(&window, "advance_choice", false);
49 
50  connect_signal_notify_modified(list, std::bind(&unit_advance::list_item_clicked, this, std::ref(window)));
51 
52  window.keyboard_capture(&list);
53 
55  find_widget<button>(&window, "show_help", false),
56  std::bind(&unit_advance::show_help, this));
57 
58  for(std::size_t i = 0; i < previews_.size(); i++) {
59  const unit& sample = *previews_[i];
60 
61  std::map<std::string, string_map> row_data;
62  string_map column;
63 
64  std::string image_string, name = sample.type_name();
65 
66  // This checks if we've finished iterating over the last unit type advancements
67  // and are into the modification-based advancements.
68  if(i >= last_real_advancement_) {
69  const auto& back = sample.get_modifications().child_range("advancement").back();
70 
71  if(back.has_attribute("image")) {
72  image_string = back["image"].str();
73  }
74 
75  name = back["description"].str();
76  }
77 
78  if(image_string.empty()) {
79  image_string = sample.type().image() + sample.image_mods();
80  }
81 
82  column["label"] = image_string;
83  row_data.emplace("advancement_image", column);
84 
85  column["label"] = name;
86  row_data.emplace("advancement_name", column);
87 
88  list.add_row(row_data);
89  }
90 
91  list_item_clicked(window);
92 
93  // Disable ESC existing
94  window.set_escape_disabled(true);
95 }
96 
98 {
99  const int selected_row
100  = find_widget<listbox>(&window, "advance_choice", false).get_selected_row();
101 
102  if(selected_row == -1) {
103  return;
104  }
105 
106  find_widget<unit_preview_pane>(&window, "advancement_details", false)
107  .set_displayed_unit(*previews_[selected_row]);
108 }
109 
111 {
112  help::show_help("advancement");
113 }
114 
116 {
117  if(get_retval() == retval::OK) {
118  selected_index_ = find_widget<listbox>(&window, "advance_choice", false)
119  .get_selected_row();
120  }
121 }
122 
123 } // namespace dialogs
124 } // namespace gui2
std::vector< unit_const_ptr > unit_ptr_vector
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:114
This class represents a single unit of a specific type.
Definition: unit.hpp:129
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:362
STL namespace.
Generic file dialog.
Definition: field-fwd.hpp:22
const unit_type & type() const
This unit&#39;s type, accounting for gender and variation.
Definition: unit.hpp:353
The listbox class.
Definition: listbox.hpp:40
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:248
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:233
const unit_ptr_vector & previews_
const t_string & type_name() const
Gets the translatable name of this unit&#39;s type.
Definition: unit.hpp:367
Various uncategorised dialogs.
std::size_t i
Definition: function.cpp:933
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:66
void list_item_clicked(window &window)
const std::string & image() const
Definition: types.hpp:166
Dialog was closed with the OK button.
Definition: retval.hpp:34
config & get_modifications()
Get the raw modifications.
Definition: unit.hpp:1465
base class of top level items, the only item which needs to store the final canvases to draw on ...
Definition: window.hpp:62
std::string image_mods() const
Gets an IPF string containing all IPF image mods.
Definition: unit.cpp:2588
virtual void pre_show(window &window) override
Inherited from modal_dialog.