changeset 20079:27c0285828f8

make copying images to the clipboard work with Qt graphics * Figure.h, Figure.cc (Figure::createFigureToolBarAndMenuBar): Enable Copy item in the Edit menu. (delete_file): New static function. (Figure::copy_figure_callback): New member function. (Figure::editCopy): New arg, choose_format. Make it work.
author John W. Eaton <jwe@octave.org>
date Thu, 16 Apr 2015 00:13:26 -0400
parents 2d638e67aeef
children 908b68a98ba6
files libgui/graphics/Figure.cc libgui/graphics/Figure.h
diffstat 2 files changed, 61 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/graphics/Figure.cc	Tue Apr 14 23:32:07 2015 -0400
+++ b/libgui/graphics/Figure.cc	Thu Apr 16 00:13:26 2015 -0400
@@ -28,10 +28,12 @@
 #include <QActionEvent>
 #include <QActionGroup>
 #include <QApplication>
+#include <QClipboard>
 #include <QEvent>
 #include <QFileDialog>
 #include <QFileInfo>
 #include <QFrame>
+#include <QImage>
 #include <QMainWindow>
 #include <QMenu>
 #include <QMenuBar>
@@ -47,6 +49,9 @@
 #include "MouseModeActionGroup.h"
 #include "QtHandlesUtils.h"
 
+#include "file-ops.h"
+#include "unwind-prot.h"
+
 #include "octave-qt-link.h"
 
 #include "builtin-defun-decls.h"
@@ -313,8 +318,8 @@
 
   QMenu* editMenu = m_menuBar->addMenu (tr ("&Edit"));
   editMenu->menuAction ()->setObjectName ("builtinMenu");
-  editMenu->addAction (tr ("Cop&y"), this, SLOT (editCopy (void)),
-                       Qt::CTRL|Qt::Key_C)->setEnabled (false);
+  editMenu->addAction (tr ("Cop&y"), this, SLOT (editCopy (bool)),
+                       Qt::CTRL|Qt::Key_C);
   editMenu->addSeparator ();
   editMenu->addActions (m_mouseModeGroup->actions ());
 
@@ -809,6 +814,38 @@
 {
   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);
+
+  if (file.empty ())
+    {
+      // FIXME: report error contained in message.
+      return;
+    }
+
+  frame.add_fcn (delete_file, file);
+
+  std::string device = "-d" + format;
+
+  Ffeval (ovl ("print", file, device));
+
+  QClipboard *clipboard = QApplication::clipboard ();
+
+  clipboard->setImage (QImage (file.c_str ()));
+}
   
 void
 Figure::fileSaveFigureAs (void)
@@ -823,10 +860,27 @@
 }
 
 void
-Figure::editCopy (void)
+Figure::editCopy (bool /* choose_format */)
 {
-  // FIXME: implement this by printing to a temporary file in some
-  // format (jpg?  png?  pdf?) and copying the result to the clipboard.
+  QString format = "jpg";
+
+#if 0
+
+  // FIXME: allow choice of image formats.
+
+  if (choose_format)
+    {
+      QFileInfo finfo (file);
+
+      format = QFileDialog::getSaveFileName (qWidget<FigureWindow> (),
+                                           tr ("Save Figure As"),
+                                           finfo.absoluteFilePath (), 0, 0,
+                                           QFileDialog::DontUseNativeDialog);
+    }
+#endif
+
+  octave_link::post_event (this, &Figure::copy_figure_callback,
+                           format.toStdString ());
 }
 
 void
--- a/libgui/graphics/Figure.h	Tue Apr 14 23:32:07 2015 -0400
+++ b/libgui/graphics/Figure.h	Thu Apr 16 00:13:26 2015 -0400
@@ -109,13 +109,14 @@
   static void updateBoundingBoxHelper (void*);
 
   void save_figure_callback (const std::string& file);
+  void copy_figure_callback (const std::string& format);
 
 private slots:
   void setMouseMode (MouseMode mode);
   void fileSaveFigure (bool prompt = false);
   void fileSaveFigureAs (void);
   void fileCloseFigure (void);
-  void editCopy (void);
+  void editCopy (bool choose_format = false);
   void helpAboutQtHandles (void);
   void updateMenuBar (void);
   void updateContainer (void);