module Text.YuiGrid.YGrid where
import Text.CxML (CssInlineDecl)
import Text.YuiGrid.LayoutHints
import Text.YuiGrid.Grid
data YPage a = YPage {
pageWidth :: YPageWidth,
headerBlock :: [YGrid a],
mainBlock :: [YGrid a],
footerBlock :: [YGrid a],
sidebarBlock :: Maybe (YTemplate, [YGrid a])
}
data YPageWidth = YPW_750px
| YPW_950px
| YPW_100perc
| YPW_974px
data YTemplate = SidebarLeft_160px | SidebarLeft_180px | SidebarLeft_300px
| SidebarRight_180px | SidebarRight_240px | SidebarRight_300px
data YGrid a = YGrid_SimpleBox a [CssInlineDecl]
| YGrid_ComplexBox [YGrid a] [CssInlineDecl]
| YGrid_1Col [YGrid a]
| YGrid_2Cols Y_2ColsType [YGrid a] [YGrid a]
| YGrid_3Cols [YGrid a] [YGrid a] [YGrid a]
data Y_2ColsType = Y_1o2_1o2
| Y_2o3_1o3
| Y_1o3_2o3
| Y_3o4_1o4
| Y_1o4_3o4
yGridPage :: YPageWidth -> [GridNode a] -> YPage a
yGridPage pageWidth gns =
case (leftSidebarGNodes, rightSidebarGNodes) of
([],[]) -> YPage pageWidth yHeader yBody yFooter Nothing
(_,[]) -> YPage pageWidth yHeader yBody yFooter (Just (SidebarLeft_160px, yLeftSidebar))
([],_) -> YPage pageWidth yHeader yBody yFooter (Just (SidebarRight_180px, yRightSidebar))
_ -> YPage pageWidth yHeader yBodyWithRightSidebar yFooter (Just (SidebarLeft_160px, yLeftSidebar))
where
(mainGNodes, headerGNodes, footerGNodes, leftSidebarGNodes, rightSidebarGNodes) = gridNodesByPageArea gns
yHeader = yGridStack headerGNodes
yFooter = yGridStack footerGNodes
yLeftSidebar = yGridStack leftSidebarGNodes
yRightSidebar = yGridStack rightSidebarGNodes
yBody = yGridStack mainGNodes
yBodyWithRightSidebar = [YGrid_2Cols Y_3o4_1o4 yBody yRightSidebar]
yGridStack = yGrids Nothing
yGrid :: GridNode a -> YGrid a
yGrid (Box x lhs) = YGrid_SimpleBox x (cssHints lhs)
yGrid gn@(Container gns lhs) = YGrid_ComplexBox (yGrids (columnsQty lhs) gns) (cssHints lhs)
yGrids :: Maybe Int -> [GridNode a] -> [YGrid a]
yGrids colSpec = map (yGridCols . gridNodesByColumns colSpec) . splitClearSides . gridNodesVerticalPartitions
yGridCols :: [[GridNode a]] -> YGrid a
yGridCols cols = yGridCols' (map (map yGrid) cols)
yGridCols' :: [[YGrid a]] -> YGrid a
yGridCols' [col1] = YGrid_1Col col1
yGridCols' [col1,col2] = yGrid_2Col col1 col2
yGridCols' [col1,col2,col3] = YGrid_3Cols col1 col2 col3
yGridCols' [col1,col2,col3,col4] = yGrid_2Col [yGrid_2Col col1 col2] [yGrid_2Col col3 col4]
yGridCols' cols = YGrid_1Col (concat cols)
yGrid_2Col = YGrid_2Cols Y_1o2_1o2