17
17
18
18
from .traitlets import (Instance , Configurable , gTransformInstance , Bool , Undefined , Union ,
19
19
BaseDescriptor , getargspec , PrivateMethodMixin , Float , TraitError ,
20
- Unicode , Stringlike , Callable , Tuple , List )
20
+ Unicode , Stringlike , Callable , Tuple , List , observe , validate , default )
21
21
22
22
from urlparse import urlparse
23
23
@@ -90,92 +90,109 @@ class Artist(PrivateMethodMixin, Configurable):
90
90
91
91
transform = gTransformInstance (IdentityTransform ())
92
92
93
- def _transform_changed (self ):
93
+ @observe ('transform' )
94
+ def _transform_changed (self , change ):
94
95
self .pchanged ()
95
96
self .stale = True
96
97
97
- def _transform_validate (self , value , trait ):
98
+ @validate ('transform' )
99
+ def _transform_validate (self , commit ):
98
100
self .transform_set = True
99
- return value
101
+ return commit [ ' value' ]
100
102
101
- def _transform_getter (self , value , trait ):
102
- if trait ._conversion_method :
103
- return value (self .axes )
104
- return value
103
+ def _transform_getter (self , pull ):
104
+ if pull [ ' trait' ] ._conversion_method :
105
+ return pull [ ' value' ] (self .axes )
106
+ return pull [ ' value' ]
105
107
106
108
stale = Bool (True )
107
109
108
- def _stale_validate (self , value , trait ):
110
+ @validate ('stale' )
111
+ def _stale_validate (self , commit ):
109
112
if self .animated :
110
113
return self .stale
111
- return value
114
+ return commit [ ' value' ]
112
115
113
- def _stale_changed (self , name , new ):
114
- if new and self .stale_callback is not None :
115
- self .stale_callback (self , new )
116
+ @observe ('stale' )
117
+ def _stale_changed (self , change ):
118
+ if change ['new' ] and self .stale_callback is not None :
119
+ self .stale_callback (self , change ['new' ])
116
120
117
121
transform_set = Bool (False )
118
122
119
- def _axes_changed (self , name , old , new ):
123
+ axes = Instance (str ('matplotlib.axes.Axes' ), allow_none = True )
124
+
125
+ @observe ('axes' )
126
+ def _axes_changed (self , change ):
127
+ new , old = change ['new' ], change ['old' ]
120
128
if new and old not in (Undefined ,None ):
121
129
raise ValueError ("Can not reset the axes. You are "
122
130
"probably trying to re-use an artist "
123
131
"in more than one Axes which is not "
124
132
"supported" )
133
+
125
134
if new not in (Undefined ,None ) and new is not self :
126
135
self .stale_callback = _stale_axes_callback
127
136
128
- axes = Instance (str ('matplotlib.axes.Axes' ), allow_none = True )
129
-
130
137
figure = Instance (str ('matplotlib.figure.FigureBase' ), allow_none = True )
131
138
132
- def _figure_changed (self , name , old , new ):
133
- if old not in (None , Undefined ):
139
+ @observe ('figure' )
140
+ def _figure_changed (self , change ):
141
+ if change ['old' ] not in (None , Undefined ):
134
142
raise RuntimeError ("Can not put single artist in "
135
143
"more than one figure" )
144
+ new = change ['new' ]
136
145
if new and new is not self :
137
146
self .pchanged ()
138
147
self .stale = True
139
148
140
149
visible = Bool (True )
141
150
142
- def _visible_changed (self , name , new ):
151
+ @observe ('visible' )
152
+ def _visible_changed (self , change ):
143
153
self .pchanged ()
144
154
self .stale = True
145
155
146
156
animated = Bool (False )
147
157
148
- def _animated_changed (self , name , new ):
158
+ @observe ('animated' )
159
+ def _animated_changed (self , change ):
149
160
self .pchanged ()
150
161
self .stale = True
151
162
152
163
# Float defaults to 0.0, must have None arg
153
164
alpha = Float (None , allow_none = True )
154
165
155
- def _alpha_validate (self , value , trait ):
156
- if 0 > value > 1 :
166
+ @validate ('alpha' )
167
+ def _alpha_validate (self , commit ):
168
+ if 0 > commit ['value' ]> 1 :
157
169
msg = ("The '%s' trait of %s instance can only be"
158
- "transparent (0.0) through opaque (1.0)" )
159
- raise TraitError (msg % (trait .name , self .__class__ ))
160
- return value
170
+ " transparent (0.0) through opaque (1.0)" )
171
+ repl = (commit ['trait' ].name , self .__class__ .__name__ )
172
+ raise TraitError (msg % repl )
173
+ return commit ['value' ]
161
174
162
- def _alpha_changed (self , name , new ):
175
+ @observe ('alpha' )
176
+ def _alpha_changed (self , c ):
163
177
self .pchanged ()
164
178
self .stale = True
165
179
166
180
rasterized = Bool (None , allow_none = True )
167
181
168
- def _rasterized_changed (self , name , new ):
169
- if new and not hasattr (self .draw , "_supports_rasterization" ):
182
+ @observe ('rasterized' )
183
+ def _rasterized_changed (self , change ):
184
+ if change ['new' ] and not hasattr (self .draw , "_supports_rasterization" ):
170
185
warnings .warn ("Rasterization of '%s' will be ignored" % self )
171
186
172
187
pickable = Bool ()
173
188
174
- def _pickabe_validate (self , value , trait ):
189
+ @validate ('pickable' )
190
+ def _pickabe_validate (self , commit ):
175
191
msg = "the '%s' trait of a %s instance is not assignable"
176
- raise TraitError (msg % (trait .name , self .__class__ .__name__ ))
192
+ repl = (commit ['trait' ].name , self .__class__ .__name__ )
193
+ raise TraitError (msg % repl )
177
194
178
- def _pickable_getter (self ):
195
+ def _pickable_getter (self , pull ):
179
196
return (self .figure is not None and
180
197
self .figure .canvas is not None and
181
198
self .picker is not None )
@@ -184,87 +201,112 @@ def _pickable_getter(self):
184
201
185
202
clipbox = Instance (str ('matplotlib.transforms.BboxBase' ), allow_none = True )
186
203
187
- def _clipbox_changed (self , name , old , new ):
204
+ @observe ('clipbox' )
205
+ def _clipbox_changed (self , change ):
188
206
self .pchanged ()
189
207
self .stale = True
190
208
191
209
clippath = Union ((Instance (str ('matplotlib.patches.Patch' )),
192
210
Instance (str ('matplotlib.transforms.TransformedPath' ))),
193
211
allow_none = True )
194
212
213
+ @default ('clippath' )
195
214
def _clippath_default (self ): pass
196
215
197
- def _clippath_validate (self , value , trait ):
216
+ @validate ('clippath' )
217
+ def _clippath_validate (self , commit ):
218
+ value , trait = commit ['value' ], commit ['trait' ]
198
219
if isinstance (value , trait .trait_types [0 ].klass ):
199
220
value = TransformedPath (value .get_path (), value .transform )
200
221
return value
201
222
202
- def _clippath_changed (self , name , new , old ):
223
+ @observe ('clippath' )
224
+ def _clippath_changed (self , change ):
203
225
self .pchanged ()
204
226
self .s
17AE
tale = True
205
227
206
228
clipon = Bool (True )
207
229
208
- def _clipon_changed (self , name , old , new ):
230
+ @observe ('clipon' )
231
+ def _clipon_changed (self , change ):
209
232
self .pchanged ()
210
233
self .stale = True
211
234
212
235
label = Stringlike ('' , allow_none = True )
213
236
214
- def _label_changed (self , name , old , new ):
237
+ @observe ('label' )
238
+ def _label_changed (self , change ):
215
239
self .pchanged ()
216
240
217
241
picker = Union ((Bool (),Float (),Callable ()), allow_none = True )
218
242
243
+ @default ('picker' )
219
244
def _picker_default (self ): pass
220
245
221
246
_contains = Callable (None , allow_none = True )
222
247
223
248
mouseover = Bool (False )
224
249
225
- def _mouseover_validate (self , value , trait ):
250
+ @validate ('mouseover' )
251
+ def _mouseover_validate (self , commit ):
226
252
ax = self .axes
227
253
if ax :
228
- if value :
254
+ if commit [ ' value' ] :
229
255
ax .mouseover_set .add (self )
230
256
else :
231
257
ax .mouseover_set .discard (self )
232
- return value
258
+ return commit [ ' value' ]
233
259
234
260
agg_filter = Callable (None , allow_none = True )
235
261
236
- def _agg_filter_changed (self ):
262
+ @observe ('agg_filter' )
263
+ def _agg_filter_changed (self , change ):
237
264
self .stale = True
238
265
239
266
snap = Bool (None , allow_none = True )
240
267
241
- def _snap_getter (self , value , trait ):
268
+ def _snap_getter (self , pull ):
242
269
if rcParams ['path.snap' ]:
243
- return value
270
+ return pull [ ' value' ]
244
271
else :
245
272
return False
246
273
247
- def _snap_changed (self ):
274
+ @observe ('snap' )
275
+ def _snap_changed (self , change ):
248
276
self .stale = True
249
277
250
278
sketch_scale = Float (None , allow_none = True )
251
279
252
- def _sketch_scale_changed (self , name , new ):
253
- self .sketch_params = (new , self .sketch_length , self .sketch_randomness )
280
+ @observe ('sketch_scale' )
281
+ def _sketch_scale_changed (self , change ):
282
+ new = change ['new' ]
283
+ length = self .sketch_length
284
+ randomness = self .sketch_randomness
285
+ self .sketch_params = (new , length , randomness )
254
286
255
287
sketch_length = Float (None , allow_none = True )
256
288
257
- def _sketch_length_changed (self , name , new ):
258
- self .sketch_params = (self .sketch_scale , new , self .sketch_randomness )
289
+ @observe ('sketch_length' )
290
+ def _sketch_length_changed (self , change ):
291
+ new = change ['new' ]
292
+ scale = self .sketch_scale
293
+ randomness = self .sketch_randomness
294
+ self .sketch_params = (scale , new , randomness )
259
295
260
296
sketch_randomness = Float (None , allow_none = True )
261
297
262
- def _sketch_randomness_changed (self , name , new ):
263
- self .sketch_params = (self .sketch_scale , self .sketch_length , new )
298
+ @observe ('sketch_randomness' )
299
+ def _sketch_randomness_changed (self , change ):
300
+ new = change ['new' ]
301
+ scale = self .sketch_scale
302
+ length = self .sketch_length
303
+ self .sketch_params = (scale , length , new )
264
304
265
305
sketch_params = Tuple (allow_none = True )
266
306
267
- def _sketch_validate (self , value , trait ):
307
+ @validate ('sketch' )
308
+ def _sketch_validate (self , commit ):
309
+ value = commit ['value' ]
268
310
names = ('sketch_scale' ,
269
311
'sketch_length' ,
270
312
'sketch_randomness' )
@@ -278,13 +320,15 @@ def _sketch_validate(self, value, trait):
278
320
for n ,v in zip (names , params ):
279
321
self .private (n , v )
280
322
281
- def _sketch_params_changed (self , name , new ):
323
+ @observe ('sketch_params' )
324
+ def _sketch_params_changed (self , change ):
282
325
self .stale = True
283
326
284
327
path_effects = List (Instance ('matplotlib.patheffects.AbstractPathEffect' ),
285
328
allow_none = True )
286
329
287
- def _path_effects_changed (self ):
330
+ @observe ('path_effects' )
331
+ def _path_effects_changed (self , change ):
288
332
self .stale = True
289
333
290
334
url = Unicode (allow_none = True )
@@ -328,13 +372,11 @@ def __init__(self):
328
372
self .path_effects = rcParams ['path.effects' ]
329
373
330
374
def __getstate__ (self ):
331
- d = self . __dict__ . copy ()
375
+ d = super ( Artist , self ). __getstate__ ()
332
376
# remove the unpicklable remove method, this will get re-added on load
333
377
# (by the axes) if the artist lives on an axes.
334
378
d ['_remove_method' ] = None
335
379
d ['stale_callback' ] = None
336
- # .private(name, value) forces _notify_trait into __dict__
337
- d .pop ('_notify_trait' , None )
338
380
return d
339
381
340
382
def remove (self ):
0 commit comments