@@ -1934,9 +1934,9 @@ def press(self, event):
1934
1934
key = event .key or ''
1935
1935
key = key .replace ('ctrl' , 'control' )
1936
1936
# move state is locked in on a button press
1937
- for action in ['move' ]:
1938
- if key == self ._state_modifier_keys [action ]:
1939
- self ._state .add (action )
1937
+ for state in ['move' ]:
1938
+ if key == self ._state_modifier_keys [state ]:
1939
+ self ._state .add (state )
1940
1940
self ._press (event )
1941
1941
return True
1942
1942
return False
@@ -1988,16 +1988,15 @@ def on_key_press(self, event):
1988
1988
artist .set_visible (False )
1989
1989
self .update ()
1990
1990
return
1991
- for state in ['rotate' , 'data_coordinates' ]:
1992
- if key == self ._state_modifier_keys [state ]:
1993
- if state in self ._default_state :
1994
- self ._default_state .remove (state )
1995
- else :
1996
- self .add_default_state (state )
1997
1991
for (state , modifier ) in self ._state_modifier_keys .items ():
1998
- # Multiple keys are string concatenated using '+'
1999
1992
if modifier in key .split ('+' ):
2000
- self ._state .add (state )
1993
+ # rotate and data_coordinates are enable/disable
1994
+ # on key press
1995
+ if (state in ['rotate' , 'data_coordinates' ] and
1996
+ state in self ._state ):
1997
+ self ._state .discard (state )
1998
+ else :
1999
+ self ._state .add (state )
2001
2000
self ._on_key_press (event )
2002
2001
2003
2002
def _on_key_press (self , event ):
@@ -2008,7 +2007,8 @@ def on_key_release(self, event):
2008
2007
if self .active :
2009
2008
key = event .key or ''
2010
2009
for (state , modifier ) in self ._state_modifier_keys .items ():
2011
- if modifier in key :
2010
+ if (modifier in key .split ('+' ) and
2011
+ state not in ['rotate' , 'data_coordinates' ]):
2012
2012
self ._state .discard (state )
2013
2013
self ._on_key_release (event )
2014
2014
@@ -3010,9 +3010,21 @@ def _onmove(self, event):
3010
3010
"""Motion notify event handler."""
3011
3011
3012
3012
state = self ._state | self ._default_state
3013
+ rotate = ('rotate' in state and
3014
+ self ._active_handle in self ._corner_order )
3015
+ eventpress = self ._eventpress
3016
+ # The calculations are done for rotation at zero: we apply inverse
3017
+ # transformation to events except when we rotate and move
3018
+ if not (self ._active_handle == 'C' or rotate ):
3019
+ inv_tr = self ._get_rotation_transform ().inverted ()
3020
+ event .xdata , event .ydata = inv_tr .transform (
3021
+ [event .xdata , event .ydata ])
3022
+ eventpress .xdata , eventpress .ydata = inv_tr .transform (
3023
+ [eventpress .xdata , eventpress .ydata ]
3024
+ )
3013
3025
3014
- dx = event .xdata - self . _eventpress .xdata
3015
- dy = event .ydata - self . _eventpress .ydata
3026
+ dx = event .xdata - eventpress .xdata
3027
+ dy = event .ydata - eventpress .ydata
3016
3028
refmax = None
3017
3029
if 'data_coordinates' in state :
3018
3030
aspect_ratio = 1
@@ -3022,19 +3034,20 @@ def _onmove(self, event):
3022
3034
ll , ur = self .ax .get_position () * figure_size
3023
3035
width , height = ur - ll
3024
3036
aspect_ratio = height / width * self .ax .get_data_ratio ()
3025
- refx = event .xdata / (self ._eventpress .xdata + 1e-6 )
3026
- refy = event .ydata / (self ._eventpress .ydata + 1e-6 )
3027
-
3037
+ refx = event .xdata / (eventpress .xdata + 1e-6 )
3038
+ refy = event .ydata / (eventpress .ydata + 1e-6 )
3028
3039
3029
3040
x0 , x1 , y0 , y1 = self ._extents_on_press
3030
- # resize an existing shape
3031
- if ' rotate' in state and self . _active_handle in self . _corner_order :
3041
+ # rotate an existing shape
3042
+ if rotate :
3032
3043
# calculate angle abc
3033
- a = np .array ([self . _eventpress . xdata , self . _eventpress .ydata ])
3044
+ a = np .array ([eventpress . xdata , eventpress .ydata ])
3034
3045
b = np .array (self .center )
3035
3046
c = np .array ([event .xdata , event .ydata ])
3036
3047
self ._rotation = (np .arctan2 (c [1 ]- b [1 ], c [0 ]- b [0 ]) -
3037
3048
np .arctan2 (a [1 ]- b [1 ], a [0 ]- b [0 ]))
3049
+
3050
+ # resize an existing shape
3038
3051
elif self ._active_handle and self ._active_handle != 'C' :
3039
3052
sizepress = [x1 - x0 , y1 - y0 ]
3040
3053
center = [x0 + sizepress [0 ] / 2 , y0 + sizepress [1 ] / 2 ]
@@ -3091,8 +3104,8 @@ def _onmove(self, event):
3091
3104
# move existing shape
3092
3105
elif self ._active_handle == 'C' :
3093
3106
x0 , x1 , y0 , y1 = self ._extents_on_press
3094
- dx = event .xdata - self . _eventpress .xdata
3095
- dy = event .ydata - self . _eventpress .ydata
3107
+ dx = event .xdata - eventpress .xdata
3108
+ dy = event .ydata - eventpress .ydata
3096
3109
x0 += dx
3097
3110
x1 += dx
3098
3111
y0 += dy
@@ -3105,7 +3118,7 @@ def _onmove(self, event):
3105
3118
# ignore_event_outside=True
3106
3119
if self .ignore_event_outside and self ._selection_completed :
3107
3120
return
3108
- center = [self . _eventpress . xdata , self . _eventpress .ydata ]
3121
+ center = [eventpress . xdata , eventpress .ydata ]
3109
3122
dx = (event .xdata - center [0 ]) / 2.
3110
3123
dy = (event .ydata - center [1 ]) / 2.
3111
3124
0 commit comments