27
27
28
28
from .qt_compat import (QtCore , QtGui , QtWidgets , _getSaveFileName ,
29
29
__version__ , is_pyqt5 )
30
- from matplotlib .backends .qt_editor .formsubplottool import UiSubplotTool
30
+ from .qt_editor import formlayout
31
+ from .qt_editor .formsubplottool import UiSubplotTool
31
32
32
33
backend_version = __version__
33
34
@@ -725,19 +726,19 @@ def save_figure(self, *args):
725
726
startpath = matplotlib .rcParams .get ('savefig.directory' , '' )
726
727
startpath = os .path .expanduser (startpath )
727
728
start = os .path .join (startpath , self .canvas .get_default_filename ())
729
+
728
730
filters = []
729
- selectedFilter = None
731
+ selected_filter = None
730
732
for name , exts in sorted_filetypes :
731
- exts_list = " " . join ([ '*.%s' % ext for ext in exts ])
732
- filter = '%s (%s)' % ( name , exts_list )
733
+ filters . append (
734
+ '{} ({})' . format ( name , ' ' . join ( map ( '*.{}' . format , exts ))) )
733
735
if default_filetype in exts :
734
- selectedFilter = filter
735
- filters .append (filter )
736
+ selected_filter = filters [- 1 ]
736
737
filters = ';;' .join (filters )
737
738
738
- fname , filter = _getSaveFileName (self . parent ,
739
- "Choose a filename to save to" ,
740
- start , filters , selectedFilter )
739
+ fname , selected_filter = _getSaveFileName (
740
+ self . parent , "Choose a filename to save to" ,
741
+ start , filters , selected_filter )
741
742
if fname :
742
743
if startpath == '' :
743
744
# explicitly missing key or empty str signals to use cwd
@@ -746,6 +747,25 @@ def save_figure(self, *args):
746
747
# save dir for next time
747
748
savefig_dir = os .path .dirname (six .text_type (fname ))
748
749
matplotlib .rcParams ['savefig.directory' ] = savefig_dir
750
+ options = _default_savefig_options
751
+ try :
752
+ options = (options
753
+ + [None ]
754
+ + _extra_savefig_options [
755
+ os .path .splitext (fname )[1 ].lower ()])
756
+ except KeyError :
757
+ pass
758
+ fedit_arg = []
759
+ for option in options :
760
+ if option is None :
761
+ fedit_arg .append ((None , None ))
762
+ else :
763
+ fedit_arg .append (option .make_fedit_entry ())
764
+ fedit_res = formlayout .fedit (fedit_arg , "Options" )
765
+ if not fedit_res :
766
+ return
767
+ for option , res in zip (filter (None , options ), fedit_res ):
768
+ option .setter (res )
749
769
try :
750
770
self .canvas .print_figure (six .text_type (fname ))
751
771
except Exception as e :
@@ -754,6 +774,79 @@ def save_figure(self, *args):
754
774
QtWidgets .QMessageBox .Ok , QtWidgets .QMessageBox .NoButton )
755
775
756
776
777
+ class _Option (object ):
778
+
779
+ def __init__ (self , name , rc_key = None , getter = None , setter = None ):
780
+ if rc_key and not (getter or setter ):
781
+ def make_fedit_entry ():
782
+ return (name , matplotlib .rcParams [rc_key ])
783
+
784
+ def setter (val ):
785
+ matplotlib .rcParams [rc_key ] = val
786
+
787
+ elif getter and setter and not rc_key :
788
+ def make_fedit_entry ():
789
+ return (name , getter ())
790
+
791
+ else :
792
+ raise ValueError ("Invalid entry" )
793
+
794
+ self .name = name
795
+ self .make_fedit_entry = make_fedit_entry
796
+ self .setter = setter
797
+
798
+
799
+ _default_savefig_options = [
800
+ _Option ("DPI" , "savefig.dpi" ),
801
+ _Option ("Face color" , "savefig.facecolor" ),
802
+ _Option ("Edge color" , "savefig.edgecolor" ),
803
+ _Option ("Tight bounding box" ,
804
+ getter = lambda : matplotlib .rcParams ["savefig.bbox" ] == "tight" ,
805
+ setter = lambda val : matplotlib .rcParams .__setitem__ (
806
+ "savefig.bbox" , "tight" if val else "standard" )),
807
+ _Option ("Tight bounding box padding" , "savefig.pad_inches" ),
808
+ _Option ("Transparent background" , "savefig.transparent" )]
809
+
810
+
811
+ _extra_savefig_options = {
812
+ ".jpg" : [
813
+ _Option ("JPEG quality" , "savefig.jpeg_quality" )],
814
+ ".jpeg" : [
815
+ _Option ("JPEG quality" , "savefig.jpeg_quality" )],
816
+ ".pdf" : [
817
+ _Option ("PDF compression" , "pdf.compression" ),
818
+ _Option ("PDF font type" ,
819
+ getter = lambda :
820
+ [str (matplotlib .rcParams ["pdf.fonttype" ]),
821
+ "3" , "42" ],
822
+ setter = lambda val :
823
+ matplotlib .rcParams .__setitem__ ("pdf.fonttype" , val ))],
824
+ ".ps" : [
825
+ _Option ("PS paper size" ,
826
+ getter = lambda :
827
+ [matplotlib .rcParams ["ps.papersize" ]]
828
+ + ["auto" , "letter" , "legal" , "ledger" ]
829
+ + ["A{}" .format (i ) for i in range (11 )]
830
+ + ["B{}" .format (i ) for i in range (11 )],
831
+ setter = lambda val :
832
+ matplotlib .rcParams .__setitem__ ("ps.papersize" , val )),
833
+ _Option ("PS use AFM font" , "ps.useafm" ),
834
+ _Option ("PS distiller" ,
835
+ getter = lambda :
836
+ [str (matplotlib .rcParams ["ps.usedistiller" ])]
837
+ + ["None" , "ghostscript" , "xpdf" ],
838
+ setter = lambda val :
839
+ matplotlib .rcParams .__setitem__ ("ps.usedistiller" , val )),
840
+ _Option ("PS distiller resolution" , "ps.distiller.res" ),
841
+ _Option ("PS font type" ,
842
+ getter = lambda :
843
+ [str (matplotlib .rcParams ["ps.fonttype" ]),
844
+ "3" , "42" ],
845
+ setter = lambda val :
846
+ matplotlib .rcParams .__setitem__ ("ps.fonttype" , val ))]
847
+ }
848
+
849
+
757
850
class SubplotToolQt (SubplotTool , UiSubplotTool ):
758
851
def __init__ (self , targetfig , parent ):
759
852
UiSubplotTool .__init__ (self , None )
0 commit comments