/
bokeh.py
52 lines (39 loc) · 1.49 KB
/
bokeh.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
from __future__ import absolute_import
import ipywidgets as widgets
from bokeh.models import CustomJS
from traitlets import Unicode
import ipyvolume
semver_range_frontend = "~" + ipyvolume._version.__version_js__
@widgets.register
class WidgetManagerHackModel(widgets.Widget):
_model_name = Unicode('WidgetManagerHackModel').tag(sync=True)
_model_module = Unicode('ipyvolume').tag(sync=True)
_model_module_version = Unicode(semver_range_frontend).tag(sync=True)
wmh = None
def _ensure_widget_manager_hack():
global wmh
if not wmh:
wmh = WidgetManagerHackModel()
def link_data_source_selection_to_widget(data_source, widget, trait_name):
_ensure_widget_manager_hack()
callback = CustomJS(
args=dict(data=data_source),
code="""
var indices = data.selected["1d"].indices
var widget_id = '%s'
if(jupyter_widget_manager) {
// MYSTERY: if we use require, we end up at bokeh's require, which cannot find it, using requirejs it seems to work
requirejs(["@jupyter-widgets/base"], function(widgets) {
var widget_promise = widgets.unpack_models('IPY_MODEL_' +widget_id, jupyter_widget_manager)
widget_promise.then(function(widget) {
widget.set(%r, indices)
widget.save_changes()
})
})
} else {
console.error("no widget manager")
}
"""
% (widget.model_id, trait_name),
)
data_source.selected.js_on_change("indices", callback)