The Battle for Wesnoth  1.15.11+dev
screenshot_notification.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 "desktop/clipboard.hpp"
20 #include "desktop/open.hpp"
21 #include "filesystem.hpp"
22 #include "gettext.hpp"
25 #include "gui/dialogs/message.hpp"
26 #include "gui/widgets/button.hpp"
27 #include "gui/widgets/label.hpp"
28 #include "gui/widgets/text_box.hpp"
29 #include "gui/widgets/window.hpp"
30 #include "picture.hpp"
31 
32 #include <boost/filesystem/path.hpp>
33 
34 #include <functional>
35 #include <stdexcept>
36 
37 namespace gui2::dialogs
38 {
39 
40 REGISTER_DIALOG(screenshot_notification)
41 
43  : path_(path)
44  , screenshots_dir_path_(filesystem::get_screenshot_dir())
45  , screenshot_(screenshot)
46 {
47 }
48 
50 {
51  window.set_enter_disabled(true);
52 
53  text_box& path_box = find_widget<text_box>(&window, "path", false);
55  path_box.set_selection(0, path_box.text().find_last_of('.')); // TODO: do this cleaner!
56  window.keyboard_capture(&path_box);
58  std::placeholders::_3, std::placeholders::_5));
59 
60  find_widget<label>(&window, "filesize", false).set_label(font::unicode_em_dash);
61 
62  button& copy_b = find_widget<button>(&window, "copy", false);
64  copy_b, std::bind(&desktop::clipboard::copy_to_clipboard, std::ref(path_), false));
65  copy_b.set_active(false);
66 
68  copy_b.set_tooltip(_("Clipboard support not found, contact your packager"));
69  }
70 
71  button& open_b = find_widget<button>(&window, "open", false);
73  open_b, std::bind(&desktop::open_object, std::ref(path_)));
74  open_b.set_active(false);
75 
76  button& bdir_b = find_widget<button>(&window, "browse_dir", false);
78  bdir_b,
79  std::bind(&desktop::open_object,
80  std::ref(screenshots_dir_path_)));
81 
82  button& save_b = find_widget<button>(&window, "save", false);
84 }
85 
87 {
88  text_box& path_box = find_widget<text_box>(get_window(), "path", false);
89  std::string filename = path_box.get_value();
91  path /= filename;
92 
93  path_ = path.string();
94 
95  image::save_result res = image::save_image(screenshot_, path.string());
97  gui2::show_error_message(_("Unsupported image format.\n\n"
98  "Try to save the screenshot as PNG instead."));
99  } else if(res == image::save_result::save_failed) {
101  translation::dsgettext("wesnoth", "Screenshot creation failed.\n\n"
102  "Make sure there is enough space on the drive holding Wesnoth’s player resource files and that file permissions are set up correctly."));
103  } else if(res != image::save_result::success) {
104  throw std::logic_error("Unexpected error while trying to save a screenshot");
105  } else {
106  path_box.set_active(false);
107  find_widget<button>(get_window(), "open", false).set_active(true);
108  find_widget<button>(get_window(), "save", false).set_active(false);
109 
111  find_widget<button>(get_window(), "copy", false).set_active(true);
112  }
113 
114  const int filesize = filesystem::file_size(path_);
115  const std::string sizetext = utils::si_string(filesize, true, _("unit_byte^B"));
116  find_widget<label>(get_window(), "filesize", false).set_label(sizetext);
117  }
118 }
119 
120 void screenshot_notification::keypress_callback(bool& handled, SDL_Keycode key)
121 {
122  if(key == SDLK_RETURN || key == SDLK_KP_ENTER) {
123  save_screenshot();
124  handled = true;
125  }
126 }
127 
128 } // 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:54
save_result
Definition: picture.hpp:299
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:1080
STL namespace.
window * get_window() const
Returns a pointer to the dialog&#39;s window.
static std::string _(const char *str)
Definition: gettext.hpp:92
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:402
Class for a single line text area.
Definition: text_box.hpp:140
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:171
std::string path
Definition: game_config.cpp:38
bool open_object([[maybe_unused]] const std::string &path_or_url)
Definition: open.cpp:46
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:62
void copy_to_clipboard(const std::string &text, const bool)
Copies text to the clipboard.
Definition: clipboard.cpp:33
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:166
const std::string & text() const
const std::string unicode_em_dash
Definition: constants.cpp:43
virtual void pre_show(window &window) override
Actions to be taken before showing the window.
Simple push button.
Definition: button.hpp:35
void show_error_message(const std::string &msg, bool message_use_markup)
Shows an error message to the user.
Definition: message.cpp:205
base class of top level items, the only item which needs to store the final canvases to draw on...
Definition: window.hpp:64
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:285