The Battle for Wesnoth  1.15.9+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 <functional>
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 REGISTER_DIALOG(game_version)
58 
60  : path_wid_stem_("path_")
61  , copy_wid_stem_("copy_")
62  , browse_wid_stem_("browse_")
63  , path_map_()
64 #ifdef _WIN32
65  , log_path_(lg::log_file_path())
66 #endif
67  , deps_()
69  , report_()
70 {
71  // NOTE: these path_map_ entries are referenced by the GUI2 WML
72  // definition of this dialog using preprocessor macros.
73  path_map_["datadir"] = game_config::path;
74  path_map_["config"] = filesystem::get_user_config_dir();
75  path_map_["userdata"] = filesystem::get_user_data_dir();
76  path_map_["saves"] = filesystem::get_saves_dir();
77  path_map_["addons"] = filesystem::get_addons_dir();
78  path_map_["cache"] = filesystem::get_cache_dir();
79 
80  for(unsigned k = 0; k < game_config::LIB_COUNT; ++k) {
82 
84  e[0] = game_config::library_name(lib);
85  if(e[0].empty()) {
86  continue;
87  }
90  deps_.push_back(e);
91  }
92 
93  generate_plain_text_report();
94 }
95 
97 {
98  string_map i18n_syms;
99 
100  //
101  // General information.
102  //
103 
104  styled_widget& version_label = find_widget<styled_widget>(&window, "version", false);
105  i18n_syms["version"] = game_config::revision;
106  version_label.set_label(VGETTEXT("Version $version", i18n_syms));
107 
108  styled_widget& os_label = find_widget<styled_widget>(&window, "os", false);
109  i18n_syms["os"] = desktop::os_version();
110  os_label.set_label(VGETTEXT("Running on $os", i18n_syms));
111 
112  button& copy_all = find_widget<button>(&window, "copy_all", false);
114  copy_all,
115  std::bind(&game_version::report_copy_callback, this));
116 
117  //
118  // Game paths tab.
119  //
120 
121  for(const auto & path_ent : path_map_)
122  {
123  const std::string& path_id = path_ent.first;
124  const std::string& path_path = filesystem::normalize_path(path_ent.second, true);
125 
126  text_box_base& path_w
127  = find_widget<text_box_base>(&window, path_wid_stem_ + path_id, false);
128  button& copy_w = find_widget<button>(
129  &window, copy_wid_stem_ + path_id, false);
130  button& browse_w = find_widget<button>(
131  &window, browse_wid_stem_ + path_id, false);
132 
133  path_w.set_value(path_path);
134  path_w.set_active(false);
135 
137  copy_w,
139  this,
140  path_path));
142  browse_w,
144  this,
145  path_path));
146 
148  // No point in displaying these on platforms that can't do
149  // open_object().
150  browse_w.set_visible(widget::visibility::invisible);
151  }
152 
154  copy_w.set_active(false);
155  copy_w.set_tooltip(_("Clipboard support not found, contact your packager"));
156  }
157  }
158 
159 #ifndef _WIN32
160  grid& w32_options_grid
161  = find_widget<grid>(&window, "win32_paths", false);
162  w32_options_grid.set_visible(widget::visibility::invisible);
163 #else
164  button& stderr_button
165  = find_widget<button>(&window, "open_stderr", false);
167  stderr_button,
169  this,
170  log_path_));
171  stderr_button.set_active(!log_path_.empty());
172 #endif
173 
174  //
175  // Build info tab.
176  //
177 
178  std::map<std::string, string_map> list_data;
179 
180  listbox& deps_listbox
181  = find_widget<listbox>(&window, "deps_listbox", false);
182 
183  for(const auto & dep : deps_)
184  {
185  list_data["dep_name"]["label"] = dep[0];
186 
187  list_data["dep_build_version"]["label"] = dep[1];
188 
189  // The build version is always known, but runtime version isn't, esp.
190  // for header-only libraries like Boost for which the concept does not
191  // apply.
192  if(!dep[2].empty()) {
193  list_data["dep_rt_version"]["label"] = dep[2];
194  } else {
195  list_data["dep_rt_version"]["label"] = font::unicode_em_dash;
196  }
197 
198  deps_listbox.add_row(list_data);
199  }
200 
201  deps_listbox.select_row(0);
202  list_data.clear();
203 
204  //
205  // Features tab.
206  //
207 
208  listbox& opts_listbox
209  = find_widget<listbox>(&window, "opts_listbox", false);
210 
211  for(const auto & opt : opts_)
212  {
213  list_data["opt_name"]["label"] = opt.name;
214 
215  if(opt.enabled) {
216  list_data["opt_status"]["label"] = text_feature_on;
217  } else {
218  list_data["opt_status"]["label"] = text_feature_off;
219  }
220  list_data["opt_status"]["use_markup"] = "true";
221 
222  opts_listbox.add_row(list_data);
223  }
224 
225  opts_listbox.select_row(0);
226  list_data.clear();
227 
228  //
229  // Set-up page stack and auxiliary controls last.
230  //
231 
232  stacked_widget& pager
233  = find_widget<stacked_widget>(&window, "tabs_container", false);
234  pager.select_layer(0);
235 
236  listbox& tab_bar
237  = find_widget<listbox>(&window, "tab_bar", false);
238 
239  window.keyboard_capture(&tab_bar);
240 
241  const unsigned tab_count = tab_bar.get_item_count();
242  VALIDATE(tab_count == pager.get_layer_count(), "Tab bar and container size mismatch");
243 
245  std::bind(&game_version::tab_switch_callback, this));
246 }
247 
249 {
250  stacked_widget& pager
251  = find_widget<stacked_widget>(get_window(), "tabs_container", false);
252  listbox& tab_bar
253  = find_widget<listbox>(get_window(), "tab_bar", false);
254 
255  pager.select_layer(std::max<int>(0, tab_bar.get_selected_row()));
256 }
257 
259 {
260  desktop::open_object(path);
261 }
262 
264 {
266 }
267 
269 {
271 }
272 
274 {
276 }
277 
278 } // namespace dialogs
279 } // 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:54
unsigned int get_layer_count() const
Gets the total number of layers.
std::map< std::string, std::string > path_map_
void tab_switch_callback()
Callback function called when switching tabs.
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
Dialog displaying the various paths used by the game to locate resource and configuration files...
window * get_window() const
Returns a pointer to the dialog&#39;s window.
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.
static std::string _(const char *str)
Definition: gettext.hpp:92
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:251
Generic file dialog.
Definition: field-fwd.hpp:22
constexpr bool open_object_is_supported()
Returns whether open_object() is supported/implemented for the current platform.
Definition: open.hpp:53
virtual void set_label(const t_string &label)
The listbox class.
Definition: listbox.hpp:42
Base container class.
Definition: grid.hpp:30
Desktop environment interaction functions.
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:186
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:791
void set_visible(const visibility visible)
Definition: widget.cpp:475
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:171
std::string path
Definition: game_config.cpp:39
unsigned get_item_count() const
Returns the number of items in the listbox.
Definition: listbox.cpp:132
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:46
std::string get_cache_dir()
Definition: filesystem.cpp:796
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:163
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: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
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:762
virtual void set_value(const std::string &text)
The set_value is virtual for the password_box class.
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:33
std::string get_addons_dir()
const std::string unicode_em_dash
Definition: constants.cpp:40
Simple push button.
Definition: button.hpp:35
#define e
A stacked widget holds several widgets on top of each other.
base class of top level items, the only item which needs to store the final canvases to draw on...
Definition: window.hpp:64
std::string full_build_report()
Produce a bug report-style info dump.
Definition: build_info.cpp:616
virtual void set_active(const bool active) override
See styled_widget::set_active.