11
11
_Backend , FigureCanvasBase , FigureManagerBase , NavigationToolbar2 ,
12
12
TimerBase , cursors , ToolContainerBase , MouseButton )
13
13
import matplotlib .backends .qt_editor .figureoptions as figureoptions
14
- from matplotlib .backends .qt_editor ._formsubplottool import UiSubplotTool
15
14
from . import qt_compat
16
15
from .qt_compat import (
17
16
QtCore , QtGui , QtWidgets , __version__ , QT_API ,
@@ -759,27 +758,48 @@ def set_history_buttons(self):
759
758
self ._actions ['forward' ].setEnabled (can_forward )
760
759
761
760
762
- class SubplotToolQt (UiSubplotTool ):
761
+ class SubplotToolQt (QtWidgets . QDialog ):
763
762
def __init__ (self , targetfig , parent ):
764
- super ().__init__ (None )
765
-
763
+ super ().__init__ ()
764
+ self .setObjectName ("SubplotTool" )
765
+ self ._spinboxes = {}
766
+ main_layout = QtWidgets .QHBoxLayout ()
767
+ self .setLayout (main_layout )
768
+ for group , spinboxes , buttons in [
769
+ ("Borders" ,
770
+ ["top" , "bottom" , "left" , "right" ],
771
+ [("Export values" , self ._export_values )]),
772
+ ("Spacings" ,
773
+ ["hspace" , "wspace" ],
774
+ [("Tight layout" , self ._tight_layout ),
775
+ ("Reset" , self ._reset ),
776
+ ("Close" , self .close )])]:
777
+ layout = QtWidgets .QVBoxLayout ()
778
+ main_layout .addLayout (layout )
779
+ box = QtWidgets .QGroupBox (group )
780
+ layout .addWidget (box )
781
+ inner = QtWidgets .QFormLayout (box )
782
+ for name in spinboxes :
783
+ self ._spinboxes [name ] = spinbox = QtWidgets .QDoubleSpinBox ()
784
+ spinbox .setValue (getattr (targetfig .subplotpars , name ))
785
+ spinbox .setRange (0 , 1 )
786
+ spinbox .setDecimals (3 )
787
+ spinbox .setSingleStep (0.005 )
788
+ spinbox .setKeyboardTracking (False )
789
+ spinbox .valueChanged .connect (self ._on_value_changed )
790
+ inner .addRow (name , spinbox )
791
+ layout .addStretch (1 )
792
+ for name , method in buttons :
793
+ button = QtWidgets .QPushButton (name )
794
+ # Don't trigger on <enter>, which is used to input values.
795
+ button .setAutoDefault (False )
796
+ button .clicked .connect (method )
797
+ layout .addWidget (button )
798
+ if name == "Close" :
799
+ button .setFocus ()
766
800
self ._figure = targetfig
767
-
768
- self ._attrs = ["top" , "bottom" , "left" , "right" , "hspace" , "wspace" ]
769
- self ._defaults = {attr : vars (self ._figure .subplotpars )[attr ]
770
- for attr in self ._attrs }
771
-
772
- # Set values after setting the range callbacks, but before setting up
773
- # the redraw callbacks.
774
- self ._reset ()
775
-
776
- for attr in self ._attrs :
777
- self ._widgets [attr ].valueChanged .connect (self ._on_value_changed )
778
- for action , method in [("Export values" , self ._export_values ),
779
- ("Tight layout" , self ._tight_layout ),
780
- ("Reset" , self ._reset ),
781
- ("Close" , self .close )]:
782
- self ._widgets [action ].clicked .connect (method )
801
+ self ._defaults = {spinbox : vars (self ._figure .subplotpars )[attr ]
802
+ for attr , spinbox in self ._spinboxes .items ()}
783
803
784
804
def _export_values (self ):
785
805
# Explicitly round to 3 decimals (which is also the spinbox precision)
@@ -791,8 +811,8 @@ def _export_values(self):
791
811
text .setReadOnly (True )
792
812
layout .addWidget (text )
793
813
text .setPlainText (
794
- ",\n " .join ("{ }={:.3}". format ( attr , self . _widgets [ attr ]. value ())
795
- for attr in self ._attrs ))
814
+ ",\n " .join (f" { attr } ={ spinbox . value () :.3} "
815
+ for attr , spinbox in self ._spinboxes . items () ))
796
816
# Adjust the height of the text widget to fit the whole text, plus
797
817
# some padding.
798
818
size = text .maximumSize ()
@@ -803,31 +823,29 @@ def _export_values(self):
803
823
dialog .exec_ ()
804
824
805
825
def _on_value_changed (self ):
806
- widgets = self ._widgets
826
+ spinboxes = self ._spinboxes
807
827
# Set all mins and maxes, so that this can also be used in _reset().
808
828
for lower , higher in [("bottom" , "top" ), ("left" , "right" )]:
809
- widgets [higher ].setMinimum (widgets [lower ].value () + .001 )
810
- widgets [lower ].setMaximum (widgets [higher ].value () - .001 )
811
- self ._figure .subplots_adjust (** { attr : widgets [ attr ]. value ()
812
- for attr in self . _attrs })
829
+ spinboxes [higher ].setMinimum (spinboxes [lower ].value () + .001 )
830
+ spinboxes [lower ].setMaximum (spinboxes [higher ].value () - .001 )
831
+ self ._figure .subplots_adjust (
832
+ ** { attr : spinbox . value () for attr , spinbox in spinboxes . items () })
813
833
self ._figure .canvas .draw_idle ()
814
834
815
835
def _tight_layout (self ):
816
836
self ._figure .tight_layout ()
817
- for attr in self ._attrs :
818
- widget = self ._widgets [attr ]
<
B41A
/tr>819
- widget .blockSignals (True )
820
- widget .setValue (vars (self ._figure .subplotpars )[attr ])
821
- widget .blockSignals (False )
837
+ for attr , spinbox in self ._spinboxes .items ():
838
+ spinbox .blockSignals (True )
839
+ spinbox .setValue (vars (self ._figure .subplotpars )[attr ])
840
+ spinbox .blockSignals (False )
822
841
self ._figure .canvas .draw_idle ()
823
842
824
843
def _reset (self ):
825
- for attr , value in self ._defaults .items ():
826
- widget = self ._widgets [attr ]
827
- widget .setRange (0 , 1 )
828
- widget .blockSignals (True )
829
- widget .setValue (value )
830
- widget .blockSignals (False )
844
+ for spinbox , value in self ._defaults .items ():
845
+ spinbox .setRange (0 , 1 )
846
+ spinbox .blockSignals (True )
847
+ spinbox .setValue (value )
848
+ spinbox .blockSignals (False )
831
849
self ._on_value_changed ()
832
850
833
851
0 commit comments