From f0923774e411ca2022e4fdc6fe8678c636f06908 Mon Sep 17 00:00:00 2001 From: Federico Ariza Date: Tue, 13 Feb 2018 13:28:08 -0500 Subject: [PATCH 01/10] GTK3 implementation of the copy canvas tool --- lib/matplotlib/backend_tools.py | 8 ++++++++ lib/matplotlib/backends/backend_gtk3.py | 10 ++++++++++ lib/matplotlib/rcsetup.py | 1 + 3 files changed, 19 insertions(+) diff --git a/lib/matplotlib/backend_tools.py b/lib/matplotlib/backend_tools.py index a884cc838860..866ccf6526f5 100644 --- a/lib/matplotlib/backend_tools.py +++ b/lib/matplotlib/backend_tools.py @@ -1063,6 +1063,13 @@ def _get_help_html(self): "".join(rows[1:]) + "") +class ToolCopyToClipboardBase(ToolBase): + """Tool to copy the figure to the clipboard""" + + description = 'Copy the canvas figure to clipboard' + default_keymap = rcParams['keymap.copy'] + + default_tools = {'home': ToolHome, 'back': ToolBack, 'forward': ToolForward, 'zoom': ToolZoom, 'pan': ToolPan, 'subplots': 'ToolConfigureSubplots', @@ -1081,6 +1088,7 @@ def _get_help_html(self): 'cursor': 'ToolSetCursor', 'rubberband': 'ToolRubberband', 'help': 'ToolHelp', + 'copy': 'ToolCopyToClipboard', } """Default tools""" diff --git a/lib/matplotlib/backends/backend_gtk3.py b/lib/matplotlib/backends/backend_gtk3.py index 5ed0a8db2d3d..2134bf75903d 100644 --- a/lib/matplotlib/backends/backend_gtk3.py +++ b/lib/matplotlib/backends/backend_gtk3.py @@ -856,6 +856,15 @@ def trigger(self, *args): dialog.destroy() +class ToolCopyToClipboardGTK3(backend_tools.ToolCopyToClipboardBase): + def trigger(self, *args, **kwargs): + clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) + window = self.canvas.get_window() + x, y, width, height = window.get_geometry() + pb = Gdk.pixbuf_get_from_window(window, x, y, width, height) + clipboard.set_image(pb) + + # Define the file to use as the GTk icon if sys.platform == 'win32': icon_filename = 'matplotlib.png' @@ -888,6 +897,7 @@ def error_msg_gtk(msg, parent=None): backend_tools.ToolSetCursor = SetCursorGTK3 backend_tools.ToolRubberband = RubberbandGTK3 backend_tools.ToolHelp = HelpGTK3 +backend_tools.ToolCopyToClipboard = ToolCopyToClipboardGTK3 Toolbar = ToolbarGTK3 diff --git a/lib/matplotlib/rcsetup.py b/lib/matplotlib/rcsetup.py index dcd2e6853b86..da9f8e1968c9 100644 --- a/lib/matplotlib/rcsetup.py +++ b/lib/matplotlib/rcsetup.py @@ -1421,6 +1421,7 @@ def _validate_linestyle(ls): 'keymap.xscale': [['k', 'L'], validate_stringlist], 'keymap.all_axes': [['a'], validate_stringlist], 'keymap.help': [['f1'], validate_stringlist], + 'keymap.copy': [('ctrl+c', 'cmd+c', 'shift+ctrl+c'), validate_stringlist], # sample data 'examples.directory': ['', validate_string], From 18df9222b9bc20aa2335c7b40efe13a06f00c8e6 Mon Sep 17 00:00:00 2001 From: Federico Ariza Date: Wed, 14 Feb 2018 12:57:25 -0500 Subject: [PATCH 02/10] QT copy to clipboard tool implementation --- lib/matplotlib/backends/backend_qt5.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/matplotlib/backends/backend_qt5.py b/lib/matplotlib/backends/backend_qt5.py index 5b94fd19d84b..a584f4e8de84 100644 --- a/lib/matplotlib/backends/backend_qt5.py +++ b/lib/matplotlib/backends/backend_qt5.py @@ -1069,11 +1069,18 @@ def trigger(self, *args): QtWidgets.QMessageBox.information(None, "Help", self._get_help_html()) +class ToolCopyToClipboardQT(backend_tools.ToolCopyToClipboardBase): + def trigger(self, *args, **kwargs): + pixmap = self.canvas.grab() + qApp.clipboard().setPixmap(pixmap) + + backend_tools.ToolSaveFigure = SaveFigureQt backend_tools.ToolConfigureSubplots = ConfigureSubplotsQt backend_tools.ToolSetCursor = SetCursorQt backend_tools.ToolRubberband = RubberbandQt backend_tools.ToolHelp = HelpQt +backend_tools.ToolCopyToClipboard = ToolCopyToClipboardQT def error_msg_qt(msg, parent=None): From 86d29682f79c94ec0bc6cadd9c9d414fc6fe4bf6 Mon Sep 17 00:00:00 2001 From: DietmarSchwertberger Date: Tue, 20 Mar 2018 22:55:07 +0100 Subject: [PATCH 03/10] Add first implementation of ToolCopyToClipboardWx --- lib/matplotlib/backends/backend_wx.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib/matplotlib/backends/backend_wx.py b/lib/matplotlib/backends/backend_wx.py index dfbf23340492..709b9a7bf618 100644 --- a/lib/matplotlib/backends/backend_wx.py +++ b/lib/matplotlib/backends/backend_wx.py @@ -1826,9 +1826,22 @@ def remove_rubberband(self, dc=None): self._rect = None +class ToolCopyToClipboardWx(backend_tools.ToolCopyToClipboardBase): + def trigger(self, *args, **kwargs): + if not self.canvas._isDrawn: + self.canvas.draw() + if not self.canvas.bitmap.IsOk() or not wx.TheClipboard.Open(): + return + try: + wx.TheClipboard.SetData(wx.BitmapDataObject(self.canvas.bitmap)) + finally: + wx.TheClipboard.Close() + + backend_tools.ToolSaveFigure = SaveFigureWx backend_tools.ToolSetCursor = SetCursorWx backend_tools.ToolRubberband = RubberbandWx +backend_tools.ToolCopyToClipboard = ToolCopyToClipboardWx # < Additions for printing support: Matt Newville From 9923703e48e4bc94539877768a19aad5f83824d2 Mon Sep 17 00:00:00 2001 From: Federico Ariza Date: Thu, 12 Apr 2018 15:47:49 -0400 Subject: [PATCH 04/10] update rc template --- matplotlibrc.template | 1 + 1 file changed, 1 insertion(+) diff --git a/matplotlibrc.template b/matplotlibrc.template index a3416144f0f0..fcff5a5f27a1 100644 --- a/matplotlibrc.template +++ b/matplotlibrc.template @@ -591,6 +591,7 @@ backend : $TEMPLATE_BACKEND #keymap.yscale : l ## toggle scaling of y-axes ('log'/'linear') #keymap.xscale : k, L ## toggle scaling of x-axes ('log'/'linear') #keymap.all_axes : a ## enable all axes +#keymap.copy : ctrl+c, cmd+c, shift+ctrl+c ## Copy figure to clipboard ## Control location of examples data files #examples.directory : ## directory to look in for custom installation From 25aceeaea04e02962348ddb7a70600f57b4dd935 Mon Sep 17 00:00:00 2001 From: Federico Ariza Date: Wed, 18 Apr 2018 14:33:54 -0400 Subject: [PATCH 05/10] No copy tool for TK backend --- lib/matplotlib/backends/_backend_tk.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/matplotlib/backends/_backend_tk.py b/lib/matplotlib/backends/_backend_tk.py index 164077cdc713..c74d95593f46 100644 --- a/lib/matplotlib/backends/_backend_tk.py +++ b/lib/matplotlib/backends/_backend_tk.py @@ -971,11 +971,18 @@ def trigger(self, *args): dialog.done = lambda num: dialog.frame.master.withdraw() +class ToolCopyToClipboardTk(backend_tools.ToolCopyToClipboardBase): + def trigger(self, *args, **kwargs): + message = "Copy tool is not available for Tk backend" + self.toolmanager.message_event(message, self) + + backend_tools.ToolSaveFigure = SaveFigureTk backend_tools.ToolConfigureSubplots = ConfigureSubplotsTk backend_tools.ToolSetCursor = SetCursorTk backend_tools.ToolRubberband = RubberbandTk backend_tools.ToolHelp = HelpTk +backend_tools.ToolCopyToClipboard = ToolCopyToClipboardTk Toolbar = ToolbarTk From cff56e57b04730c2f17fa42c289e2cafaffea2c0 Mon Sep 17 00:00:00 2001 From: Federico Ariza Date: Wed, 18 Apr 2018 14:43:03 -0400 Subject: [PATCH 06/10] Base tool triggers message of not implemented --- lib/matplotlib/backend_tools.py | 4 ++++ lib/matplotlib/backends/_backend_tk.py | 4 +--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/backend_tools.py b/lib/matplotlib/backend_tools.py index 866ccf6526f5..803ce1c02c26 100644 --- a/lib/matplotlib/backend_tools.py +++ b/lib/matplotlib/backend_tools.py @@ -1069,6 +1069,10 @@ class ToolCopyToClipboardBase(ToolBase): description = 'Copy the canvas figure to clipboard' default_keymap = rcParams['keymap.copy'] + def trigger(self, *args, **kwargs): + message = "Copy tool is not available" + self.toolmanager.message_event(message, self) + default_tools = {'home': ToolHome, 'back': ToolBack, 'forward': ToolForward, 'zoom': ToolZoom, 'pan': ToolPan, diff --git a/lib/matplotlib/backends/_backend_tk.py b/lib/matplotlib/backends/_backend_tk.py index c74d95593f46..3c540b1b9aef 100644 --- a/lib/matplotlib/backends/_backend_tk.py +++ b/lib/matplotlib/backends/_backend_tk.py @@ -972,9 +972,7 @@ def trigger(self, *args): class ToolCopyToClipboardTk(backend_tools.ToolCopyToClipboardBase): - def trigger(self, *args, **kwargs): - message = "Copy tool is not available for Tk backend" - self.toolmanager.message_event(message, self) + pass backend_tools.ToolSaveFigure = SaveFigureTk From 2f131e1efc1e6893278838aa031b3d8dec13d059 Mon Sep 17 00:00:00 2001 From: Federico Ariza Date: Wed, 18 Apr 2018 14:49:59 -0400 Subject: [PATCH 07/10] removing unncesary class --- lib/matplotlib/backends/_backend_tk.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/matplotlib/backends/_backend_tk.py b/lib/matplotlib/backends/_backend_tk.py index 3c540b1b9aef..85d42eb437dc 100644 --- a/lib/matplotlib/backends/_backend_tk.py +++ b/lib/matplotlib/backends/_backend_tk.py @@ -971,16 +971,12 @@ def trigger(self, *args): dialog.done = lambda num: dialog.frame.master.withdraw() -class ToolCopyToClipboardTk(backend_tools.ToolCopyToClipboardBase): - pass - - backend_tools.ToolSaveFigure = SaveFigureTk backend_tools.ToolConfigureSubplots = ConfigureSubplotsTk backend_tools.ToolSetCursor = SetCursorTk backend_tools.ToolRubberband = RubberbandTk backend_tools.ToolHelp = HelpTk -backend_tools.ToolCopyToClipboard = ToolCopyToClipboardTk +backend_tools.ToolCopyToClipboard = backend_tools.ToolCopyToClipboardBase Toolbar = ToolbarTk From 584bf3e3cc838f6b16242da8826ef6b89d278cdb Mon Sep 17 00:00:00 2001 From: Federico Ariza Date: Wed, 18 Apr 2018 16:16:17 -0400 Subject: [PATCH 08/10] removing ctrl+shift+c from copy tool --- lib/matplotlib/rcsetup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/rcsetup.py b/lib/matplotlib/rcsetup.py index da9f8e1968c9..988dbfb45ba1 100644 --- a/lib/matplotlib/rcsetup.py +++ b/lib/matplotlib/rcsetup.py @@ -1421,7 +1421,7 @@ def _validate_linestyle(ls): 'keymap.xscale': [['k', 'L'], validate_stringlist], 'keymap.all_axes': [['a'], validate_stringlist], 'keymap.help': [['f1'], validate_stringlist], - 'keymap.copy': [('ctrl+c', 'cmd+c', 'shift+ctrl+c'), validate_stringlist], + 'keymap.copy': [('ctrl+c', 'cmd+c'), validate_stringlist], # sample data 'examples.directory': ['', validate_string], From e87cb47b4a1d68ba8f879a18ddea4fd0929e2dc0 Mon Sep 17 00:00:00 2001 From: Federico Ariza Date: Wed, 18 Apr 2018 16:21:21 -0400 Subject: [PATCH 09/10] copy tool keymap as list --- lib/matplotlib/rcsetup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/rcsetup.py b/lib/matplotlib/rcsetup.py index 988dbfb45ba1..af812ebb08c7 100644 --- a/lib/matplotlib/rcsetup.py +++ b/lib/matplotlib/rcsetup.py @@ -1421,7 +1421,7 @@ def _validate_linestyle(ls): 'keymap.xscale': [['k', 'L'], validate_stringlist], 'keymap.all_axes': [['a'], validate_stringlist], 'keymap.help': [['f1'], validate_stringlist], - 'keymap.copy': [('ctrl+c', 'cmd+c'), validate_stringlist], + 'keymap.copy': [['ctrl+c', 'cmd+c'], validate_stringlist], # sample data 'examples.directory': ['', validate_string], From 3866f298f7b71e0796ad0826ea79b9e177b142e6 Mon Sep 17 00:00:00 2001 From: Federico Ariza Date: Wed, 18 Apr 2018 16:23:16 -0400 Subject: [PATCH 10/10] update rc.template --- matplotlibrc.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matplotlibrc.template b/matplotlibrc.template index fcff5a5f27a1..f4549755ed01 100644 --- a/matplotlibrc.template +++ b/matplotlibrc.template @@ -591,7 +591,7 @@ backend : $TEMPLATE_BACKEND #keymap.yscale : l ## toggle scaling of y-axes ('log'/'linear') #keymap.xscale : k, L ## toggle scaling of x-axes ('log'/'linear') #keymap.all_axes : a ## enable all axes -#keymap.copy : ctrl+c, cmd+c, shift+ctrl+c ## Copy figure to clipboard +#keymap.copy : ctrl+c, cmd+c ## Copy figure to clipboard ## Control location of examples data files #examples.directory : ## directory to look in for custom installation