def link(change, watchers=[watcher]): updates = {} if change.what == 'constant': updates['disabled'] = change.new elif change.what == 'precedence': if (change.new < self.display_threshold and widget in self._widget_box.objects): self._widget_box.pop(widget) elif change.new >= self.display_threshold: precedence = lambda k: self.object.param[ 'name' if k == '_title' else k].precedence params = self._ordered_params if self.show_name: params.insert(0, '_title') widgets = [] for k in params: if precedence(k) is None or precedence( k) >= self.display_threshold: widgets.append(self._widgets[k]) self._widget_box.objects = widgets return elif change.what == 'objects': updates['options'] = p_obj.get_range() elif change.what == 'bounds': start, end = p_obj.get_soft_bounds() updates['start'] = start updates['end'] = end elif change.what == 'step': updates['step'] = p_obj.step elif change.what == 'label': updates['name'] = p_obj.label elif p_name in self._updating: return elif hasattr(param, 'Event') and isinstance(p_obj, param.Event): return elif isinstance(p_obj, param.Action): prev_watcher = watchers[0] widget.param.unwatch(prev_watcher) def action(event): change.new(self.object) watchers[0] = widget.param.watch(action, 'clicks') idx = self._callbacks.index(prev_watcher) self._callbacks[idx] = watchers[0] return else: updates['value'] = change.new try: self._updating.append(p_name) if change.type == 'triggered': with discard_events(widget): widget.param.set_param(**updates) widget.param.trigger(*updates) else: widget.param.set_param(**updates) finally: self._updating.remove(p_name)
def link(change, watchers=[watcher]): updates = {} widget = self._widgets[p_name] if change.what == 'constant': updates['disabled'] = change.new elif change.what == 'precedence': if (change.new < self.display_threshold and widget in self._widget_box.objects): self._widget_box.pop(widget) elif change.new >= self.display_threshold: self._rerender() return elif change.what == 'objects': updates['options'] = p_obj.get_range() elif change.what == 'bounds': start, end = p_obj.get_soft_bounds() supports_bounds = hasattr(widget, 'start') if start is None or end is None: rerender = supports_bounds else: rerender = not supports_bounds if supports_bounds: updates['start'] = start updates['end'] = end if rerender: self._rerender_widget(p_name) return elif change.what == 'step': updates['step'] = p_obj.step elif change.what == 'label': updates['name'] = p_obj.label elif p_name in self._updating: return elif hasattr(param, 'Event') and isinstance(p_obj, param.Event): return elif isinstance(p_obj, param.Action): prev_watcher = watchers[0] widget.param.unwatch(prev_watcher) def action(event): change.new(self.object) watchers[0] = widget.param.watch(action, 'clicks') idx = self._callbacks.index(prev_watcher) self._callbacks[idx] = watchers[0] return elif kw_widget.get('throttled', False) and hasattr(widget, 'value_throttled'): updates['value_throttled'] = change.new else: updates['value'] = change.new try: self._updating.append(p_name) if change.type == 'triggered': with discard_events(widget): widget.param.set_param(**updates) widget.param.trigger(*updates) else: widget.param.set_param(**updates) finally: self._updating.remove(p_name)
def test_discard_events_decorator(self): def accumulator(change): self.accumulator += change.new obj = SimpleWatchExample() obj.param.watch(accumulator, 'a') with discard_events(obj): obj.a = 1 self.assertEqual(self.accumulator, 0) obj.a = 2 self.assertEqual(self.accumulator, 3)