@@ 51,3 51,8 @@ maxHeight PaddedBox {..} = top margin + top border + top padding +
block max + bottom padding + bottom border + bottom margin
data Length = Pixels Double | Percent Double | Auto | Preferred | Min deriving Eq
+
+lowerLength :: Double -> Length -> Double
+lowerLength _ (Pixels x) = x
+lowerLength outerwidth (Percent x) = x * outerwidth
+lowerLength _ _ = 0
@@ 119,11 119,6 @@ marginCollapse (x'@PaddedBox {margin = xm@Border { bottom = x }}:
| otherwise = x' { margin = xm { bottom = 0 }}:marginCollapse (y':rest)
marginCollapse rest = rest
-lowerLength :: Double -> Length -> Double
-lowerLength _ (Pixels x) = x
-lowerLength outerwidth (Percent x) = x * outerwidth
-lowerLength _ _ = 0
-
lowerMargin :: Double -> Double -> Border m Length -> Border m Double
lowerMargin _ available (Border top' bottom' Auto Auto) =
Border top' bottom' (available/2) (available/2)
@@ 1,7 1,8 @@
module Graphics.Layout.Grid where
import Data.Text (Text)
-import Graphics.Layout.Box
+import Data.List (intersperse)
+import Graphics.Layout.Box as B
data Grid m n = Grid {
rows :: [(Name, Either m Double)],
@@ 16,10 17,55 @@ data GridItem m n = GridItem {
type Name = Text
-{-gridMinWidths :: Double -> Grid y Length -> [GridItem y Length] -> (Double, [Double])
-gridNatWidths :: Double -> Grid y Length -> [GridItem y Length] -> (Double, [Double])
-gridMaxWidths :: PaddedBox y Double -> Grid y Length -> (Double, [Double])
-gridWidths :: PaddedBox y Double -> Grid y Length -> (Double, [Double])
+cellsForCol :: [GridItem y x] -> Int -> [GridItem y x]
+cellsForCol cells ix =
+ [cell | cell <- cells, startCol cell == ix, startCol cell /= endCol cell]
+cellsForRow :: [GridItem y x] -> Int -> [GridItem y x]
+cellsForRow cells ix =
+ [cell | cell <- cells, startRow cell == ix, startRow cell /= endRow cell]
+
+{-gridEstWidth :: Grid y Length -> [GridItem y Double] -> Double-}
+gridMinWidths :: Double -> Grid y Length -> [GridItem y Double] -> (Double, [Double])
+gridMinWidths parent self childs =
+ (sum $ intersperse (lowerLength parent $ inline $ gap self) ret, ret)
+ where
+ ret = map colMinWidth $ enumerate $ map snd $ columns self
+ colMinWidth (_, Left (Pixels x)) = x
+ colMinWidth (_, Left (Percent x)) = x * parent
+ colMinWidth arg@(ix, Left Preferred) =
+ maximum $ map (inline . size . gridItemBox) $ cellsForCol childs ix
+ colMinWidth (ix, _) =
+ maximum $ map (inline . B.min . gridItemBox) $ cellsForCol childs ix
+gridNatWidths :: Double -> Grid y Length -> [GridItem y Double] -> (Double, [Double])
+gridNatWidths parent self childs =
+ (sum $ intersperse (lowerLength parent $ inline $ gap self) ret, ret)
+ where
+ ret = map colNatWidth $ enumerate $ map snd $ columns self
+ colNatWidth (_, Left (Pixels x)) = x
+ colNatWidth (_, Left (Percent x)) = x * parent
+ colNatWidth arg@(ix, Left Min) =
+ maximum $ map (inline . B.min . gridItemBox) $ cellsForCol childs ix
+ colNatWidth (ix, _) =
+ maximum $ map (inline . size . gridItemBox) $ cellsForCol childs ix
+gridMaxWidths :: PaddedBox y Double -> Grid y Length -> [(Double, Double)] -> (Double, [Double])
+gridMaxWidths parent self subwidths =
+ (sum $ intersperse (lowerLength outerwidth $ inline $ gap self) ret, ret)
+ where
+ ret = map (colMaxWidth fr) $ zip subwidths $ map snd $ columns self
+ fr = (outerwidth - estimate)/(countFRs $ map snd $ columns self)
+ outerwidth = inline $ size parent
+ estimate = sum $ intersperse (lowerLength outerwidth $ inline $ gap self) $
+ map (colMaxWidth 0) $ zip subwidths $ map snd $ columns self
+ colMaxWidth _ (_, Left (Pixels x)) = x
+ colMaxWidth _ (_, Left (Percent x)) = x
+ colMaxWidth _ ((_, nat), Left Preferred) = nat
+ colMaxWidth _ ((min, _), Left Min) = min
+ colMaxWidth fr (_, Left Auto) = fr
+ colMaxWidth fr (_, Right x) = x*fr
+ countFRs (Left Auto:rest) = succ $ countFRs rest
+ countFRs (Right x:rest) = x + countFRs rest
+ countFRs [] = 0
+{-gridWidths :: PaddedBox y Double -> Grid y Length -> (Double, [Double])
gridNatHeights :: PaddedBox Length Double -> [GridItem Length Double] -> (Double, [Double])
gridMinHeights :: Double -> Grid Length Double -> (Double, [Double])
gridMaxHeights :: Double -> Grid Length Double -> (Double, [Double])
@@ 28,3 74,5 @@ gridPosition :: GridLength Double Double -> [GridItem Double Double] -> [Size Do
gridLayout :: PaddedBox Double Double -> Grid Length Length ->
[GridItem Length Length] -> Bool ->
(Grid Double Double, [(Size Double Double, GridItem Double Double)])-}
+
+enumerate = zip [0..]