Mercurial > octave-antonio
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);