Show More
@@ -227,6 +227,57 b' class link(object):' | |||
|
227 | 227 | (obj,attr) = key |
|
228 | 228 | obj.on_trait_change(callback, attr, remove=True) |
|
229 | 229 | |
|
230 | @skip_doctest | |
|
231 | class unilink(object): | |
|
232 | """Link the trait of a source object with traits of target objects. | |
|
233 | ||
|
234 | Parameters | |
|
235 | ---------- | |
|
236 | source : pair of object, name | |
|
237 | targets : pairs of objects/attributes | |
|
238 | ||
|
239 | Examples | |
|
240 | -------- | |
|
241 | ||
|
242 | >>> c = unilink((src, 'value'), (tgt1, 'value'), (tgt2, 'value')) | |
|
243 | >>> src.value = 5 # updates target objects | |
|
244 | >>> tgt1.value = 6 # does not update other objects | |
|
245 | """ | |
|
246 | updating = False | |
|
247 | ||
|
248 | def __init__(self, source, *targets): | |
|
249 | self.source = source | |
|
250 | self.targets = targets | |
|
251 | ||
|
252 | # Update current value | |
|
253 | src_attr_value = getattr(source[0], source[1]) | |
|
254 | for obj, attr in targets: | |
|
255 | if getattr(obj, attr) != src_attr_value: | |
|
256 | setattr(obj, attr, src_attr_value) | |
|
257 | ||
|
258 | # Wire | |
|
259 | self.source[0].on_trait_change(self._update, self.source[1]) | |
|
260 | ||
|
261 | @contextlib.contextmanager | |
|
262 | def _busy_updating(self): | |
|
263 | self.updating = True | |
|
264 | try: | |
|
265 | yield | |
|
266 | finally: | |
|
267 | self.updating = False | |
|
268 | ||
|
269 | def _update(self, name, old, new): | |
|
270 | if self.updating: | |
|
271 | return | |
|
272 | with self._busy_updating(): | |
|
273 | for obj, attr in self.targets: | |
|
274 | setattr(obj, attr, new) | |
|
275 | ||
|
276 | def unlink(self): | |
|
277 | self.source[0].on_trait_change(self.update, self.source[1], remove=True) | |
|
278 | self.source = None | |
|
279 | self.targets = [] | |
|
280 | ||
|
230 | 281 | #----------------------------------------------------------------------------- |
|
231 | 282 | # Base TraitType for all traits |
|
232 | 283 | #----------------------------------------------------------------------------- |
General Comments 0
You need to be logged in to leave comments.
Login now