Mercurial > gui
diff togglePanel.ur @ 20:554e342665fe
Add a new parameter to Gui.gui
author | Adam Chlipala <adam@chlipala.net> |
---|---|
date | Sat, 24 Sep 2011 15:47:00 -0400 |
parents | 3a303df9ae92 |
children | 30f9a763f5fb |
line wrap: on
line diff
--- a/togglePanel.ur Fri Sep 23 13:30:01 2011 +0200 +++ b/togglePanel.ur Sat Sep 24 15:47:00 2011 -0400 @@ -1,34 +1,37 @@ datatype panelState = Open | Closed -con formatCtl :: {Unit} -> Type = fn other_ctx => {FormatPanel : (xml ([Body] ++ other_ctx) [] []) -> (xml ([Body] ++ other_ctx) [] []) -> (xml ([Body] ++ other_ctx) [] []), - OpenCtl : transaction unit -> xml ([Body] ++ other_ctx) [] [], - CloseCtl : transaction unit -> xml ([Body] ++ other_ctx) [] []} +con formatCtl = fn ctx :: {Unit} => [body ~ ctx] => + {FormatPanel : xbody -> xbody -> xml (body ++ ctx) [] [], + OpenCtl : transaction unit -> xbody, + CloseCtl : transaction unit -> xbody} -val defaultFormat = {FormatPanel = fn ctl panel => <xml>{ctl}{panel}</xml>, - OpenCtl = fn behaviour => <xml><button value="Open" onclick={behaviour}/></xml>, - CloseCtl = fn behaviour => <xml><button value="Close" onclick={behaviour}/></xml>} +val defaultFormat [body ~ []] = + {FormatPanel = fn ctl panel => <xml>{ctl}{panel}</xml>, + OpenCtl = fn behaviour => <xml><button value="Open" onclick={behaviour}/></xml>, + CloseCtl = fn behaviour => <xml><button value="Close" onclick={behaviour}/></xml>} -con togglePanel t other_ctx = {PanelState : source panelState, - FormatCtl : formatCtl other_ctx, - Content : t} +con togglePanel t ctx = {PanelState : source panelState, + FormatCtl : formatCtl ctx, + Content : t} open Gui -fun create [t ::: Type] [other_ctx:::{Unit}] [other_ctx ~ body] (toXml : gui t (xml ([Body] ++ other_ctx) [] [])) (f : formatCtl other_ctx) (content : t) (startOpen : bool) : transaction (togglePanel t other_ctx) = +fun create [t ::: Type] [ctx ::: {Unit}] (f : formatCtl ctx) (content : t) (startOpen : bool) : transaction (togglePanel t ctx) = state <- source (if startOpen then Open else Closed); return {PanelState = state, - FormatCtl = f, + FormatCtl = @f, Content = content} -fun render [t ::: Type] [other_ctx:::{Unit}] [other_ctx ~ body] (_ : gui t (xml ([Body] ++ other_ctx) [] [])) (panel : togglePanel t other_ctx) = +fun render [t ::: Type] [ctx ::: {Unit}] (_ : gui t ctx) [body ~ ctx] (panel : togglePanel t ctx) = let - val openCtl = panel.FormatCtl.CloseCtl (set panel.PanelState Closed) - val closeCtl = panel.FormatCtl.OpenCtl (set panel.PanelState Open) + val format = panel.FormatCtl ! + val openCtl = format.CloseCtl (set panel.PanelState Closed) + val closeCtl = format.OpenCtl (set panel.PanelState Open) val content = toXml panel.Content in - panel.FormatCtl.FormatPanel + format.FormatPanel <xml> <dyn signal={c <- signal panel.PanelState; return @@ -48,4 +51,4 @@ </xml> end -fun gui_togglePanel [t ::: Type] [other_ctx:::{Unit}] [other_ctx ~ body] (_ : gui t (xml ([Body] ++ other_ctx) [] [])) = mkGui render +fun gui_togglePanel [t ::: Type] [ctx ::: {Unit}] (g : gui t ctx) = mkGui (@render g)