view togglePanel.urs @ 21:30f9a763f5fb

Tweak TogglePanel signature
author Adam Chlipala <adam@chlipala.net>
date Sat, 24 Sep 2011 17:35:33 -0400
parents 554e342665fe
children 5905b56e0cd9
line wrap: on
line source
(* TogglePanel provides a panel or section of xml which appears and
 * disappears when the user activates an associated control.  The
 * panel may contain another gui widget as content. *)

con togglePanel :: Type -> {Unit} -> Type
(* The type of appearing and disappearing panels.  The arguments
 * are as for [Gui.gui]. *)

con formatCtl = fn ctx :: {Unit} => [body ~ ctx] =>
                   {FormatPanel : xml (body ++ ctx) [] []
                                  -> xml (body ++ ctx) [] []
                                  -> xml (body ++ ctx) [] [],
                    (* Allows for formatting the panel.  The first two parameters
                     * represent "holes" for the control and panel respectively while
                     * the result should be the desired XML laying out the whole structure.
                     * The controls can be formatted with the options below.
                     * The panel part appears and disappears according to the use
                     * of the controls. *)
                  
                    OpenCtl : transaction unit -> xml (body ++ ctx) [] [],
                    (* This should accept the transaction representing the opening of
                     * the panel and produce an XML control having this as action. *)

                    CloseCtl : transaction unit -> xml (body ++ ctx) [] []}
                    (* This should accept the transaction representing the closing of
                     * the panel and produce an xml control having this as action. *)

(* Some reasonable default formats for the layout and controls. *)
val defaultFormat : formatCtl []

val create : t ::: Type -> ctx ::: {Unit} ->
    formatCtl ctx (* Formatting instructions *)
    -> t             (* Enclosed widget *)
    -> bool          (* Start in open state? *)
    -> transaction (togglePanel t ctx)

val gui_togglePanel : t ::: Type -> ctx ::: {Unit}
                      -> Gui.gui t ctx
                      -> Gui.gui (togglePanel t ctx) ctx
(* The togglePanel is itself a widget.  It can be pretty printed to a piece
 * of XML with a use of [toXml]. *)