@@ -2609,11 +2609,6 @@ class SaveFigureBase(ToolBase):
2609
2609
class ToolToggleBase (ToolPersistentBase ):
2610
2610
toggle = True
2611
2611
cursor = None
2612
- capture_keypress = False
2613
- capture_move = False
2614
- capture_press = False
2615
- capture_release = False
2616
- lock_drawing = False
2617
2612
2618
2613
def mouse_move (self , event ):
2619
2614
pass
@@ -2637,23 +2632,30 @@ class ToolZoom(ToolToggleBase):
2637
2632
image = 'zoom_to_rect'
2638
2633
position = - 1
2639
2634
keymap = rcParams ['keymap.zoom' ]
2640
-
2641
2635
cursor = cursors .SELECT_REGION
2642
- capture_press = True
2643
- capture_release = True
2644
2636
2645
2637
def __init__ (self , * args ):
2646
2638
ToolToggleBase .__init__ (self , * args )
2647
2639
self ._ids_zoom = []
2648
2640
self ._button_pressed = None
2649
2641
self ._xypress = None
2650
2642
2643
+ def activate (self , event ):
2644
+ self .navigation .canvaslock (self )
2645
+ self .navigation .presslock (self )
2646
+ self .navigation .releaselock (self )
2647
+
2648
+ def deactivate (self , event ):
2649
+ self .navigation .canvaslock .release (self )
2650
+ self .navigation .presslock .release (self )
2651
+ self .navigation .releaselock .release (self )
2652
+
2651
2653
def press (self , event ):
2652
2654
"""the press mouse button in zoom to rect mode callback"""
2653
2655
# If we're already in the middle of a zoom, pressing another
2654
2656
# button works to "cancel"
2655
2657
if self ._ids_zoom != []:
2656
- self .capture_move = False
2658
+ self .navigation . movelock . release ( self )
2657
2659
for zoom_id in self ._ids_zoom :
2658
2660
self .figure .canvas .mpl_disconnect (zoom_id )
2659
2661
self .navigation .release (event )
@@ -2685,7 +2687,7 @@ def press(self, event):
2685
2687
self ._xypress .append ((x , y , a , i , a .viewLim .frozen (),
2686
2688
a .transData .frozen ()))
2687
2689
2688
- self .capture_move = True
2690
+ self .navigation . movelock ( self )
2689
2691
id2 = self .figure .canvas .mpl_connect ('key_press_event' ,
2690
2692
self ._switch_on_zoom_mode )
2691
2693
id3 = self .figure .canvas .mpl_connect ('key_release_event' ,
@@ -2726,7 +2728,7 @@ def mouse_move(self, event):
2726
2728
2727
2729
def release (self , event ):
2728
2730
"""the release mouse button callback in zoom to rect mode"""
2729
- self .capture_move = False
2731
+ self .navigation . movelock . release ( self )
2730
2732
for zoom_id in self ._ids_zoom :
2731
2733
self .figure .canvas .mpl_disconnect (zoom_id )
2732
2734
self ._ids_zoom = []
@@ -2859,17 +2861,23 @@ class ToolPan(ToolToggleBase):
2859
2861
description = 'Pan axes with left mouse, zoom with right'
2860
2862
image = 'move'
2861
2863
position = - 1
2862
-
2863
2864
cursor = cursors .MOVE
2864
- capture_press = True
2865
- capture_release = True
2866
- lock_drawing = True
2867
2865
2868
2866
def __init__ (self , * args ):
2869
2867
ToolToggleBase .__init__ (self , * args )
2870
2868
self ._button_pressed = None
2871
2869
self ._xypress = None
2872
2870
2871
+ def activate (self , event ):
2872
+ self .navigation .canvaslock (self )
2873
+ self .navigation .presslock (self )
2874
+ self .navigation .releaselock (self )
2875
+
2876
+ def deactivate (self , event ):
2877
+ self .navigation .canvaslock .release (self )
2878
+ self .navigation .presslock .release (self )
2879
+ self .navigation .releaselock .release (self )
2880
+
2873
2881
def press (self , event ):
2874
2882
"""the press mouse button in pan/zoom mode callback"""
2875
2883
@@ -2894,14 +2902,14 @@ def press(self, event):
2894
2902
a .get_navigate () and a .can_pan ()):
2895
2903
a .start_pan (x , y , event .button )
2896
2904
self ._xypress .append ((a , i ))
2897
- self .capture_move = True
2905
+ self .navigation . movelock ( self )
2898
2906
self .navigation .press (event )
2899
2907
2900
2908
def release (self , event ):
2901
2909
if self ._button_pressed is None :
2902
2910
return
2903
2911
2904
- self .capture_move = False
2912
+ self .navigation . movelock . release ( self )
2905
2913
2906
2914
for a , _ind in self ._xypress :
2907
2915
a .end_pan ()
@@ -2957,6 +2965,14 @@ def __init__(self, canvas, toolbar=None):
2957
2965
self ._instances = {}
2958
2966
self ._toggled = None
2959
2967
2968
+ #to communicate with tools and redirect events
2969
+ self .keypresslock = widgets .LockDraw ()
2970
+ self .movelock = widgets .LockDraw ()
2971
+ self .presslock = widgets .LockDraw ()
2972
+ self .releaselock = widgets .LockDraw ()
2973
+ #just to group all the locks in one place
2974
+ self .canvaslock = self .canvas .widgetlock
2975
+
2960
2976
for tool in self .tools :
2961
2977
self .add_tool (tool )
2962
2978
@@ -2991,13 +3007,12 @@ def remove_tool(self, name):
2991
3007
def add_tool (self , callback_class ):
2992
3008
tool = self ._get_cls_to_instantiate (callback_class )
2993
3009
name = tool .name
3010
+
2994
3011
if name is None :
2995
- #TODO: add a warning
2996
- print ('impossible to add without name' )
3012
+ warnings .warn ('Tools need a name to be added, it is used as ID' )
2997
3013
return
2998
3014
if name in self ._tools :
2999
- #TODO: add a warning
3000
- print ('impossible to add two times with the same name' )
3015
+ warnings .warn ('A tool with the same name already exist, not added' )
3001
3016
return
3002
3017
3003
3018
self ._tools [name ] = tool
@@ -3040,8 +3055,10 @@ def key_press(self, event):
3040
3055
return
3041
3056
3042
3057
#some tools may need to capture keypress, but they need to be toggle
3043
- if self ._toggled and self ._tools [self ._toggled ].capture_keypress :
3044
- self ._instances [self ._toggled ].key_press (event )
3058
+ if self ._toggled :
3059
+ instance = self ._get_instance (self ._toggled )
3060
+ if self .keypresslock .isowner (instance ):
3061
+ instance .key_press (event )
3045
3062
return
3046
3063
3047
3064
name = self ._keys .get (event .key , None )
@@ -3062,6 +3079,7 @@ def key_press(self, event):
3062
3079
def _get_instance (self , name ):
3063
3080
if name not in self ._instances :
3064
3081
instance = self ._tools [name ](self .canvas .figure )
3082
+ #register instance
3065
3083
self ._instances [name ] = instance
3066
3084
3067
3085
return self ._instances [name ]
@@ -3077,20 +3095,18 @@ def toolbar_callback(self, name):
3077
3095
tool (self .canvas .figure , None )
3078
3096
3079
3097
def _handle_toggle (self , name , event = None , from_toolbar = False ):
3080
- #when from keypress toggle toolbar without callback
3098
+ #toggle toolbar without callback
3081
3099
if not from_toolbar and self .toolbar :
3082
3100
self .toolbar .toggle (name , False )
3083
3101
3084
3102
instance = self ._get_instance (name )
3085
3103
if self ._toggled is None :
3086
3104
instance .activate (None )
3087
3105
self ._toggled = name
3088
- self .canvas .widgetlock (self )
3089
3106
3090
3107
elif self ._toggled == name :
3091
3108
instance .deactivate (None )
3092
3109
self ._toggled = None
3093
- self .canvas .widgetlock .release (self )
3094
3110
3095
3111
else :
3096
3112
if self .toolbar :
@@ -3124,7 +3140,7 @@ def update(self):
3124
3140
def mouse_move (self , event ):
3125
3141
if self ._toggled :
3126
3142
instance = self ._instances [self ._toggled ]
3127
- if instance . capture_move :
3143
+ if self . movelock . isowner ( instance ) :
3128
3144
instance .mouse_move (event )
3129
3145
return
3130
3146
@@ -3159,7 +3175,7 @@ def mouse_move(self, event):
3159
3175
def _release (self , event ):
3160
3176
if self ._toggled :
3161
3177
instance = self ._instances [self ._toggled ]
3162
- if instance . capture_release :
3178
+ if self . releaselock . isowner ( instance ) :
3163
3179
instance .release (event )
3164
3180
return
3165
3181
self .release (event )
@@ -3171,7 +3187,7 @@ def _press(self, event):
3171
3187
"""Called whenver a mouse button is pressed."""
3172
3188
if self ._toggled :
3173
3189
instance = self ._instances [self ._toggled ]
3174
- if instance . capture_press :
3190
+ if self . presslock . isowner ( instance ) :
3175
3191
instance .press (event )
3176
3192
return
3177
3193
self .press (event )
@@ -3333,7 +3349,7 @@ def set_message(self, s):
3333
3349
pass
3334
3350
3335
3351
def toggle (self , name , callback = False ):
3336
- #carefull, callback means to perform or not the callback while toggling
3352
+ #callback = perform or not the callback while toggling
3337
3353
raise NotImplementedError
3338
3354
3339
3355
def remove_toolitem (self , name ):
0 commit comments