module Monomer.Checkerboard
(
module Monomer.Checkerboard.CheckerboardCfg
, 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
checkerboard
:: (WidgetModel s, WidgetEvent e, Traversable t)
=> Int
-> Int
-> t (WidgetNode s e)
-> WidgetNode s e
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
checkerboard_
:: (WidgetModel s, WidgetEvent e, Traversable t)
=> Int
-> Int
-> [CheckerboardCfg]
-> t (WidgetNode s e)
-> WidgetNode s e
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