The Battle for Wesnoth  1.15.0-dev
game_version.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2013 - 2018 by Iris Morelle <shadowm2006@gmail.com>
3  Part of the Battle for Wesnoth Project http://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 
19 #include "build_info.hpp"
20 #include "desktop/clipboard.hpp"
21 #include "desktop/open.hpp"
22 #include "desktop/version.hpp"
23 #include "filesystem.hpp"
24 #include "game_config.hpp"
25 #include "gettext.hpp"
27 #include "gui/widgets/button.hpp"
29 #ifdef GUI2_EXPERIMENTAL_LISTBOX
30 #include "gui/widgets/list.hpp"
31 #else
32 #include "gui/widgets/listbox.hpp"
33 #endif
35 #include "gui/widgets/settings.hpp"
38 #include "gui/widgets/window.hpp"
39 #ifdef _WIN32
40 #include "log_windows.hpp"
41 #endif
42 #include "formula/string_utils.hpp"
43 
44 #include "gettext.hpp"
45 
46 #include "utils/functional.hpp"
47 
48 namespace
49 {
50 
51 const std::string text_feature_on = "<span color='#0f0'>&#9679;</span>";
52 const std::string text_feature_off = "<span color='#f00'>&#9679;</span>";
53 
54 } // end anonymous namespace
55 
56 namespace gui2
57 {
58 namespace dialogs
59 {
60 
61 /*WIKI
62  * @page = GUIWindowDefinitionWML
63  * @order = 2_game_version
64  *
65  * == Game paths ==
66  *
67  * Dialog displaying the various paths used by the game to locate
68  * resource and configuration files.
69  *
70  * There are several item types used to build widget ids in this dialog.
71  * All references to TYPE below refer to the following suffixes:
72  * datadir, config, userdata, saves, addons, cache.
73  *
74  * @begin{table}{dialog_widgets}
75  *
76  * path_TYPE & & text_box & m &
77  * Textbox containing the filesystem path for the given item. $
78  *
79  * copy_TYPE & & button & m &
80  * Copies the given item's path to clipboard. $
81  *
82  * browse_TYPE & & button & m &
83  * Launches the default file browser on the given item's path. $
84  *
85  * @end{table}
86  */
87 
88 REGISTER_DIALOG(game_version)
89 
91  : path_wid_stem_("path_")
92  , copy_wid_stem_("copy_")
93  , browse_wid_stem_("browse_")
94  , path_map_()
95 #ifdef _WIN32
96  , log_path_(lg::log_file_path())
97 #endif
98  , deps_()
100  , report_()
101 {
102  // NOTE: these path_map_ entries are referenced by the GUI2 WML
103  // definition of this dialog using preprocessor macros.
104  path_map_["datadir"] = game_config::path;
105  path_map_["config"] = filesystem::get_user_config_dir();
106  path_map_["userdata"] = filesystem::get_user_data_dir();
107  path_map_["saves"] = filesystem::get_saves_dir();
108  path_map_["addons"] = filesystem::get_addons_dir();
109  path_map_["cache"] = filesystem::get_cache_dir();
110 
111  for(unsigned k = 0; k < game_config::LIB_COUNT; ++k) {
113 
115  e[0] = game_config::library_name(lib);
116  if(e[0].empty()) {
117  continue;
118  }
121  deps_.push_back(e);
122  }
123 
124  generate_plain_text_report();
125 }
126 
128 {
129  string_map i18n_syms;
130 
131  //
132  // General information.
133  //
134 
135  styled_widget& version_label = find_widget<styled_widget>(&window, "version", false);
136  i18n_syms["version"] = game_config::revision;
137  version_label.set_label(VGETTEXT("Version $version", i18n_syms));
138 
139  styled_widget& os_label = find_widget<styled_widget>(&window, "os", false);
140  i18n_syms["os"] = desktop::os_version();
141  os_label.set_label(VGETTEXT("Running on $os", i18n_syms));
142 
143  button& copy_all = find_widget<button>(&window, "copy_all", false);
145  copy_all,
146  std::bind(&game_version::report_copy_callback, this));
147 
148  //
149  // Game paths tab.
150  //
151 
152  for(const auto & path_ent : path_map_)
153  {
154  const std::string& path_id = path_ent.first;
155  const std::string& path_path = filesystem::normalize_path(path_ent.second, true);
156 
157  text_box_base& path_w
158  = find_widget<text_box_base>(&window, path_wid_stem_ + path_id, false);
159  button& copy_w = find_widget<button>(
160  &window, copy_wid_stem_ + path_id, false);
161  button& browse_w = find_widget<button>(
162  &window, browse_wid_stem_ + path_id, false);
163 
164  path_w.set_value(path_path);
165  path_w.set_active(false);
166 
168  copy_w,
170  this,
171  path_path));
173  browse_w,
175  this,
176  path_path));
177 
179  // No point in displaying these on platforms that can't do
180  // open_object().
181  browse_w.set_visible(widget::visibility::invisible);
182  }
183 
185  copy_w.set_active(false);
186  copy_w.set_tooltip(_("Clipboard support not found, contact your packager"));
187  }
188  }
189 
190 #ifndef _WIN32
191  grid& w32_options_grid
192  = find_widget<grid>(&window, "win32_paths", false);
193  w32_options_grid.set_visible(widget::visibility::invisible);
194 #else
195  button& stderr_button
196  = find_widget<button>(&window, "open_stderr", false);
198  stderr_button,
200  this,
201  log_path_));
202  stderr_button.set_active(!log_path_.empty());
203 #endif
204 
205  //
206  // Build info tab.
207  //
208 
209  std::map<std::string, string_map> list_data;
210 
211  listbox& deps_listbox
212  = find_widget<listbox>(&window, "deps_listbox", false);
213 
214  for(const auto & dep : deps_)
215  {
216  list_data["dep_name"]["label"] = dep[0];
217 
218  list_data["dep_build_version"]["label"] = dep[1];
219 
220  // The build version is always known, but runtime version isn't, esp.
221  // for header-only libraries like Boost for which the concept does not
222  // apply.
223  if(!dep[2].empty()) {
224  list_data["dep_rt_version"]["label"] = dep[2];
225  } else {
226  list_data["dep_rt_version"]["label"] = _("version^N/A");
227  }
228 
229  deps_listbox.add_row(list_data);
230  }
231 
232  deps_listbox.select_row(0);
233  list_data.clear();
234 
235  //
236  // Features tab.
237  //
238 
239  listbox& opts_listbox
240  = find_widget<listbox>(&window, "opts_listbox", false);
241 
242  for(const auto & opt : opts_)
243  {
244  list_data["opt_name"]["label"] = opt.name;
245 
246  if(opt.enabled) {
247  list_data["opt_status"]["label"] = text_feature_on;
248  } else {
249  list_data["opt_status"]["label"] = text_feature_off;
250  }
251  list_data["opt_status"]["use_markup"] = "true";
252 
253  opts_listbox.add_row(list_data);
254  }
255 
256  opts_listbox.select_row(0);
257  list_data.clear();
258 
259  //
260  // Set-up page stack and auxiliary controls last.
261  //
262 
263  stacked_widget& pager
264  = find_widget<stacked_widget>(&window, "tabs_container", false);
265  pager.select_layer(0);
266 
267  listbox& tab_bar
268  = find_widget<listbox>(&window, "tab_bar", false);
269 
270  window.keyboard_capture(&tab_bar);
271 
272  const unsigned tab_count = tab_bar.get_item_count();
273  VALIDATE(tab_count == pager.get_layer_count(), "Tab bar and container size mismatch");
274 
276  std::bind(&game_version::tab_switch_callback, this, std::ref(window)));
277 }
278 
280 {
281  stacked_widget& pager
282  = find_widget<stacked_widget>(&window, "tabs_container", false);
283  listbox& tab_bar
284  = find_widget<listbox>(&window, "tab_bar", false);
285 
286  pager.select_layer(std::max<int>(0, tab_bar.get_selected_row()));
287 }
288 
290 {
291  desktop::open_object(path);
292 }
293 
295 {
297 }
298 
300 {
302 }
303 
305 {
307 }
308 
309 } // namespace dialogs
310 } // namespace gui2
void report_copy_callback()
Callback function for the dialog-wide copy-to-clipboard button.
Abstract base class for text items.
const std::string path_wid_stem_
The display function.
std::string log_file_path()
Returns the path to the current log file.
bool available()
Whether wesnoth was compiled with support for a clipboard.
Definition: clipboard.cpp:56
unsigned int get_layer_count() const
Gets the total number of layers.
std::map< std::string, std::string > path_map_
This file contains the window object, this object is a top level container which has the event manage...
std::array< std::string, 4 > deplist_entry
const std::string & library_build_version(LIBRARY_ID lib)
Retrieve the build-time version number of the given library.
Definition: build_info.cpp:299
std::string normalize_path(const std::string &fpath, bool normalize_separators, bool resolve_dot_entries)
Returns the absolute path of a file.
virtual void pre_show(window &window) override
Inherited from modal_dialog.
std::string get_saves_dir()
bool select_row(const unsigned row, const bool select=true)
Selects a row.
Definition: listbox.cpp:250
Generic file dialog.
Definition: field-fwd.hpp:22
virtual void set_label(const t_string &label)
const std::string browse_wid_stem_
The listbox class.
Definition: listbox.hpp:42
Base container class.
Definition: grid.hpp:30
Desktop environment interaction functions.
static UNUSEDNOWARN std::string _(const char *str)
Definition: gettext.hpp:89
void copy_to_clipboard_callback(const std::string &path)
Callback function for copy-to-clipboard action buttons.
const std::string & library_name(LIBRARY_ID lib)
Retrieve the user-visible name for the given library.
Definition: build_info.cpp:317
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:179
std::vector< deplist_entry > deps_
#define VALIDATE(cond, message)
The macro to use for the validation of WML.
std::vector< optional_feature > optional_features_table()
Return a localized features table.
Definition: build_info.cpp:289
This file contains the settings handling of the widget library.
std::string get_user_data_dir()
Definition: filesystem.cpp:749
void set_visible(const visibility visible)
Definition: widget.cpp:456
void browse_directory_callback(const std::string &path)
Callback function for browse-directory action buttons.
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:164
std::string path
Definition: game_config.cpp:39
unsigned get_item_count() const
Returns the number of items in the listbox.
Definition: listbox.cpp:133
const std::string copy_wid_stem_
Platform identification and version information functions.
Various uncategorised dialogs.
bool open_object(const std::string &path_or_url)
Opens the specified object with the default application configured for its type.
Definition: open.cpp:55
std::string get_cache_dir()
Definition: filesystem.cpp:754
Log file control routines for Windows.
const std::string revision
Definition: version.cpp:42
The user set the widget invisible, that means:
std::string os_version()
Returns a string with the running OS name and version information.
Definition: version.cpp:118
const std::string & library_runtime_version(LIBRARY_ID lib)
Retrieve the runtime version number of the given library.
Definition: build_info.cpp:308
std::map< std::string, t_string > string_map
Definition: widget.hpp:24
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
Declarations for File-IO.
Base class for all visible items.
#define VGETTEXT(msgid,...)
void select_layer(const int layer)
Selects and displays a particular layer.
std::vector< game_config::optional_feature > opts_
std::string get_user_config_dir()
Definition: filesystem.cpp:720
virtual void set_value(const std::string &text)
The set_value is virtual for the password_box class.
bool open_object_is_supported()
Returns whether open_object() is supported/implemented for the current platform.
Definition: open.cpp:46
virtual void set_active(const bool active) override
See styled_widget::set_active.
Definition: button.cpp:62
void copy_to_clipboard(const std::string &text, const bool)
Copies text to the clipboard.
Definition: clipboard.cpp:35
std::string get_addons_dir()
Simple push button.
Definition: button.hpp:35
#define e
void tab_switch_callback(window &window)
Callback function called when switching tabs.
base class of top level items, the only item which needs to store the final canvases to draw on ...
Definition: window.hpp:63
std::string path
File path.
std::string full_build_report()
Produce a bug report-style info dump.
Definition: build_info.cpp:420
virtual void set_active(const bool active) override
See styled_widget::set_active.