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