def links_to_jslinks(model, widget): from ..widgets import Widget src_links = [Watcher(*l[:-4]) for l in widget._links] if any(w not in widget._callbacks and w not in src_links for w in get_watchers(widget)): return links = [] for link in widget._links: target = link.target tgt_watchers = [ w for w in get_watchers(target) if w not in target._callbacks ] if link.transformed or (tgt_watchers and not isinstance(target, Widget)): return mappings = [] for pname, tgt_spec in link.links.items(): if Watcher(*link[:-4]) in widget._param_watchers[pname]['value']: mappings.append((pname, tgt_spec)) if mappings: links.append((link, mappings)) jslinks = [] for link, mapping in links: for src_spec, tgt_spec in mapping: jslink = link_to_jslink(model, widget, src_spec, link.target, tgt_spec) if jslink is None: return widget.param.trigger(src_spec) jslinks.append(jslink) return jslinks
def param_to_jslink(model, widget): """ Converts Param pane widget links into JS links if possible. """ from ..reactive import Reactive from ..widgets import Widget, LiteralInput param_pane = widget._param_pane pobj = param_pane.object pname = [k for k, v in param_pane._widgets.items() if v is widget] watchers = [ w for w in get_watchers(widget) if w not in widget._callbacks and w not in param_pane._callbacks ] if isinstance(pobj, Reactive): tgt_links = [Watcher(*l[:-4]) for l in pobj._links] tgt_watchers = [ w for w in get_watchers(pobj) if w not in pobj._callbacks and w not in tgt_links and w not in param_pane._callbacks ] else: tgt_watchers = [] for widget in param_pane._widgets.values(): if isinstance(widget, LiteralInput): widget.serializer = 'json' if (not pname or not isinstance(pobj, Reactive) or watchers or pname[0] not in pobj._linkable_params or (not isinstance(pobj, Widget) and tgt_watchers)): return return link_to_jslink(model, widget, 'value', pobj, pname[0])