module Text.YuiGrid.LayoutHints where
import Text.CxML (CssInlineDecl)
data LayoutHints = LayoutHints {
inFstSibling :: Bool,
cssHints :: [CssInlineDecl],
pageAreaHint :: Maybe PageAreaHint,
verticalHint :: VerticalHint,
columnsQty :: Maybe Int,
columnsQtyVote :: Maybe Int,
horizontalHint :: HorizontalHint
}
data PageAreaHint = InMain | InHeader | InFooter | InLeftSidebar | InRightSidebar
deriving Eq
data VerticalHint = NearTop | Weight Float | NearBottom
deriving (Eq, Ord)
data HorizontalHint = ClearSides | NearLeft | HorizWeight Float | NearRight
deriving (Eq, Ord)
blankHints :: LayoutHints
blankHints = LayoutHints False [] Nothing (Weight 0) Nothing Nothing (HorizWeight 0)
class HasLayoutHints a where
modLayoutHints :: (LayoutHints -> LayoutHints) -> a -> a
setInFstSibling, resetInFstSibling :: HasLayoutHints a => a -> a
setInFstSibling = modLayoutHints (\lhs -> lhs {inFstSibling = True} )
resetInFstSibling = modLayoutHints (\lhs -> lhs {inFstSibling = False} )
addCss :: HasLayoutHints a => CssInlineDecl -> a -> a
addCss (cssId, cssRls) = modLayoutHints (\lhs -> lhs {cssHints = (cssId, cssRls):cssHints lhs} )
resetCss :: HasLayoutHints a => a -> a
resetCss = modLayoutHints (\lhs -> lhs {cssHints = [] } )
setPageAreaHint :: HasLayoutHints a => PageAreaHint -> a -> a
setPageAreaHint pahint = modLayoutHints (\lhs -> lhs {pageAreaHint = Just pahint})
setVerticalHint :: HasLayoutHints a => VerticalHint -> a -> a
setVerticalHint vhint = modLayoutHints (\lhs -> lhs {verticalHint = vhint})
setHorizontalHint :: HasLayoutHints a => HorizontalHint -> a -> a
setHorizontalHint hhint = modLayoutHints (\lhs -> lhs {horizontalHint = hhint})
inMain, inHeader, inFooter, inLeftSidebar, inRightSidebar :: HasLayoutHints a => a -> a
inMain = setPageAreaHint InMain
inHeader = setPageAreaHint InHeader
inFooter = setPageAreaHint InFooter
inLeftSidebar = setPageAreaHint InLeftSidebar
inRightSidebar = setPageAreaHint InRightSidebar
nearTop, nearBottom :: HasLayoutHints a => a -> a
nearTop = setVerticalHint NearTop
nearBottom = setVerticalHint NearBottom
weight :: HasLayoutHints a => Float -> a -> a
weight = setVerticalHint . Weight
setColumns, setColumnsVote :: HasLayoutHints a => Int -> a -> a
setColumns n = modLayoutHints (\lhs -> lhs {columnsQty = Just n})
setColumnsVote n = modLayoutHints (\lhs -> lhs {columnsQtyVote = Just n})
resetColumns, resetColumnsVote :: HasLayoutHints a => a -> a
resetColumns = modLayoutHints (\lhs -> lhs {columnsQty = Nothing})
resetColumnsVote = modLayoutHints (\lhs -> lhs {columnsQtyVote = Nothing})
clearSides, nearLeft, nearRight :: HasLayoutHints a => a -> a
clearSides = setHorizontalHint ClearSides
nearLeft = setHorizontalHint NearLeft
nearRight = setHorizontalHint NearRight
horizWeight :: HasLayoutHints a => Float -> a -> a
horizWeight = setHorizontalHint . HorizWeight
applyLayouts :: HasLayoutHints a => [a -> a] -> a -> a
applyLayouts = foldl (.) id
smallMarginBottomCSS, giveBorderCSS :: HasLayoutHints a => a -> a
smallMarginBottomCSS = addCss smallMarginBottomCSSRls
giveBorderCSS = addCss giveBorderCSSRls
smallMarginBottomCSSRls = ("smallMarginBottom", [("margin-bottom","1em")])
giveBorderCSSRls = ("giveBorder", [("border","1px solid black")])