12
12
13
13
import matplotlib
14
14
15
+ from matplotlib import backend_tools
15
16
from matplotlib ._pylab_helpers import Gcf
16
17
from matplotlib .backend_bases import (
17
18
_Backend , FigureCanvasBase , FigureManagerBase , NavigationToolbar2 ,
18
- TimerBase , cursors , ToolContainerBase , StatusbarBase )
19
- import matplotlib .backends .qt_editor .figureoptions as figureoptions
20
- from matplotlib .backends .qt_editor .formsubplottool import UiSubplotTool
21
- from matplotlib .figure import Figure
19
+ StatusbarBase , TimerBase , ToolContainerBase , cursors )
22
20
from matplotlib .backend_managers import ToolManager
23
- from matplotlib import backend_tools
24
21
25
22
from .qt_compat import (
26
23
QtCore , QtGui , QtWidgets , _getSaveFileName , is_pyqt5 , __version__ , QT_API )
24
+ from .qt_editor import figureoptions , formlayout
25
+ from .qt_editor .formsubplottool import UiSubplotTool
27
26
28
27
backend_version = __version__
29
28
@@ -838,24 +837,42 @@ def save_figure(self, *args):
838
837
startpath = os .path .expanduser (
839
838
matplotlib .rcParams ['savefig.directory' ])
840
839
start = os .path .join (startpath , self .canvas .get_default_filename ())
840
+
841
841
filters = []
842
- selectedFilter = None
842
+ selected_filter = None
843
843
for name , exts in sorted_filetypes :
844
- exts_list = " " . join ([ '*.%s' % ext for ext in exts ])
845
- filter = '%s (%s)' % ( name , exts_list )
844
+ filters . append (
845
+ '{} ({})' . format ( name , ' ' . join ( map ( '*.{}' . format , exts ))) )
846
846
if default_filetype in exts :
847
- selectedFilter = filter
848
- filters .append (filter )
847
+ selected_filter = filters [- 1 ]
849
848
filters = ';;' .join (filters )
850
849
851
- fname , filter = _getSaveFileName (self . parent ,
852
- "Choose a filename to save to" ,
853
- start , filters , selectedFilter )
850
+ fname , selected_filter = _getSaveFileName (
851
+ self . parent , "Choose a filename to save to" ,
852
+ start , filters , selected_filter )
854
853
if fname :
855
- # Save dir for next time, unless empty str (i.e., use cwd).
856
854
if startpath != "" :
857
855
matplotlib .rcParams ['savefig.directory' ] = (
858
856
os .path .dirname (six .text_type (fname )))
857
+ options = _default_savefig_options
858
+ try :
859
+ options = (options
860
+ + [None ]
861
+ + _extra_savefig_options [
862
+ os .path .splitext (fname )[1 ].lower ()])
863
+ except KeyError :
864
+ pass
865
+ fedit_arg = []
866
+ for option in options :
867
+ if option is None :
868
+ fedit_arg .append ((None , None ))
869
+ else :
870
+ fedit_arg .append (option .make_fedit_entry ())
871
+ fedit_res = formlayout .fedit (fedit_arg , "Options" )
872
+ if not fedit_res :
873
+ return
874
+ for option , res in zip (filter (None , options ), fedit_res ):
875
+ option .setter (res )
859
876
try :
860
877
self .canvas .figure .savefig (six .text_type (fname ))
861
878
except Exception as e :
@@ -864,6 +881,79 @@ def save_figure(self, *args):
864
881
QtWidgets .QMessageBox .Ok , QtWidgets .QMessageBox .NoButton )
865
882
866
883
884
+ class _Option (object ):
885
+
886
+ def __init__ (self , name , rc_key = None , getter = None , setter = None ):
887
+ if rc_key and not (getter or setter ):
888
+ def make_fedit_entry ():
889
+ return (name , matplotlib .rcParams [rc_key ])
890
+
891
+ def setter (val ):
892
+ matplotlib .rcParams [rc_key ] = val
893
+
894
+ elif getter and setter and not rc_key :
895
+ def make_fedit_entry ():
896
+ return (name , getter ())
897
+
898
+ else :
899
+ raise ValueError ("Invalid entry" )
900
+
901
+ self .name = name
902
+ self .make_fedit_entry = make_fedit_entry
903
+ self .setter = setter
904
+
905
+
906
+ _default_savefig_options = [
907
+ _Option ("DPI" , "savefig.dpi" ),
908
+ _Option ("Face color" , "savefig.facecolor" ),
909
+ _Option ("Edge color" , "savefig.edgecolor" ),
910
+ _Option ("Tight bounding box" ,
911
+ getter = lambda : matplotlib .rcParams ["savefig.bbox" ] == "tight" ,
912
+ setter = lambda val : matplotlib .rcParams .__setitem__ (
913
+ "savefig.bbox" , "tight" if val else "standard" )),
914
+ _Option ("Tight bounding box padding" , "savefig.pad_inches" ),
915
+ _Option ("Transparent background" , "savefig.transparent" )]
916
+
917
+
918
+ _extra_savefig_options = {
919
+ ".jpg" : [
920
+ _Option ("JPEG quality" , "savefig.jpeg_quality" )],
921
+ ".jpeg" : [
922
+ _Option ("JPEG quality" , "savefig.jpeg_quality" )],
923
+ ".pdf" : [
924
+ _Option ("PDF compression" , "pdf.compression" ),
925
+ _Option ("PDF font type" ,
926
+ getter = lambda :
927
+ [str (matplotlib .rcParams ["pdf.fonttype" ]),
928
+ "3" , "42" ],
929
+ setter = lambda val :
930
+ matplotlib .rcParams .__setitem__ ("pdf.fonttype" , val ))],
931
+ ".ps" : [
932
+ _Option ("PS paper size" ,
933
+ getter = lambda :
934
+ [matplotlib .rcParams ["ps.papersize" ]]
935
+ + ["auto" , "letter" , "legal" , "ledger" ]
936
+ + ["A{}" .format (i ) for i in range (11 )]
937
+ + ["B{}" .format (i ) for i in range (11 )],
938
+ setter = lambda val :
939
+ matplotlib .rcParams .__setitem__ ("ps.papersize" , val )),
940
+ _Option ("PS use AFM font" , "ps.useafm" ),
941
+ _Option ("PS distiller" ,
942
+ getter = lambda :
943
+ [str (matplotlib .rcParams ["ps.usedistiller" ])]
944
+ + ["None" , "ghostscript" , "xpdf" ],
945
+ setter = lambda val :
946
+ matplotlib .rcParams .__setitem__ ("ps.usedistiller" , val )),
947
+ _Option ("PS distiller resolution" , "ps.distiller.res" ),
948
+ _Option ("PS font type" ,
949
+ getter = lambda :
950
+ [str (matplotlib .rcParams ["ps.fonttype" ]),
951
+ "3" , "42" ],
952
+ setter = lambda val :
953
+ matplotlib .rcParams .__setitem__ ("ps.fonttype" , val ))]
954
+ }
955
+
956
+
867
957
class SubplotToolQt (UiSubplotTool ):
868
958
def __init__ (self , targetfig , parent ):
869
959
UiSubplotTool .__init__ (self , None )
0 commit comments