Skip to content

Commit 6257170

Browse files
committed
Use the builtin GTK3 FileChooser rather than our custom subclass.
1 parent cbd5de9 commit 6257170

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
matplotlib/backends/_backend_tk.py: E501
3434
matplotlib/backends/backend_agg.py: E302
3535
matplotlib/backends/backend_cairo.py: E203, E221, E402
36-
matplotlib/backends/backend_gtk3.py: E203, E221, E222, E225, E251, E501
36+
matplotlib/backends/backend_gtk3.py: E203, E221, E225, E251, E501
3737
matplotlib/backends/backend_pgf.py: E731
3838
matplotlib/backends/qt_editor/formlayout.py: E501
3939
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
- ``font_manager.OSXInstalledFonts``,

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
@@ -518,6 +520,7 @@ def _init_toolbar(self):
518520

519521
self.show_all()
520522

523+
@cbook.deprecated("3.1")
521524
def get_filechooser(self):
522525
fc = FileChooserDialog(
523526
title='Save the figure',
@@ -529,24 +532,54 @@ def get_filechooser(self):
529532
return fc
530533

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

545578
def configure_subplots(self, button):
546579
toolfig = Figure(figsize=(6, 3))
547580
canvas = self._get_canvas(toolfig)
548581
toolfig.subplots_adjust(top=0.9)
549-
tool = SubplotTool(self.canvas.figure, toolfig)
582+
tool = SubplotTool(self.canvas.figure, toolfig)
550583

551584
w = int(toolfig.bbox.width)
552585
h = int(toolfig.bbox.height)
@@ -573,6 +606,7 @@ def _get_canvas(self, fig):
573606
return self.canvas.__class__(fig)
574607

575608

609+
@cbook.deprecated("3.1")
576610
class FileChooserDialog(Gtk.FileChooserDialog):
577611
"""GTK+ file selector which remembers the last file/directory
578612
selected and presents the user with a menu of supported image formats
@@ -768,6 +802,7 @@ def set_message(self, s):
768802

769803
class SaveFigureGTK3(backend_tools.SaveFigureBase):
770804

805+
@cbook.deprecated("3.1")
771806
def get_filechooser(self):
772807
fc = FileChooserDialog(
773808
title='Save the figure',
@@ -779,21 +814,11 @@ def get_filechooser(self):
779814
return fc
780815

781816
def trigger(self, *args, **kwargs):
782-
chooser = self.get_filechooser()
783-
fname, format_ = chooser.get_filename_from_user()
784-
chooser.destroy()
785-
if fname:
786-
startpath = os.path.expanduser(rcParams['savefig.directory'])
787-
if startpath == '':
788-
# explicitly missing key or empty str signals to use cwd
789-
rcParams['savefig.directory'] = startpath
790-
else:
791-
# save dir for next time
792-
rcParams['savefig.directory'] = os.path.dirname(fname)
793-
try:
794-
self.figure.canvas.print_figure(fname, format=format_)
795-
except Exception as e:
796-
error_msg_gtk(str(e), parent=self)
817+
818+
class PseudoToolbar:
819+
canvas = self.figure.canvas
820+
821+
return NavigationToolbar2GTK3.save_figure(PseudoToolbar())
797822

798823

799824
class SetCursorGTK3(backend_tools.SetCursorBase):

lib/matplotlib/cbook/deprecation.py

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

191191
def finalize(wrapper, new_doc):
192-
obj.__doc__ = new_doc
192+
try:
193+
obj.__doc__ = new_doc
194+
except AttributeError: # Can't set on some extension objects.
195+
pass
193196
obj.__init__ = wrapper
194197
return obj
195198

0 commit comments

Comments
 (0)