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