sclass Tab { S name; } compact module Tabs { L tabs_actual = notifyingList(r { dm_q(r updateTabs) }); transient L tabs; transient JTabbedPane jtabs; start { tabs = notifyingList(tabs_actual, r { dm_q(r updateTabs) }); } visualize { jtabs = jtabs(); updateTabs(); ret withLeftAlignedButtonsAbove(jtabs, "+", rThread { inputText("Name for new tab", voidfunc(S s) { addTab(s) }) }, ); } void updateTabs { if (jtabs == null) ret; fillJTabs(jtabs, collect name(tabs)); } // API void addTab(S name) { tabs.add(nu(Tab, +name)); } }