gui2/tchat_log: Add a button to copy the filtered page contents to clipboard

This copies the current contents of the dialog to clipboard. The button
currently lacks a tooltip because the tooltip has the potential to cause
map labels to glitch through the dialog when displayed (see commit
eab3e6fb64 and bug #22176).

(The tooltip should also remain commented-out because this is a backport
to 1.12.)
This commit is contained in:
Ignacio R. Morelle 2014-06-11 20:29:43 -04:00
parent 16e642b654
commit 799e09d94a
4 changed files with 64 additions and 9 deletions

View file

@ -31,6 +31,7 @@ Version 1.11.15+dev:
* Fixed most of the minimap buttons and the End Turn button appearing
without contents or in the wrong state during WML start events until they
are interacted with or control is given to the player for the first time.
* Added a button to copy the in-game Chat Log dialog contents to clipboard.
* WML engine:
* Fixed a regression in 1.11.14 causing WML parser/preprocessor errors to
not interrupt the game load sequence or display an error message in-game,

View file

@ -162,17 +162,43 @@
grow_factor = 0
[column]
grow_factor = 0
border = "all"
border_size = 5
horizontal_alignment = "right"
[button]
id = "cancel"
definition = "default"
label = _ "Close"
[/button]
horizontal_grow = "true"
[grid]
[row]
[column]
grow_factor = 0
border = "all"
border_size = 5
horizontal_alignment = "left"
[button]
id = "copy"
definition = "action_copy"
label = _ "clipboard^Copy"
# FIXME: tooltips cause weird interactions with map
# labels while running a GUI2 dialog, so let's
# not use a tooltip yet.
#tooltip = _ "Copy this log to clipboard"
[/button]
[/column]
[column]
grow_factor = 0
border = "all"
border_size = 5
horizontal_alignment = "right"
[button]
id = "cancel"
definition = "default"
label = _ "Close"
[/button]
[/column]
[/row]
[/grid]
[/column]
[/row]
[/grid]
[/resolution]
[/window]
# kate: indent-mode normal; encoding utf-8; space-indent on;

View file

@ -10,6 +10,7 @@ Version 1.11.15+dev:
* Fixed most of the minimap buttons and the End Turn button appearing
without contents or in the wrong state during WML start events until they
are interacted with or control is given to the player for the first time.
* Added a button to copy the in-game Chat Log dialog contents to clipboard.
* WML engine:
* Fixed a regression in 1.11.14 causing WML parser/preprocessor errors to

View file

@ -30,6 +30,7 @@
#include "gui/widgets/slider.hpp"
#include "utils/foreach.tpp"
#include "../../clipboard.hpp"
#include "../../game_preferences.hpp"
#include "../../gamestatus.hpp"
#include "../../log.hpp"
@ -77,6 +78,7 @@ public:
, previous_page()
, next_page()
, filter()
, copy_button()
{
LOG_CHAT_LOG << "entering tchat_log::model...\n";
LOG_CHAT_LOG << "finished tchat_log::model...\n";
@ -91,6 +93,7 @@ public:
tbutton* previous_page;
tbutton* next_page;
ttext_box* filter;
tbutton* copy_button;
void clear_chat_msg_list()
{
@ -192,6 +195,13 @@ public:
stream_log(s, first, last);
msg_label->set_label(s.str());
}
void chat_message_list_to_clipboard(int first, int last)
{
std::ostringstream s;
stream_log(s, first, last, true);
copy_to_clipboard(s.str(), false);
}
};
// The controller acts upon the model. It retrieves data from repositories,
@ -305,6 +315,11 @@ public:
<< std::endl;
}
void handle_copy_button_clicked()
{
const std::pair<int, int>& range = calculate_log_line_range();
model_.chat_message_list_to_clipboard(range.first, range.second);
}
private:
model& model_;
@ -352,6 +367,11 @@ public:
window.invalidate_layout(); // workaround for assertion failure
}
void handle_copy_button_clicked(twindow& /*window*/)
{
controller_.handle_copy_button_clicked();
}
void bind(twindow& window)
{
LOG_CHAT_LOG << "Entering tchat_log::view::bind" << std::endl;
@ -378,6 +398,13 @@ public:
boost::bind(&view::filter, this, boost::ref(window)));
window.keyboard_capture(model_.filter);
model_.copy_button = &find_widget<tbutton>(&window, "copy", false);
connect_signal_mouse_left_click(
*model_.copy_button,
boost::bind(&view::handle_copy_button_clicked,
this,
boost::ref(window)));
LOG_CHAT_LOG << "Exiting tchat_log::view::bind" << std::endl;
}