1+ import functools
12import logging
23import os
4+ from pathlib import Path
35import sys
46
57import 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" )
585619class 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
778812class 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
808833class SetCursorGTK3 (backend_tools .SetCursorBase ):
0 commit comments