The Battle for Wesnoth  1.15.2+dev
game_version_dialog.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 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 
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 #include "gui/widgets/listbox.hpp"
31 #include "gui/widgets/settings.hpp"
34 #include "gui/widgets/window.hpp"
35 #ifdef _WIN32
36 #include "log_windows.hpp"
37 #endif
38 #include "formula/string_utils.hpp"
39 
40 #include "gettext.hpp"
41 
42 #include "utils/functional.hpp"
43 
44 namespace
45 {
46 
47 const std::string text_feature_on = "<span color='#0f0'>&#9679;</span>";
48 const std::string text_feature_off = "<span color='#f00'>&#9679;</span>";
49 
50 } // end anonymous namespace
51 
52 namespace gui2
53 {
54 namespace dialogs
55 {
56 
57 /*WIKI
58  * @page = GUIWindowDefinitionWML
59  * @order = 2_game_version
60  *
61  * == Game paths ==
62  *
63  * Dialog displaying the various paths used by the game to locate
64  * resource and configuration files.
65  *
66  * There are several item types used to build widget ids in this dialog.
67  * All references to TYPE below refer to the following suffixes:
68  * datadir, config, userdata, saves, addons, cache.
69  *
70  * @begin{table}{dialog_widgets}
71  *
72  * path_TYPE & & text_box & m &
73  * Textbox containing the filesystem path for the given item. $
74  *
75  * copy_TYPE & & button & m &
76  * Copies the given item's path to clipboard. $
77  *
78  * browse_TYPE & & button & m &
79  * Launches the default file browser on the given item's path. $
80  *
81  * @end{table}
82  */
83 
84 REGISTER_DIALOG(game_version)
85 
87  : path_wid_stem_("path_")
88  , copy_wid_stem_("copy_")
89  , browse_wid_stem_("browse_")
90  , path_map_()
91 #ifdef _WIN32
92  , log_path_(lg::log_file_path())
93 #endif
94  , deps_()
96  , report_()
97 {
98  // NOTE: these path_map_ entries are referenced by the GUI2 WML
99  // definition of this dialog using preprocessor macros.
100  path_map_["datadir"] = game_config::path;
101  path_map_["config"] = filesystem::get_user_config_dir();
102  path_map_["userdata"] = filesystem::get_user_data_dir();
103  path_map_["saves"] = filesystem::get_saves_dir();
104  path_map_["addons"] = filesystem::get_addons_dir();
105  path_map_["cache"] = filesystem::get_cache_dir();
106 
107  for(unsigned k = 0; k < game_config::LIB_COUNT; ++k) {
109 
111  e[0] = game_config::library_name(lib);
112  if(e[0].empty()) {
113  continue;
114  }
117  deps_.push_back(e);
118  }
119 
120  generate_plain_text_report();
121 }
122 
124 {
125  string_map i18n_syms;
126 
127  //
128  // General information.
129  //
130 
131  styled_widget& version_label = find_widget<styled_widget>(&window, "version", false);
132  i18n_syms["version"] = game_config::revision;
133  version_label.set_label(VGETTEXT("Version $version", i18n_syms));
134 
135  styled_widget& os_label = find_widget<styled_widget>(&window, "os", false);
136  i18n_syms["os"] = desktop::os_version();
137  os_label.set_label(VGETTEXT("Running on $os", i18n_syms));
138 
139  button& copy_all = find_widget<button>(&window, "copy_all", false);
141  copy_all,
142  std::bind(&game_version::report_copy_callback, this));
143 
144  //
145  // Game paths tab.
146  //
147 
148  for(const auto & path_ent : path_map_)
149  {
150  const std::string& path_id = path_ent.first;
151  const std::string& path_path = filesystem::normalize_path(path_ent.second, true);
152 
153  text_box_base& path_w
154  = find_widget<text_box_base>(&window, path_wid_stem_ + path_id, false);
155  button& copy_w = find_widget<button>(
156  &window, copy_wid_stem_ + path_id, false);
157  button& browse_w = find_widget<button>(
158  &window, browse_wid_stem_ + path_id, false);
159 
160  path_w.set_value(path_path);
161  path_w.set_active(false);
162 
164  copy_w,
166  this,
167  path_path));
169  browse_w,
171  this,
172  path_path));
173 
175  // No point in displaying these on platforms that can't do
176  // open_object().
177  browse_w.set_visible(widget::visibility::invisible);
178  }
179 
181  copy_w.set_active(false);
182  copy_w.set_tooltip(_("Clipboard support not found, contact your packager"));
183  }
184  }
185 
186 #ifndef _WIN32
187  grid& w32_options_grid
188  = find_widget<grid>(&window, "win32_paths", false);
189  w32_options_grid.set_visible(widget::visibility::invisible);
190 #else
191  button& stderr_button
192  = find_widget<button>(&window, "open_stderr", false);
194  stderr_button,
196  this,
197  log_path_));
198  stderr_button.set_active(!log_path_.empty());
199 #endif
200 
201  //
202  // Build info tab.
203  //
204 
205  std::map<std::string, string_map> list_data;
206 
207  listbox& deps_listbox
208  = find_widget<listbox>(&window, "deps_listbox", false);
209 
210  for(const auto & dep : deps_)
211  {
212  list_data["dep_name"]["label"] = dep[0];
213 
214  list_data["dep_build_version"]["label"] = dep[1];
215 
216  // The build version is always known, but runtime version isn't, esp.
217  // for header-only libraries like Boost for which the concept does not
218  // apply.
219  if(!dep[2].empty()) {
220  list_data["dep_rt_version"]["label"] = dep[2];
221  } else {
222  list_data["dep_rt_version"]["label"] = _("version^N/A");
223  }
224 
225  deps_listbox.add_row(list_data);
226  }
227 
228  deps_listbox.select_row(0);
229  list_data.clear();
230 
231  //
232  // Features tab.
233  //
234 
235  listbox& opts_listbox
236  = find_widget<listbox>(&window, "opts_listbox", false);
237 
238  for(const auto & opt : opts_)
239  {
240  list_data["opt_name"]["label"] = opt.name;
241 
242  if(opt.enabled) {
243  list_data["opt_status"]["label"] = text_feature_on;
244  } else {
245  list_data["opt_status"]["label"] = text_feature_off;
246  }
247  list_data["opt_status"]["use_markup"] = "true";
248 
249  opts_listbox.add_row(list_data);
250  }
251 
252  opts_listbox.select_row(0);
253  list_data.clear();
254 
255  //
256  // Set-up page stack and auxiliary controls last.
257  //
258 
259  stacked_widget& pager
260  = find_widget<stacked_widget>(&window, "tabs_container", false);
261  pager.select_layer(0);
262 
263  listbox& tab_bar
264  = find_widget<listbox>(&window, "tab_bar", false);
265 
266  window.keyboard_capture(&tab_bar);
267 
268  const unsigned tab_count = tab_bar.get_item_count();
269  VALIDATE(tab_count == pager.get_layer_count(), "Tab bar and container size mismatch");
270 
272  std::bind(&game_version::tab_switch_callback, this, std::ref(window)));
273 }
274 
276 {
277  stacked_widget& pager
278  = find_widget<stacked_widget>(&window, "tabs_container", false);
279  listbox& tab_bar
280  = find_widget<listbox>(&window, "tab_bar", false);
281 
282  pager.select_layer(std::max<int>(0, tab_bar.get_selected_row()));
283 }
284 
286 {
287  desktop::open_object(path);
288 }
289 
291 {
293 }
294 
296 {
298 }
299 
301 {
303 }
304 
305 } // namespace dialogs
306 } // 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:322
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)
The listbox class.
Definition: listbox.hpp:40
Base container class.
Definition: grid.hpp:30
Desktop environment interaction functions.
static UNUSEDNOWARN std::string _(const char *str)
Definition: gettext.hpp:91
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:340
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
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:312
This file contains the settings handling of the widget library.
std::string get_user_data_dir()
Definition: filesystem.cpp:780
void set_visible(const visibility visible)
Definition: widget.cpp:473
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:233
std::string path
Definition: game_config.cpp:39
unsigned get_item_count() const
Returns the number of items in the listbox.
Definition: listbox.cpp:131
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:785
Log file control routines for Windows.
const std::string revision
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:121
const std::string & library_runtime_version(LIBRARY_ID lib)
Retrieve the runtime version number of the given library.
Definition: build_info.cpp:331
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:66
Declarations for File-IO.
Base class for all visible items.
#define VGETTEXT(msgid,...)
Handy wrappers around interpolate_variables_into_string and gettext.
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:751
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 full_build_report()
Produce a bug report-style info dump.
Definition: build_info.cpp:443
virtual void set_active(const bool active) override
See styled_widget::set_active.