{-|
This is a checkerboard container (grid of boxes with alternating
background colors). Provided widgets are distributed from left to
right, top to bottom. If the are more provided widgets than there
are boxes in the grid then last widgets are ignored.

@
checkerboard 3 3 [filler, filler, label ":D"]
@
-}

module Monomer.Checkerboard
    ( -- * Re-exported modules
      module Monomer.Checkerboard.CheckerboardCfg
      -- * Constructors
    , checkerboard
    , checkerboard_
    ) where

import Data.Default
import Data.Foldable (toList)
import Data.List.Split
import Data.Maybe
import Monomer.Core.Combinators
import Monomer.Graphics.ColorTable
import Monomer.Widgets.Composite
import Monomer.Widgets.Containers.Box
import Monomer.Widgets.Containers.Grid
import Monomer.Widgets.Singles.Spacer

import Monomer.Checkerboard.CheckerboardCfg

{-|
Creates a checkerboard container for multiple items using number
of columns and rows.
-}
checkerboard
    :: (WidgetModel s, WidgetEvent e, Traversable t)
    => Int                 -- ^ Number of columns.
    -> Int                 -- ^ Number of rows.
    -> t (WidgetNode s e)  -- ^ The list of items.
    -> WidgetNode s e      -- ^ The created checkerboard.
checkerboard :: forall s e (t :: * -> *).
(WidgetModel s, WidgetEvent e, Traversable t) =>
Int -> Int -> t (WidgetNode s e) -> WidgetNode s e
checkerboard Int
c Int
r t (WidgetNode s e)
children = forall s e (t :: * -> *).
(WidgetModel s, WidgetEvent e, Traversable t) =>
Int
-> Int -> [CheckerboardCfg] -> t (WidgetNode s e) -> WidgetNode s e
checkerboard_ Int
c Int
r forall a. Default a => a
def t (WidgetNode s e)
children

{-|
Creates a checkerboard container for multiple items using number
of columns and rows. Accepts config.
-}
checkerboard_
    :: (WidgetModel s, WidgetEvent e, Traversable t)
    => Int                 -- ^ Number of columns.
    -> Int                 -- ^ Number of rows.
    -> [CheckerboardCfg]   -- ^ The config options.
    -> t (WidgetNode s e)  -- ^ The list of items.
    -> WidgetNode s e      -- ^ The created checkerboard.
checkerboard_ :: forall s e (t :: * -> *).
(WidgetModel s, WidgetEvent e, Traversable t) =>
Int
-> Int -> [CheckerboardCfg] -> t (WidgetNode s e) -> WidgetNode s e
checkerboard_ Int
c Int
r [CheckerboardCfg]
configs t (WidgetNode s e)
children = WidgetNode s e
tree where
    tree :: WidgetNode s e
tree = forall (t :: * -> *) s e.
Traversable t =>
t (WidgetNode s e) -> WidgetNode s e
vgrid forall a b. (a -> b) -> a -> b
$ forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith forall {s} {e} {s} {e}.
[WidgetNode s e -> WidgetNode s e]
-> [WidgetNode s e] -> WidgetNode s e
makeRow [[WidgetNode s e -> WidgetNode s e]]
boxGrid forall a b. (a -> b) -> a -> b
$ [[WidgetNode s e]]
cs forall a. Semigroup a => a -> a -> a
<> forall a. a -> [a]
repeat []
    makeRow :: [WidgetNode s e -> WidgetNode s e]
-> [WidgetNode s e] -> WidgetNode s e
makeRow [WidgetNode s e -> WidgetNode s e]
f [WidgetNode s e]
x = forall (t :: * -> *) s e.
Traversable t =>
t (WidgetNode s e) -> WidgetNode s e
hgrid forall a b. (a -> b) -> a -> b
$ forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith forall a b. (a -> b) -> a -> b
($) [WidgetNode s e -> WidgetNode s e]
f forall a b. (a -> b) -> a -> b
$ [WidgetNode s e]
x forall a. Semigroup a => a -> a -> a
<> forall a. a -> [a]
repeat forall s e. WidgetNode s e
spacer
    cs :: [[WidgetNode s e]]
cs = forall e. Int -> [e] -> [[e]]
chunksOf Int
c forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. Foldable t => t a -> [a]
toList t (WidgetNode s e)
children
    boxGrid :: [[WidgetNode s e -> WidgetNode s e]]
boxGrid = forall a. Int -> [a] -> [a]
take Int
r forall a b. (a -> b) -> a -> b
$ forall a. [a] -> [a]
cycle
        [ forall a. Int -> [a] -> [a]
take Int
c forall a b. (a -> b) -> a -> b
$ forall a. [a] -> [a]
cycle [forall {s} {e}.
(Typeable s, Typeable e) =>
WidgetNode s e -> WidgetNode s e
lightBox, forall {s} {e}.
(Typeable s, Typeable e) =>
WidgetNode s e -> WidgetNode s e
darkBox]
        , forall a. Int -> [a] -> [a]
take Int
c forall a b. (a -> b) -> a -> b
$ forall a. [a] -> [a]
cycle [forall {s} {e}.
(Typeable s, Typeable e) =>
WidgetNode s e -> WidgetNode s e
darkBox, forall {s} {e}.
(Typeable s, Typeable e) =>
WidgetNode s e -> WidgetNode s e
lightBox]
        ]
    lightBox :: WidgetNode s e -> WidgetNode s e
lightBox WidgetNode s e
x = forall {s} {e}.
(Typeable s, Typeable e) =>
WidgetNode s e -> WidgetNode s e
box WidgetNode s e
x forall t. CmbStyleBasic t => t -> [StyleState] -> t
`styleBasic` [forall t. CmbBgColor t => Color -> t
bgColor Color
lc]
    darkBox :: WidgetNode s e -> WidgetNode s e
darkBox WidgetNode s e
x = forall {s} {e}.
(Typeable s, Typeable e) =>
WidgetNode s e -> WidgetNode s e
box WidgetNode s e
x forall t. CmbStyleBasic t => t -> [StyleState] -> t
`styleBasic` [forall t. CmbBgColor t => Color -> t
bgColor Color
dc]
    lc :: Color
lc = forall a. a -> Maybe a -> a
fromMaybe Color
white forall a b. (a -> b) -> a -> b
$ CheckerboardCfg -> Maybe Color
_ccBgLightColor CheckerboardCfg
config
    dc :: Color
dc = forall a. a -> Maybe a -> a
fromMaybe Color
black forall a b. (a -> b) -> a -> b
$ CheckerboardCfg -> Maybe Color
_ccBgDarkColor CheckerboardCfg
config
    config :: CheckerboardCfg
config = forall a. Monoid a => [a] -> a
mconcat [CheckerboardCfg]
configs