Observables for widgets that get rebuilt?

So I have a bunch of models that output the same plots, with parameter control. I want to be able to swap the models and the controller sliders update. Then using the new sliders should update the plots.

I have it mostly working, but it feels hackish, and I’m not sure how you are intended to do this kind of two-step observation process with observables: the model is observed and rebuilds the widgets, and those widgets then need to be observed.

Here I re-declare the observable mapping inside another mapping function:

function make_sliders(m)
    # extract data for sliders from the model
    params = Flatten.flatten(Vector, m)
    range = Flatten.metaflatten(Vector, m, DynamicEnergyBudgets.range)
    labels = Flatten.metaflatten(Vector, m, fieldname_meta)

    # rebuild the sliders for the new model
    sl = broadcast((x,l,v) -> InteractBase.slider(x[1]:(x[2]-x[1])/200:x[2], label=string(l), value=v), range, labels, params)

    # remap the slider values to another grouped observable
    map!((x...) -> [x...], sliderobs, throttle.(0.2, observe.(sl))...) 

    # remap slider observations (and checks from elsewhere) to update the plot
    map!(make_plot, plt, m, checkobs, sliderobs)
    sl
end
map!(make_sliders, sliders, model);

But this ends up with a lot of difficult to diagnose bugs, and doesn’t seem right.

Any ideas from people who understand a little more how observables work?

1 Like