@@ -77,14 +77,37 @@ def __init__(self, toolmanager, name):
77
77
'experimental for now, the API will likely change in ' +
78
78
'version 2.1, and some tools might change name' )
79
79
self ._name = name
80
+ self ._toolmanager = toolmanager
80
81
self ._figure = None
81
- self .toolmanager = toolmanager
82
- self .figure = toolmanager .canvas .figure
83
82
84
83
@property
85
84
def figure (self ):
86
85
return self ._figure
87
86
87
+ @figure .setter
88
+ def figure (self , figure ):
89
+ self .set_figure (figure )
90
+
91
+ @property
92
+ def canvas (self ):
93
+ if not self ._figure :
94
+ return None
95
+ return self ._figure .canvas
96
+
97
+ @property
98
+ def toolmanager (self ):
99
+ return self ._toolmanager
100
+
101
+ def set_figure (self , figure ):
102
+ """
103
+ Assign a figure to the tool
104
+
105
+ Parameters
106
+ ----------
107
+ figure: `Figure`
108
+ """
109
+ self ._figure = figure
110
+
88
111
def trigger (self , sender , event , data = None ):
89
112
"""
90
113
Called when this tool gets used
@@ -104,20 +127,6 @@ def trigger(self, sender, event, data=None):
104
127
105
128
pass
106
129
107
- @figure .setter
108
- def figure (self , figure ):
109
- """
110
- Set the figure
111
-
112
- Set the figure to be affected by this tool
113
-
114
- Parameters
115
- ----------
116
- figure: `Figure`
117
- """
118
-
119
- self ._figure = figure
120
-
121
130
@property
122
131
def name (self ):
123
132
"""Tool Id"""
@@ -193,6 +202,14 @@ def toggled(self):
193
202
194
203
return self ._toggled
195
204
205
+ def set_figure (self , figure ):
206
+ toggled = self .toggled
207
+ if toggled :
208
+ self .trigger (self , None )
209
+ ToolBase .set_figure (self , figure )
210
+ if figure and toggled :
211
+ self .trigger (self , None )
212
+
196
213
197
214
class SetCursorBase (ToolBase ):
198
215
"""
@@ -203,8 +220,7 @@ class SetCursorBase(ToolBase):
203
220
"""
204
221
def __init__ (self , * args , ** kwargs ):
205
222
ToolBase .__init__ (self , * args , ** kwargs )
206
- self ._idDrag = self .figure .canvas .mpl_connect (
207
- 'motion_notify_event' , self ._set_cursor_cbk )
223
+ self ._idDrag = None
208
224
self ._cursor = None
209
225
self ._default_cursor = cursors .POINTER
210
226
self ._last_cursor = self ._default_cursor
@@ -215,6 +231,14 @@ def __init__(self, *args, **kwargs):
215
231
for tool in self .toolmanager .tools .values ():
216
232
self ._add_tool (tool )
217
233
234
+ def set_figure (self , figure ):
235
+ if self ._idDrag :
236
+ self .canvas .mpl_disconnect (self ._idDrag )
237
+ ToolBase .set_figure (self , figure )
238
+ if figure :
239
+ self ._idDrag = self .canvas .mpl_connect (
240
+ 'motion_notify_event' , self ._set_cursor_cbk )
241
+
218
242
def _tool_trigger_cbk (self , event ):
219
243
if event .tool .toggled :
220
244
self ._cursor = event .tool .cursor
@@ -266,9 +290,16 @@ class ToolCursorPosition(ToolBase):
266
290
This tool runs in the background reporting the position of the cursor
267
291
"""
268
292
def __init__ (self , * args , ** kwargs ):
293
+ self ._idDrag = None
269
294
ToolBase .__init__ (self , * args , ** kwargs )
270
- self ._idDrag = self .figure .canvas .mpl_connect (
271
- 'motion_notify_event' , self .send_message )
295
+
296
+ def set_figure (self , figure ):
297
+ if self ._idDrag :
298
+ self .canvas .mpl_disconnect (self ._idDrag )
299
+ ToolBase .set_figure (self , figure )
300
+ if figure :
301
+ self ._idDrag = self .canvas .mpl_connect (
302
+ 'motion_notify_event' , self .send_message )
272
303
273
304
def send_message (self , event ):
274
305
"""Call `matplotlib.backend_managers.ToolManager.message_event`"""
@@ -458,16 +489,17 @@ def __init__(self, *args, **kwargs):
458
489
self .home_views = WeakKeyDictionary ()
459
490
ToolBase .__init__ (self , * args , ** kwargs )
460
491
461
- def add_figure (self ):
492
+ def add_figure (self , figure ):
462
493
"""Add the current figure to the stack of views and positions"""
463
- if self .figure not in self .views :
464
- self .views [self .figure ] = cbook .Stack ()
465
- self .positions [self .figure ] = cbook .Stack ()
466
- self .home_views [self .figure ] = WeakKeyDictionary ()
494
+
495
+ if figure not in self .views :
496
+ self .views [figure ] = cbook .Stack ()
497
+ self .positions [figure ] = cbook .Stack ()
498
+ self .home_views [figure ] = WeakKeyDictionary ()
467
499
# Define Home
468
- self .push_current ()
500
+ self .push_current (figure )
469
501
# Make sure we add a home view for new axes as they're added
470
- self . figure .add_axobserver (lambda fig : self .update_home_views ())
502
+ figure .add_axobserver (lambda fig : self .update_home_views (fig ))
471
503
472
504
def clear (self , figure ):
473
505
"""Reset the axes stack"""
@@ -508,18 +540,19 @@ def update_view(self):
508
540
509
541
self .figure .canvas .draw_idle ()
510
542
511
- def push_current (self ):
543
+ def push_current (self , figure = None ):
512
544
"""
513
545
Push the current view limits and position onto their respective stacks
514
546
"""
515
-
547
+ if not figure :
548
+ figure = self .figure
516
549
views = WeakKeyDictionary ()
517
550
pos = WeakKeyDictionary ()
518
- for a in self . figure .get_axes ():
551
+ for a in figure .get_axes ():
519
552
views [a ] = a ._get_view ()
520
553
pos [a ] = self ._axes_pos (a )
521
- self .views [self . figure ].push (views )
522
- self .positions [self . figure ].push (pos )
554
+ self .views [figure ].push (views )
555
+ self .positions [figure ].push (pos )
523
556
524
557
def _axes_pos (self , ax ):
525
558
"""
@@ -539,15 +572,17 @@ def _axes_pos(self, ax):
539
572
return (ax .get_position (True ).frozen (),
540
573
ax .get_position ().frozen ())
541
574
542
- def update_home_views (self ):
575
+ def update_home_views (self , figure = None ):
543
576
"""
544
577
Make sure that self.home_views has an entry for all axes present in the
545
578
figure
546
579
"""
547
580
548
- for a in self .figure .get_axes ():
549
- if a not in self .home_views [self .figure ]:
550
- self .home_views [self .figure ][a ] = a ._get_view ()
581
+ if not figure :
582
+ figure = self .figure
583
+ for a in figure .get_axes ():
584
+ if a not in self .home_views [figure ]:
585
+ self .home_views [figure ][a ] = a ._get_view ()
551
586
552
587
def refresh_locators (self ):
553
588
"""Redraw the canvases, update the locators"""
@@ -592,7 +627,7 @@ class ViewsPositionsBase(ToolBase):
592
627
_on_trigger = None
593
628
594
629
def trigger (self , sender , event , data = None ):
595
- self .toolmanager .get_tool (_views_positions ).add_figure ()
630
+ self .toolmanager .get_tool (_views_positions ).add_figure (self . figure )
596
631
getattr (self .toolmanager .get_tool (_views_positions ),
597
632
self ._on_trigger )()
598
633
self .toolmanager .get_tool (_views_positions ).update_view ()
@@ -672,7 +707,7 @@ def disable(self, event):
672
707
self .figure .canvas .mpl_disconnect (self ._idScroll )
673
708
674
709
def trigger (self , sender , event , data = None ):
675
- self .toolmanager .get_tool (_views_positions ).add_figure ()
710
+ self .toolmanager .get_tool (_views_positions ).add_figure (self . figure )
676
711
ToolToggleBase .trigger (self , sender , event , data )
677
712
678
713
def scroll_zoom (self , event ):
0 commit comments