@@ -1935,9 +1935,9 @@ def press(self, event):
1935
1935
key = event .key or ''
1936
1936
key = key .replace ('ctrl' , 'control' )
1937
1937
# move state is locked in on a button press
1938
- for action in ['move' ]:
1939
- if key == self ._state_modifier_keys [action ]:
1940
- self ._state .add (action )
1938
+ for state in ['move' ]:
1939
+ if key == self ._state_modifier_keys [state ]:
1940
+ self ._state .add (state )
1941
1941
self ._press (event )
1942
1942
return True
1943
1943
return False
@@ -1989,16 +1989,15 @@ def on_key_press(self, event):
1989
1989
artist .set_visible (False )
1990
1990
self .update ()
1991
1991
return
1992
- for state in ['rotate' , 'data_coordinates' ]:
1993
- if key == self ._state_modifier_keys [state ]:
1994
- if state in self ._default_state :
1995
- self ._default_state .remove (state )
1996
- else :
1997
- self .add_default_state (state )
1998
1992
for (state , modifier ) in self ._state_modifier_keys .items ():
1999
- # Multiple keys are string concatenated using '+'
2000
1993
if modifier in key .split ('+' ):
2001
- self ._state .add (state )
1994
+ # rotate and data_coordinates are enable/disable
1995
+ # on key press
1996
+ if (state in ['rotate' , 'data_coordinates' ] and
1997
+ state in self ._state ):
1998
+ self ._state .discard (state )
1999
+ else :
2000
+ self ._state .add (state )
2002
2001
self ._on_key_press (event )
2003
2002
2004
2003
def _on_key_press (self , event ):
@@ -2009,7 +2008,8 @@ def on_key_release(self, event):
2009
2008
if self .active :
2010
2009
key = event .key or ''
2011
2010
for (state , modifier ) in self ._state_modifier_keys .items ():
2012
- if modifier in key :
2011
+ if (modifier in key .split ('+' ) and
2012
+ state not in ['rotate' , 'data_coordinates' ]):
2013
2013
self ._state .discard (state )
2014
2014
self ._on_key_release (event )
2015
2015
@@ -2967,9 +2967,21 @@ def _onmove(self, event):
2967
2967
"""Motion notify event handler."""
2968
2968
2969
2969
state = self ._state | self ._default_state
2970
+ rotate = ('rotate' in state and
2971
+ self ._active_handle in self ._corner_order )
2972
+ eventpress = self ._eventpress
2973
+ # The calculations are done for rotation at zero: we apply inverse
2974
+ # transformation to events except when we rotate and move
2975
+ if not (self ._active_handle == 'C' or rotate ):
2976
+ inv_tr = self ._get_rotation_transform ().inverted ()
2977
+ event .xdata , event .ydata = inv_tr .transform (
2978
+ [event .xdata , event .ydata ])
2979
+ eventpress .xdata , eventpress .ydata = inv_tr .transform (
2980
+ [eventpress .xdata , eventpress .ydata ]
2981
+ )
2970
2982
2971
- dx = event .xdata - self . _eventpress .xdata
2972
- dy = event .ydata - self . _eventpress .ydata
2983
+ dx = event .xdata - eventpress .xdata
2984
+ dy = event .ydata - eventpress .ydata
2973
2985
refmax = None
2974
2986
if 'data_coordinates' in state :
2975
2987
aspect_ratio = 1
@@ -2979,19 +2991,20 @@ def _onmove(self, event):
2979
2991
ll , ur = self .ax .get_position () * figure_size
2980
2992
width , height = ur - ll
2981
2993
aspect_ratio = height / width * self .ax .get_data_ratio ()
2982
- refx = event .xdata / (self ._eventpress .xdata + 1e-6 )
2983
- refy = event .ydata / (self ._eventpress .ydata + 1e-6 )
2984
-
2994
+ refx = event .xdata / (eventpress .xdata + 1e-6 )
2995
+ refy = event .ydata / (eventpress .ydata + 1e-6 )
2985
2996
2986
2997
x0 , x1 , y0 , y1 = self ._extents_on_press
2987
- # resize an existing shape
2988
- if ' rotate' in state and self . _active_handle in self . _corner_order :
2998
+ # rotate an existing shape
2999
+ if rotate :
2989
3000
# calculate angle abc
2990
- a = np .array ([self . _eventpress . xdata , self . _eventpress .ydata ])
3001
+ a = np .array ([eventpress . xdata , eventpress .ydata ])
2991
3002
b = np .array (self .center )
2992
3003
c = np .array ([event .xdata , event .ydata ])
2993
3004
self ._rotation = (np .arctan2 (c [1 ]- b [1 ], c [0 ]- b [0 ]) -
2994
3005
np .arctan2 (a [1 ]- b [1 ], a [0 ]- b [0 ]))
3006
+
3007
+ # resize an existing shape
2995
3008
elif self ._active_handle and self ._active_handle != 'C' :
2996
3009
sizepress = [x1 - x0 , y1 - y0 ]
2997
3010
center = [x0 + sizepress [0 ] / 2 , y0 + sizepress [1 ] / 2 ]
@@ -3048,8 +3061,8 @@ def _onmove(self, event):
3048
3061
# move existing shape
3049
3062
elif self ._active_handle == 'C' :
3050
3063
x0 , x1 , y0 , y1 = self ._extents_on_press
3051
- dx = event .xdata - self . _eventpress .xdata
3052
- dy = event .ydata - self . _eventpress .ydata
3064
+ dx = event .xdata - eventpress .xdata
3065
+ dy = event .ydata - eventpress .ydata
3053
3066
x0 += dx
3054
3067
x1 += dx
3055
3068
y0 += dy
@@ -3062,7 +3075,7 @@ def _onmove(self, event):
3062
3075
# ignore_event_outside=True
3063
3076
if self .ignore_event_outside and self ._selection_completed :
3064
3077
return
3065
- center = [self . _eventpress . xdata , self . _eventpress .ydata ]
3078
+ center = [eventpress . xdata , eventpress .ydata ]
3066
3079
dx = (event .xdata - center [0 ]) / 2.
3067
3080
dy = (event .ydata - center [1 ]) / 2.
3068
3081
0 commit comments