{-# LANGUAGE CPP #-}
module MatrixP(matrixP,matrixP') where
import Geometry
import LayoutRequest
import LayoutDir(LayoutDir(..),xc,yc,mkp)
import Spacers(Distance)
import Defaults(defaultSep)
import Data.List(mapAccumL)
matrixP n = matrixP' n Horizontal defaultSep
matrixP' :: Int -> LayoutDir -> Distance -> Placer
matrixP' count' ld sep = P $ \ requests ->
let n = length requests
maxsize = (pMax . (origin:) . map minsize) requests
rps' = concatMap refpoints requests
maxh = xc ld maxsize
maxv = yc ld maxsize
ncols = count' `min` n
nrows = (n - 1) `quot` count' + 1
his = sep * (ncols - 1)
vis = sep * (nrows - 1)
h = his + maxh * ncols
v = vis + maxv * nrows
mat2 (Rect gotpos gotsize) =
let x0 = xc ld gotpos
y0 = yc ld gotpos
width = xc ld gotsize
height = yc ld gotsize
goth,gotv :: Double
goth = fromIntegral (width - his) / fromIntegral ncols
gotv = fromIntegral (height - vis) / fromIntegral nrows
pl i _ =
let (x, y) = (i `rem` count', i `quot` count')
in (i + 1, Rect
(mkp ld (x0 + truncate (fromIntegral x * (goth + fromIntegral sep)))
(y0 + truncate (fromIntegral y * (gotv + fromIntegral sep))))
(mkp ld (truncate goth)
(truncate gotv)))
in snd (mapAccumL pl 0 requests)
in (refpLayout (mkp ld h v) False False rps', mat2)