Skip to content

Commit 13958b7

Browse files
authored
Merge pull request #13538 from meeseeksmachine/auto-backport-of-pr-12748-on-v3.1.x
Backport PR #12748 on branch v3.1.x (Use the builtin GTK3 FileChooser rather than our custom subclass.)
2 parents 79b3091 + 18a7ca2 commit 13958b7

File tree

4 files changed

+61
-30
lines changed

4 files changed

+61
-30
lines changed

.flake8

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ per-file-ignores =
3333
lib/matplotlib/backends/_backend_tk.py: E501
3434
lib/matplotlib/backends/backend_agg.py: E302
3535
lib/matplotlib/backends/backend_cairo.py: E203, E221, E402
36-
lib/matplotlib/backends/backend_gtk3.py: E203, E221, E222, E225, E251, E501
36+
lib/matplotlib/backends/backend_gtk3.py: E203, E221, E225, E251, E501
3737
lib/matplotlib/backends/backend_pgf.py: E731
3838
lib/matplotlib/backends/qt_editor/_formlayout.py: E501
3939
lib/matplotlib/font_manager.py: E203, E221, E251, E501

doc/api/next_api_changes/2018-08-17-AL-deprecations.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ API deprecations
44
The following API elements are deprecated:
55

66
- ``get_py2exe_datafiles``, ``tk_window_focus``,
7+
- ``backend_gtk3.FileChooserDialog``,
8+
``backend_gtk3.NavigationToolbar2GTK3.get_filechooser``,
9+
``backend_gtk3.SaveFigureGTK3.get_filechooser``,
710
- ``backend_ps.PsBackendHelper``, ``backend_ps.ps_backend_helper``,
811
- ``cbook.iterable``,
912
- ``cbook.get_label``, ``cbook.iterable``,

lib/matplotlib/backends/backend_gtk3.py

Lines changed: 53 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
import functools
12
import logging
23
import os
4+
from pathlib import Path
35
import sys
46

57
import matplotlib
@@ -521,6 +523,7 @@ def _init_toolbar(self):
521523

522524
self.show_all()
523525

526+
@cbook.deprecated("3.1")
524527
def get_filechooser(self):
525528
fc = FileChooserDialog(
526529
title='Save the figure',
@@ -532,24 +535,54 @@ def get_filechooser(self):
532535
return fc
533536

534537
def save_figure(self, *args):
535-
chooser = self.get_filechooser()
536-
fname, format = chooser.get_filename_from_user()
537-
chooser.destroy()
538-
if fname:
539-
startpath = os.path.expanduser(rcParams['savefig.directory'])
540-
# Save dir for next time, unless empty str (i.e., use cwd).
541-
if startpath != "":
542-
rcParams['savefig.directory'] = os.path.dirname(fname)
543-
try:
544-
self.canvas.figure.savefig(fname, format=format)
545-
except Exception as e:
546-
error_msg_gtk(str(e), parent=self)
538+
dialog = Gtk.FileChooserDialog(
539+
title="Save the figure",
540+
parent=self.canvas.get_toplevel(),
541+
action=Gtk.FileChooserAction.SAVE,
542+
buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
543+
Gtk.STOCK_SAVE, Gtk.ResponseType.OK),
544+
)
545+
for name, fmts \
546+
in self.canvas.get_supported_filetypes_grouped().items():
547+
ff = Gtk.FileFilter()
548+
ff.set_name(name)
549+
for fmt in fmts:
550+
ff.add_pattern("*." + fmt)
551+
dialog.add_filter(ff)
552+
if self.canvas.get_default_filetype() in fmts:
553+
dialog.set_filter(ff)
554+
555+
@functools.partial(dialog.connect, "notify::filter")
556+
def on_notify_filter(*args):
557+
name = dialog.get_filter().get_name()
558+
fmt = self.canvas.get_supported_filetypes_grouped()[name][0]
559+
dialog.set_current_name(
560+
str(Path(dialog.get_current_name()).with_suffix("." + fmt)))
561+
562+
dialog.set_current_folder(rcParams["savefig.directory"])
563+
dialog.set_current_name(self.canvas.get_default_filename())
564+
dialog.set_do_overwrite_confirmation(True)
565+
566+
response = dialog.run()
567+
fname = dialog.get_filename()
568+
ff = dialog.get_filter() # Doesn't autoadjust to filename :/
569+
fmt = self.canvas.get_supported_filetypes_grouped()[ff.get_name()][0]
570+
dialog.destroy()
571+
if response == Gtk.ResponseType.CANCEL:
572+
return
573+
# Save dir for next time, unless empty str (which means use cwd).
574+
if rcParams['savefig.directory']:
575+
rcParams['savefig.directory'] = os.path.dirname(fname)
576+
try:
577+
self.canvas.figure.savefig(fname, format=fmt)
578+
except Exception as e:
579+
error_msg_gtk(str(e), parent=self)
547580

548581
def configure_subplots(self, button):
549582
toolfig = Figure(figsize=(6, 3))
550583
canvas = self._get_canvas(toolfig)
551584
toolfig.subplots_adjust(top=0.9)
552-
tool = SubplotTool(self.canvas.figure, toolfig)
585+
tool = SubplotTool(self.canvas.figure, toolfig)
553586

554587
w = int(toolfig.bbox.width)
555588
h = int(toolfig.bbox.height)
@@ -582,6 +615,7 @@ def set_history_buttons(self):
582615
self._gtk_ids['Forward'].set_sensitive(can_forward)
583616

584617

618+
@cbook.deprecated("3.1")
585619
class FileChooserDialog(Gtk.FileChooserDialog):
586620
"""GTK+ file selector which remembers the last file/directory
587621
selected and presents the user with a menu of supported image formats
@@ -777,6 +811,7 @@ def set_message(self, s):
777811

778812
class SaveFigureGTK3(backend_tools.SaveFigureBase):
779813

814+
@cbook.deprecated("3.1")
780815
def get_filechooser(self):
781816
fc = FileChooserDialog(
782817
title='Save the figure',
@@ -788,21 +823,11 @@ def get_filechooser(self):
788823
return fc
789824

790825
def trigger(self, *args, **kwargs):
791-
chooser = self.get_filechooser()
792-
fname, format_ = chooser.get_filename_from_user()
793-
chooser.destroy()
794-
if fname:
795-
startpath = os.path.expanduser(rcParams['savefig.directory'])
796-
if startpath == '':
797-
# explicitly missing key or empty str signals to use cwd
798-
rcParams['savefig.directory'] = startpath
799-
else:
800-
# save dir for next time
801-
rcParams['savefig.directory'] = os.path.dirname(fname)
802-
try:
803-
self.figure.canvas.print_figure(fname, format=format_)
804-
except Exception as e:
805-
error_msg_gtk(str(e), parent=self)
826+
827+
class PseudoToolbar:
828+
canvas = self.figure.canvas
829+
830+
return NavigationToolbar2GTK3.save_figure(PseudoToolbar())
806831

807832

808833
class SetCursorGTK3(backend_tools.SetCursorBase):

lib/matplotlib/cbook/deprecation.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,10 @@ def deprecate(obj, message=message, name=name, alternative=alternative,
191191
old_doc = obj.__doc__
192192

193193
def finalize(wrapper, new_doc):
194-
obj.__doc__ = new_doc
194+
try:
195+
obj.__doc__ = new_doc
196+
except AttributeError: # Can't set on some extension objects.
197+
pass
195198
obj.__init__ = wrapper
196199
return obj
197200

0 commit comments

Comments
 (0)