module Layoutspec(marginHVAlignLs, hvAlignLs, marginLs, sepLs,hBoxLs', vBoxLs', placeLs,spaceLs,revLs, permLs, leafLs, layoutF, Layout) where import AlignP --import Alignment(Alignment(..)) import Fudget --import Geometry(Point, Rect, Size(..)) --import LayoutDir(LayoutDir, Orientation) import LayoutF(LayoutDirection(..), lF) import LayoutRequest import Placers import Spacers import Utils(oo,unconcat) data Layout = LeafL | NodeL Placer [Layout] --deriving (Eq, Ord) layoutF :: Layout -> (F a b) -> F a b layoutF layout f = let (n, lter) = layouter layout in lF n Forward lter f leafLs = LeafL revLs LeafL = LeafL revLs (NodeL lter ls') = NodeL (revP lter) ls' npermLs _ LeafL = LeafL permLs perm (NodeL lter ls') = NodeL (permuteP perm lter) ls' modLs ltermod l = case l of LeafL -> NodeL (ltermod idP) [LeafL] NodeL lter ls' -> NodeL (ltermod lter) ls' placeLs = NodeL spaceLs = modLs . spacerP vBoxLs' = placeLs . verticalP' hBoxLs' = placeLs . horizontalP' sepLs = spaceLs . sepS marginLs = spaceLs . marginS hvAlignLs = oo spaceLs hvAlignS marginHVAlignLs sep ha va = spaceLs (marginHVAlignS sep ha va) --layouter :: Layout -> (Int, Placer) layouter layout = case layout of LeafL -> (1, idP) NodeL lter ls' -> let (ns, lters) = unzip (map layouter ls') in (sum ns, combl lter ns lters) combl rootlter ns nodelters = P $ \ leafreqs -> let (nodereqs, noderess) = unzip (zipWith unP nodelters (unconcat ns leafreqs)) (rootreq, rootres) = unP rootlter nodereqs leafres rootrect = concatMap apply (zip noderess (rootres rootrect)) in (rootreq, leafres) apply (f, x) = f x