@@ -70,12 +70,9 @@ def draw_wrapper(artist, renderer, *args, **kwargs):
7070 return draw_wrapper
7171
7272
73- def _stale_figure_callback (self ):
74- self .figure .stale = True
75-
76-
77- def _stale_axes_callback (self ):
78- self .axes .stale = True
73+ def _stale_axes_callback (self , val ):
74+ if self .axes :
75+ self .axes .stale = val
7976
8077
8178class Artist (PrivateMethodMixin , Configurable ):
@@ -104,9 +101,14 @@ def _transform_getter(self, value, trait):
104101
105102 stale = Bool (True )
106103
107- def _stale_changed (self ):
108- if self .stale :
109- self .pchanged ()
104+ def _stale_validate (self , value , trait ):
105+ if self .get_animated ():
106+ return self .stale
107+ return value
108+
109+ def _stale_changed (self , name , new ):
110+ if new and self .stale_callback is not None :
111+ self .stale_callback (self , new )
110112
111113 transform_set = Bool (False )
112114
@@ -117,15 +119,17 @@ def _axes_changed(self, name, old, new):
117119 "in more than one Axes which is not "
118120 "supported" )
119121 if new not in (Undefined ,None ) and new is not self :
120- self .add_callback ( _stale_axes_callback )
122+ self .stale_callback = _stale_axes_callback
121123
122124 axes = Instance (str ('matplotlib.axes.Axes' ), allow_none = True )
123125
124126 figure = Instance (str ('matplotlib.figure.Figure' ), allow_none = True )
125127
126- def _figure_changed (self , name , new ):
128+ def _figure_changed (self , name , old , new ):
129+ if old not in (None , Undefined ):
130+ raise RuntimeError ("Can not put single artist in "
131+ "more than one figure" )
127132 if new and new is not self :
128- self .add_callback (_stale_figure_callback )
129133 self .pchanged ()
130134 self .stale = True
131135
@@ -136,6 +140,7 @@ def __init__(self):
136140
137141 # self._transform = None
138142 # self._transformSet = False
143+ self .stale_callback = None
139144 self ._visible = True
140145 self ._animated = False
141146 self ._alpha = None
@@ -168,6 +173,9 @@ def __getstate__(self):
168173 # remove the unpicklable remove method, this will get re-added on load
169174 # (by the axes) if the artist lives on an axes.
170175 d ['_remove_method' ] = None
176+ d ['stale_callback' ] = None
177+ # .private(name, value) forces _notify_trait into __dict__
178+ d .pop ('_notify_trait' , None )
171179 return d
172180
173181 def remove (self ):
0 commit comments