The Battle for Wesnoth  1.17.0-dev
screenshot_notification.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2013 - 2021
3  by Iris Morelle <shadowm2006@gmail.com>
4  Part of the Battle for Wesnoth Project https://www.wesnoth.org/
5 
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY.
12 
13  See the COPYING file for more details.
14 */
15 
16 #define GETTEXT_DOMAIN "wesnoth-lib"
17 
19 
20 #include "desktop/clipboard.hpp"
21 #include "desktop/open.hpp"
22 #include "filesystem.hpp"
23 #include "gettext.hpp"
26 #include "gui/dialogs/message.hpp"
27 #include "gui/widgets/button.hpp"
28 #include "gui/widgets/label.hpp"
29 #include "gui/widgets/text_box.hpp"
30 #include "gui/widgets/window.hpp"
31 #include "picture.hpp"
32 
33 #include <boost/filesystem/path.hpp>
34 
35 #include <functional>
36 #include <stdexcept>
37 
38 namespace gui2::dialogs
39 {
40 
41 REGISTER_DIALOG(screenshot_notification)
42 
44  : path_(path)
45  , screenshots_dir_path_(filesystem::get_screenshot_dir())
46  , screenshot_(screenshot)
47 {
48 }
49 
51 {
52  window.set_enter_disabled(true);
53 
54  text_box& path_box = find_widget<text_box>(&window, "path", false);
56  path_box.set_selection(0, path_box.text().find_last_of('.')); // TODO: do this cleaner!
57  window.keyboard_capture(&path_box);
59  std::placeholders::_3, std::placeholders::_5));
60 
61  find_widget<label>(&window, "filesize", false).set_label(font::unicode_em_dash);
62 
63  button& copy_b = find_widget<button>(&window, "copy", false);
65  copy_b, std::bind(&desktop::clipboard::copy_to_clipboard, std::ref(path_), false));
66  copy_b.set_active(false);
67 
69  copy_b.set_tooltip(_("Clipboard support not found, contact your packager"));
70  }
71 
72  button& open_b = find_widget<button>(&window, "open", false);
74  open_b, std::bind(&desktop::open_object, std::ref(path_)));
75  open_b.set_active(false);
76 
77  button& bdir_b = find_widget<button>(&window, "browse_dir", false);
79  bdir_b,
80  std::bind(&desktop::open_object,
81  std::ref(screenshots_dir_path_)));
82 
83  button& save_b = find_widget<button>(&window, "save", false);
85 }
86 
88 {
89  text_box& path_box = find_widget<text_box>(get_window(), "path", false);
90  std::string filename = path_box.get_value();
92  path /= filename;
93 
94  path_ = path.string();
95 
96  image::save_result res = image::save_image(screenshot_, path.string());
98  gui2::show_error_message(_("Unsupported image format.\n\n"
99  "Try to save the screenshot as PNG instead."));
100  } else if(res == image::save_result::save_failed) {
102  translation::dsgettext("wesnoth", "Screenshot creation failed.\n\n"
103  "Make sure there is enough space on the drive holding Wesnoth’s player resource files and that file permissions are set up correctly."));
104  } else if(res != image::save_result::success) {
105  throw std::logic_error("Unexpected error while trying to save a screenshot");
106  } else {
107  path_box.set_active(false);
108  find_widget<button>(get_window(), "open", false).set_active(true);
109  find_widget<button>(get_window(), "save", false).set_active(false);
110 
112  find_widget<button>(get_window(), "copy", false).set_active(true);
113  }
114 
115  const int filesize = filesystem::file_size(path_);
116  const std::string sizetext = utils::si_string(filesize, true, _("unit_byte^B"));
117  find_widget<label>(get_window(), "filesize", false).set_label(sizetext);
118  }
119 }
120 
121 void screenshot_notification::keypress_callback(bool& handled, SDL_Keycode key)
122 {
123  if(key == SDLK_RETURN || key == SDLK_KP_ENTER) {
124  save_screenshot();
125  handled = true;
126  }
127 }
128 
129 } // namespace dialogs
void set_selection(std::size_t start, int length)
Sets or clears the text selection.
bool available()
Whether wesnoth was compiled with support for a clipboard.
Definition: clipboard.cpp:55
save_result
Definition: picture.hpp:300
std::string get_value() const
This file contains the window object, this object is a top level container which has the event manage...
std::string get_screenshot_dir()
save_result save_image(const locator &i_locator, const std::string &filename)
Definition: picture.cpp:1081
STL namespace.
window * get_window() const
Returns a pointer to the dialog&#39;s window.
static std::string _(const char *str)
Definition: gettext.hpp:93
Notification dialog used after saving a game or map screenshot to display information about it for th...
std::string dsgettext(const char *domainname, const char *msgid)
Definition: gettext.cpp:401
Class for a single line text area.
Definition: text_box.hpp:141
Desktop environment interaction functions.
void set_tooltip(const t_string &tooltip)
std::string si_string(double input, bool base2, const std::string &unit)
Convert into a string with an SI-postfix.
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:172
std::string path
Definition: game_config.cpp:39
bool open_object([[maybe_unused]] const std::string &path_or_url)
Definition: open.cpp:47
std::string path_
The display function.
Declarations for File-IO.
std::string base_name(const std::string &file, const bool remove_extension)
Returns the base filename of a file, with directory name stripped.
int file_size(const std::string &fname)
Returns the size of a file, or -1 if the file doesn&#39;t exist.
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:63
void copy_to_clipboard(const std::string &text, const bool)
Copies text to the clipboard.
Definition: clipboard.cpp:34
void connect_signal_pre_key_press(dispatcher &dispatcher, const signal_keyboard_function &signal)
Connects the signal for &#39;snooping&#39; on the keypress.
Definition: dispatcher.cpp:167
const std::string & text() const
const std::string unicode_em_dash
Definition: constants.cpp:44
virtual void pre_show(window &window) override
Actions to be taken before showing the window.
Simple push button.
Definition: button.hpp:36
void show_error_message(const std::string &msg, bool message_use_markup)
Shows an error message to the user.
Definition: message.cpp:206
base class of top level items, the only item which needs to store the final canvases to draw on...
Definition: window.hpp:65
virtual void set_active(const bool active) override
See styled_widget::set_active.
void keypress_callback(bool &handled, const SDL_Keycode key)
void set_enter_disabled(const bool enter_disabled)
Disable the enter key.
Definition: window.hpp:286