packages feed

grid-proto-0.2.0.0: examples/Viewport.hs

module Viewport where

import GridProto

type State = (Bool, (Int, Int), (Int,Int))

main :: IO ()
main = runGridProto example (False, (0,0), (10,10))

example :: GridProto State
example = defaultGridProto
  { title = "Viewport Example"
  , updateFn = update
  , viewFn = view
  }

update :: Input -> State -> IO (State, [String])
update Input{mouse=Mouse{mousePosition=mxy,mouseButton=mouseButton}} st@(color,xy0,xy1)
  | mouseButton == Pressed = return (if color then (not color, mxy, xy1) else (not color, xy0, mxy), [])
  | otherwise = return (st, [])

makeViewport :: (Int, Int) -> (Int, Int) -> (Color, Color) -> Viewport
makeViewport xy (w,h) (a,b) = Viewport tiles xy (w,h)
  where
    tiles = fromList $ do
      y <- [0..(h - 1)]
      x <- [0..(w - 1)]
      let color = Just $ if (x + y) `mod` 2 == 0 then a else b
      let (symbol, shape) = (Nothing, Nothing)
      return ((x,y), Tile symbol shape color)

view :: State -> View
view (color,xy0,xy1) = mergeViewports emptyView
  [ mapFill (if color then shade else id)     $ makeViewport xy0 (10,15) (Red0, Red1)
  , mapFill (if not color then shade else id) $ makeViewport xy1 (15,7)  (Blue0, Blue1)
  ]