# HG changeset patch # User John W. Eaton # Date 1429680984 18000 # Node ID c36f2b0836130baecf5902b79794f23007493997 # Parent 043dcb4da5fc7f21d5c218186bbdd33cecb8b407 make copying figures to clipboard work (bug #44866) * Figure.cc (Figure::copy_figure_callback): Just print the figure to a file here, then call octave_link::copy_image_to_clipboard. (delete_file): Delete unused static function. * main-window.h, main-window.cc (main_window::copy_image_to_clipboard): New function. (main_window::construct_octave_qt_link): Connect octave_qt_link::copy_image_to_clipboard_signal signal to main_window::copy_image_to_clipboard slot. * octave-qt-link.h, octave-qt-link.cc (octave_qt_link::do_copy_image_to_clipboard): New function. (octave_qt_link::copy_image_to_clipboard_signal): New signal. * octave-link.h (octave_link::do_copy_image_to_clipboard): New pure virtual function. (octave_link::copy_image_to_clipboard): New static funtion. diff -r 043dcb4da5fc -r c36f2b083613 libgui/graphics/Figure.cc --- a/libgui/graphics/Figure.cc Tue Apr 21 15:01:55 2015 +0100 +++ b/libgui/graphics/Figure.cc Wed Apr 22 00:36:24 2015 -0500 @@ -816,19 +816,11 @@ Ffeval (ovl ("print", file)); } -static void -delete_file (const std::string& file) -{ - octave_unlink (file); -} - void Figure::copy_figure_callback (const std::string& format) { std::string msg; - unwind_protect frame; - std::string file = octave_tempnam ("", "oct-", msg) + "." + format; if (file.empty ()) @@ -837,23 +829,11 @@ return; } - frame.add_fcn (delete_file, file); - std::string device = "-d" + format; Ffeval (ovl ("print", file, device)); - QClipboard *clipboard = QApplication::clipboard (); - - QImage img (file.c_str (), format.c_str ()); - - if (img.isNull ()) - { - // Report error? - return; - } - - clipboard->setImage (img); + octave_link::copy_image_to_clipboard (file); } void diff -r 043dcb4da5fc -r c36f2b083613 libgui/src/main-window.cc --- a/libgui/src/main-window.cc Tue Apr 21 15:01:55 2015 +0100 +++ b/libgui/src/main-window.cc Wed Apr 22 00:36:24 2015 -0500 @@ -672,6 +672,25 @@ } void +main_window::copy_image_to_clipboard (const QString& file, bool remove_file) +{ + QClipboard *clipboard = QApplication::clipboard (); + + QImage img (file); + + if (img.isNull ()) + { + // Report error? + return; + } + + clipboard->setImage (img); + + if (remove_file) + QFile::remove (file); +} + +void main_window::request_reload_settings () { QSettings *settings = resource_manager::get_settings (); @@ -1523,6 +1542,10 @@ SIGNAL (show_preferences_signal (void)), this, SLOT (process_settings_dialog_request ())); + connect (_octave_qt_link, + SIGNAL (copy_image_to_clipboard_signal (const QString&, bool)), + this, SLOT (copy_image_to_clipboard (const QString&, bool))); + #ifdef HAVE_QSCINTILLA connect (_octave_qt_link, SIGNAL (edit_file_signal (const QString&)), diff -r 043dcb4da5fc -r c36f2b083613 libgui/src/main-window.h --- a/libgui/src/main-window.h Tue Apr 21 15:01:55 2015 +0100 +++ b/libgui/src/main-window.h Wed Apr 22 00:36:24 2015 -0500 @@ -132,6 +132,9 @@ void open_developer_page (void); void process_settings_dialog_request (const QString& desired_tab = QString ()); + + void copy_image_to_clipboard (const QString& file, bool remove_file); + void show_about_octave (void); void notice_settings (const QSettings *settings); void confirm_shutdown_octave (void); diff -r 043dcb4da5fc -r c36f2b083613 libgui/src/octave-qt-link.cc --- a/libgui/src/octave-qt-link.cc Tue Apr 21 15:01:55 2015 +0100 +++ b/libgui/src/octave-qt-link.cc Wed Apr 22 00:36:24 2015 -0500 @@ -99,6 +99,14 @@ } bool +octave_qt_link::do_copy_image_to_clipboard (const std::string& file) +{ + emit copy_image_to_clipboard_signal (QString::fromStdString (file), true); + + return true; +} + +bool octave_qt_link::do_edit_file (const std::string& file) { emit edit_file_signal (QString::fromStdString (file)); diff -r 043dcb4da5fc -r c36f2b083613 libgui/src/octave-qt-link.h --- a/libgui/src/octave-qt-link.h Tue Apr 21 15:01:55 2015 +0100 +++ b/libgui/src/octave-qt-link.h Wed Apr 22 00:36:24 2015 -0500 @@ -64,6 +64,8 @@ bool do_confirm_shutdown (void); bool do_exit (int status); + bool do_copy_image_to_clipboard (const std::string& file); + bool do_edit_file (const std::string& file); bool do_prompt_new_edit_file (const std::string& file); @@ -157,6 +159,8 @@ void execute_interpreter_signal (void); + void copy_image_to_clipboard_signal (const QString& file, bool remove_file); + void edit_file_signal (const QString& file); void change_directory_signal (const QString& dir); diff -r 043dcb4da5fc -r c36f2b083613 libinterp/corefcn/octave-link.h --- a/libinterp/corefcn/octave-link.h Tue Apr 21 15:01:55 2015 +0100 +++ b/libinterp/corefcn/octave-link.h Wed Apr 22 00:36:24 2015 -0500 @@ -133,6 +133,12 @@ } static bool + copy_image_to_clipboard (const std::string& file) + { + return enabled () ? instance->do_copy_image_to_clipboard (file) : false; + } + + static bool edit_file (const std::string& file) { return enabled () ? instance->do_edit_file (file) : false; @@ -393,6 +399,8 @@ virtual bool do_confirm_shutdown (void) = 0; virtual bool do_exit (int status) = 0; + virtual bool do_copy_image_to_clipboard (const std::string& file) = 0; + virtual bool do_edit_file (const std::string& file) = 0; virtual bool do_prompt_new_edit_file (const std::string& file) = 0;