changeset 20113:c36f2b083613

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.
author John W. Eaton <jwe@octave.org>
date Wed, 22 Apr 2015 00:36:24 -0500
parents 043dcb4da5fc
children 5f0cb9bb6a50
files libgui/graphics/Figure.cc libgui/src/main-window.cc libgui/src/main-window.h libgui/src/octave-qt-link.cc libgui/src/octave-qt-link.h libinterp/corefcn/octave-link.h
diffstat 6 files changed, 47 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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&)),
--- 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);
--- 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));
--- 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);
--- 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;