The Battle for Wesnoth  1.15.12+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 <functional>
31 
32 namespace gui2::dialogs
33 {
34 
35 REGISTER_DIALOG(unit_advance)
36 
37 unit_advance::unit_advance(const std::vector<unit_const_ptr>& samples, std::size_t real)
38  : previews_(samples)
39  , selected_index_(0)
40  , last_real_advancement_(real)
41 {
42 }
43 
45 {
46  listbox& list = find_widget<listbox>(&window, "advance_choice", false);
47 
49 
50  window.keyboard_capture(&list);
51 
53  find_widget<button>(&window, "show_help", false),
54  std::bind(&unit_advance::show_help, this));
55 
56  for(std::size_t i = 0; i < previews_.size(); i++) {
57  const unit& sample = *previews_[i];
58 
59  std::map<std::string, string_map> row_data;
60  string_map column;
61 
62  std::string image_string, name = sample.type_name();
63 
64  // This checks if we've finished iterating over the last unit type advancements
65  // and are into the modification-based advancements.
66  if(i >= last_real_advancement_) {
67  const auto& back = sample.get_modifications().child_range("advancement").back();
68 
69  if(back.has_attribute("image")) {
70  image_string = back["image"].str();
71  }
72 
73  name = back["description"].str();
74  }
75 
76  if(image_string.empty()) {
77  image_string = sample.type().image() + sample.image_mods();
78  }
79 
80  column["label"] = image_string;
81  row_data.emplace("advancement_image", column);
82 
83  column["label"] = name;
84  row_data.emplace("advancement_name", column);
85 
86  list.add_row(row_data);
87  }
88 
90 
91  // Disable ESC existing
92  window.set_escape_disabled(true);
93 }
94 
96 {
97  const int selected_row
98  = find_widget<listbox>(get_window(), "advance_choice", false).get_selected_row();
99 
100  if(selected_row == -1) {
101  return;
102  }
103 
104  find_widget<unit_preview_pane>(get_window(), "advancement_details", false)
105  .set_displayed_unit(*previews_[selected_row]);
106 }
107 
109 {
110  help::show_help("advancement");
111 }
112 
114 {
115  if(get_retval() == retval::OK) {
116  selected_index_ = find_widget<listbox>(&window, "advance_choice", false)
117  .get_selected_row();
118  }
119 }
120 
121 } // 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:112
This class represents a single unit of a specific type.
Definition: unit.hpp:120
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:356
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:345
std::shared_ptr< const unit > unit_const_ptr
Definition: ptr.hpp:26
The listbox class.
Definition: listbox.hpp:42
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:186
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:171
const t_string & type_name() const
Gets the translatable name of this unit&#39;s type.
Definition: unit.hpp:359
std::size_t i
Definition: function.cpp:940
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:67
const std::string & image() const
Definition: types.hpp:170
int get_retval() const
Returns the cached window exit code.
Dialog was closed with the OK button.
Definition: retval.hpp:34
config & get_modifications()
Get the raw modifications.
Definition: unit.hpp:1470
base class of top level items, the only item which needs to store the final canvases to draw on...
Definition: window.hpp:64
const std::vector< unit_const_ptr > & previews_
std::string image_mods() const
Gets an IPF string containing all IPF image mods.
Definition: unit.cpp:2551
virtual void pre_show(window &window) override
Actions to be taken before showing the window.