kkallio@8: datatype panelState = Open | Closed
kkallio@8:
adam@27: con formatCtl = fn ctx :: {Unit} => [[Dyn] ~ ctx] =>
adam@27: {FormatPanel : xml ([Dyn] ++ ctx) [] []
adam@27: -> xml ([Dyn] ++ ctx) [] []
adam@27: -> xml ([Dyn] ++ ctx) [] [],
adam@27: OpenCtl : transaction unit -> xml ([Dyn] ++ ctx) [] [],
adam@27: CloseCtl : transaction unit -> xml ([Dyn] ++ ctx) [] []}
kkallio@8:
adam@27: val defaultFormat [[Dyn] ~ body'] =
adam@20: {FormatPanel = fn ctl panel => {ctl}{panel},
adam@20: OpenCtl = fn behaviour => ,
adam@20: CloseCtl = fn behaviour => }
kkallio@8:
adam@20: con togglePanel t ctx = {PanelState : source panelState,
adam@20: FormatCtl : formatCtl ctx,
adam@20: Content : t}
kkallio@8:
kkallio@8: open Gui
kkallio@8:
adam@20: fun create [t ::: Type] [ctx ::: {Unit}] (f : formatCtl ctx) (content : t) (startOpen : bool) : transaction (togglePanel t ctx) =
kkallio@8: state <- source (if startOpen then Open else Closed);
kkallio@8:
kkallio@8: return {PanelState = state,
adam@20: FormatCtl = @f,
kkallio@8: Content = content}
kkallio@8:
adam@27: fun render [t ::: Type] [ctx ::: {Unit}] (_ : gui t ctx) [[Dyn] ~ ctx] (panel : togglePanel t ctx) =
kkallio@8: let
adam@20: val format = panel.FormatCtl !
adam@20: val openCtl = format.CloseCtl (set panel.PanelState Closed)
adam@20: val closeCtl = format.OpenCtl (set panel.PanelState Open)
kkallio@8:
kkallio@8: val content = toXml panel.Content
kkallio@8: in
adam@20: format.FormatPanel
kkallio@8:
kkallio@8: {openCtl}
kkallio@8: | Closed => {closeCtl})
kkallio@8: }/>
kkallio@8:
kkallio@8:
kkallio@8:
kkallio@8: {content}
kkallio@8: | Closed => )
kkallio@8: }/>
kkallio@8:
kkallio@8: end
kkallio@8:
adam@20: fun gui_togglePanel [t ::: Type] [ctx ::: {Unit}] (g : gui t ctx) = mkGui (@render g)