Mercurial > gui
diff navigation.ur @ 7:48a4180171b0
Shifted some more generic theme navigation code to the library.
Also generalized formatting options a bit for popupNav.
author | Karn Kallio <kkallio@eka> |
---|---|
date | Fri, 06 May 2011 23:00:22 -0430 |
parents | |
children | d32fb0f7b137 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/navigation.ur Fri May 06 23:00:22 2011 -0430 @@ -0,0 +1,71 @@ +functor Make(M : sig + con linkPos :: {Unit} + val linkFolder : folder linkPos + con navbarPos :: {Unit} + con msgPos :: {Unit} + val msgFolder : folder msgPos + con linkStyles :: {Type} = mapU (option css_class) linkPos + con themePos :: {Unit} + val linkStyles : $linkStyles + val formatNav : $(mapU xbody navbarPos) -> $(mapU xbody linkPos) -> $(mapU xbody msgPos) + -> $(mapU xbody themePos) + end) = struct + + open Navbar + + con modeLs :: {Type} -> Type = fn r :: {Type} => $(map mode r) + con barLs :: {Type} -> Type = fn r :: {Type} => $(map navBar r) + + con linkLs :: {Unit} -> Type = fn r :: {Unit} => $(mapU (option navItem) r) + con msgLs :: {Unit} -> Type = fn r :: {Unit} => $(mapU (option xbody) r) + + class shape t = t -> $(mapU xbody M.navbarPos) + + val shape_npos : shape $(mapU xbody M.navbarPos) = (fn x => x) + + 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} + + fun mkNav [m ::: {Type}] (sh : shape (crush m)) (d : modeLs m) (n : barLs m) + (l : linkLs M.linkPos) (msg : msgLs M.msgPos) = + {Nav = n, Link = l, Msg = msg} + + fun barsToXml [m ::: {Type}] (fl : folder m) (ms : modeLs m) (ns : barLs m) = + @@Top.fold [fn r :: {Type} => $(map mode r) -> $(map navBar r) -> $(map (fn _ => xbody) r)] + (fn [nm :: Name] [t :: Type] [rest :: {Type}] [[nm] ~ rest] + (acc : _ -> _ -> _) rm rn => + {nm = @@navBarToXml [t] rm.nm rn.nm} ++ (acc (rm -- nm) (rn -- nm))) + (fn _ _ => {}) [m] fl ms ns + + fun linksToXml (l : linkLs M.linkPos) = + let + fun render s ol = + case ol of + None => <xml/> + | Some l => navItemToXml s l + + in + @@Top.fold [fn u :: {Unit} => $(mapU (option navItem) u) -> $(mapU (option css_class) u) -> $(mapU xbody u)] + (fn [nm :: Name] [t ::_] [rest :: {Unit}] [[nm] ~ rest] + (acc : _ -> _ -> _) r s => {nm = render s.nm r.nm} ++ (acc (r -- nm) (s -- nm))) + (fn _ _ => {}) [M.linkPos] M.linkFolder l M.linkStyles + end + + fun msgToXml (msg : msgLs M.msgPos) = + let + fun render om = + case om of + None => <xml/> + | Some m => m + in + @@Top.mp [fn u => (option xbody)] [fn u => xbody] + (fn [t :::_] => render) [M.msgPos] M.msgFolder msg + end + + fun toXml [m ::: {Type}] (fl : folder m) (sh : shape (crush m)) (d : modeLs m) {Nav = nav, Link = l, Msg = msg} = + M.formatNav (sh (@@barsToXml [m] fl d nav)) (linksToXml l) (msgToXml msg) + +end