module LinearSplitP where import AllFudgets --import ListUtil(chopList) import HbcUtils(apFst,chopList) import Data.Maybe(isJust,listToMaybe) horizontalSplitP = horizontalSplitP' defaultSep verticalSplitP = verticalSplitP' defaultSep horizontalSplitP' = linearSplitP Horizontal verticalSplitP' = linearSplitP Vertical linearSplitP dir sep = P linearSplitP' where linearSplitP' [] = linearP' [] linearSplitP' [r] = linearP' [r] linearSplitP' reqs0 = (req,placer2) where reqss = chopReqs reqs0 (reqs1,placers2) = unzip (fmap linearP' reqss) --reqs2 = zipWith adjSize (sizes reqss) reqs1 (req,placer2a) = linearP' reqs1 positions = fmap ( \ r->listToMaybe r >>= wantedPos) reqss placer2 r@(Rect _ s) = concat . zipWith id placers2 . adjPlaces s positions . placer2a $ r adjPlaces asize (_:ps) (r:rs) = adjPlaces' ps r rs where adjPlaces' (optp:ps) r1@(Rect p1 s1) (r2@(Rect p2 s2):rs) = case optp of Nothing -> r1:adjPlaces' ps r2 rs -- shouldn't happen Just (p0,s,a) -> r1' : adjPlaces' ps r2' rs where v = mkp dir d 0 where d = max 1 (d0+d1)-d1 -- try to avoid sizes <= 0 d0 = xc dir p-xc dir (rectpos r2) d1 = xc dir s1 p = p0 + scalePoint a (asize-s) r1' = Rect p1 (s1+v) r2' = Rect (p2+v) (s2-v) adjPlaces' [] r [] = [r] chopReqs = chopList splitReqs splitReqs (r:rs) = apFst (r:) (break wantPos rs) splitReqs [] = ([],[]) wantPos = isJust . wantedPos linearP' = unP (linearP dir sep) {- adjSize Nothing req = req adjSize (Just s1) req@(Layout{minsize=s2}) = req{minsize=size, wAdj=const size, hAdj=const size} where size = mkp dir (xc dir s1) (yc dir s2) sizes = sizes' . (Just 0:) . tail . positions sizes' ps = zipWith size ps (tail ps++[Nothing]) where size optp1 optp2 = do p1 <- optp1 p2 <- optp2 return (p2-p1-mkp dir sep 0) -}