from bokeh.io import vform
from bokeh.models import Callback, ColumnDataSource, Slider
from bokeh.plotting import figure, output_file, show

output_file("callback.html")

x = [x*0.005 for x in range(0, 200)]
y = x

source = ColumnDataSource(data=dict(x=x, y=y))

plot = figure(plot_width=400, plot_height=400)
plot.line('x', 'y', source=source, line_width=3, line_alpha=0.6)

callback2 = Callback(args=dict(source=source), code="console.log('I was called')")
slider2 = Slider(start=0, end=4, value=1, step=.1, title="power",
    callback=callback2)

callback = Callback(args=dict(source=source, slider=slider2), code="""
    var f = cb_obj.get('value')
    value = slider.get('value')
    console.log('Old value: ' + value)
    slider.set('value', f)
    value = slider.get('value')
    console.log('New value', value)
    slider.trigger('change')

    var data = source.get('data');
    x = data['x']
    y = data['y']
    for (i = 0; i < x.length; i++) {
    y[i] = Math.pow(x[i], f)
    }
    source.trigger('change');
""")
slider_source = ColumnDataSource(data=dict(value=1))

slider = Slider(start=0.1, end=4, value=1, step=.1, title="power",
    callback=callback)

layout = vform(slider, slider2, plot)

show(layout)
