Mercurial > gui
view navigation.urs @ 18:16447dc6a68c
Introduction of multi-parameter type class for gui components
author | Ron de Bruijn <rmbruijn@gmail.com> |
---|---|
date | Thu, 22 Sep 2011 19:24:01 +0200 |
parents | 48a4180171b0 |
children |
line wrap: on
line source
(* A navigation is a collection of navigation bars (menus) made of links of * which up to one may be marked as active, optional isolated links not part of * menu bars and also optional message or status zones containing xml. The * programmer can provide a way to format these elements into a collection of * pieces of xml which can then be inserted into themes. *) functor Make(M : sig con linkPos :: {Unit} (* The collection of isolated links. Should be inferred. *) val linkFolder : folder linkPos (* Implementation detail; should be inferred. *) con navbarPos :: {Unit} (* The collection of navbars. *) con msgPos :: {Unit} (* The collection of optional status or message xml pieces. *) val msgFolder : folder msgPos (* Implementation detail; should be inferred. *) con linkStyles :: {Type} = mapU (option css_class) linkPos (* The collection of isolated links, with an optional CSS class * which will be applied to that link. *) con themePos :: {Unit} (* The positions in the theme to generate xml for. *) val linkStyles : $linkStyles (* The input optional link positions and styles. *) val formatNav : $(mapU xbody navbarPos) -> $(mapU xbody linkPos) -> $(mapU xbody msgPos) -> $(mapU xbody themePos) (* The way to format the collections of navbars, links and message * zones into pieces of xml for the theme positions. *) end) : sig con modeLs :: {Type} -> Type = fn r :: {Type} => $(map Navbar.mode r) con barLs :: {Type} -> Type = fn r :: {Type} => $(map Navbar.navBar r) con linkLs :: {Unit} -> Type = fn r :: {Unit} => $(mapU (option Navbar.navItem) r) con msgLs :: {Unit} -> Type = fn r :: {Unit} => $(mapU (option xbody) r) class shape val shape_npos : shape $(mapU xbody M.navbarPos) con crush :: {Type} -> Type = fn r :: {Type} => $(map (fn _ => xbody) r) con navigation :: {Type} -> Type = fn m :: {Type} => {Nav : barLs m, Link : linkLs M.linkPos, Msg : msgLs M.msgPos} (* Represents a complete navigation ensemble. *) val mkNav : m ::: {Type} -> shape (crush m) -> modeLs m -> barLs m -> linkLs M.linkPos -> msgLs M.msgPos -> navigation m (* Builds a navigation from input elements of navbars, isolated links and messages. *) val toXml : m ::: {Type} -> folder m -> shape (crush m) -> modeLs m -> navigation m -> $(mapU xbody M.themePos) (* Renders a navigation to xml pieces suitable for inclusion in a theme. *) end