packages feed

minesweeper-0.4: TableGraphics.hs

{-# LANGUAGE ViewPatterns #-}
module TableGraphics
    ( drawPlace
    ) where

import Place
import Game (State (..))

import Graphics.Rendering.Cairo

import Control.Monad (when)

-----------------------------------------


drawPlace 
    :: Bool     -- ^ signs are not shown
    -> Bool     -- ^ highlighted
    -> Bool     -- ^ focused
    -> Place
    -> State 
    -> Render ()

drawPlace bb b foc (coords -> (i,j)) st = do



    rectangle (-0.4) (-0.4) 0.8 0.8
    setLineWidth 0.03
    setSourceRGB' bg
    strokePreserve
    setSourceRGB' $ case st of
            Clear _  _  -> bg
            Hidden True _ -> bg
            Death       -> bg
            _           -> if b then bg else blue

    fill
    setSourceRGB' black
    if foc 
        then do
            rectangle (-0.35) (-0.35) 0.7 0.7
            setLineWidth 0.02
            setDash [0.1,0.1] (if even (i + j) then 0 else 0.1)
            stroke
            setDash [] 0
        else return ()
    setLineCap LineCapRound
    setLineWidth 0.1

    if bb   
        then return ()
        else case st of
            Death -> do
                setLineCap LineCapSquare
                moveTo (-0.25) (-0.25)
                lineTo   0.25    0.25
                stroke
                moveTo   0.25  (-0.25)
                lineTo (-0.25)   0.25
                stroke

            Hidden False (Just d) -> do
                setLineWidth 0.03
                arc 0 0 0.25 0 (2*pi*(1- realToFrac d))
                setSourceRGB' $ Color_ 0.3 0.4 0.5
                stroke
                arc 0 0 0.25 (2*pi*(1- realToFrac d)) (2*pi)
                setSourceRGB' $ Color_ 1 1 1
                stroke
                
            Hidden True bbb -> do
                setLineWidth 0.03
                arc 0 0 0.25 0 (2*pi)
                setSourceRGB' $ if b then bg else blue
                fillPreserve
                setSourceRGB' black
                stroke
                when (maybe False (/=0) bbb) $ do
                    setLineCap LineCapSquare
                    moveTo (-0.25) (-0.25)
                    lineTo   0.25    0.25
                    stroke
                    moveTo   0.25  (-0.25)
                    lineTo (-0.25)   0.25
                    stroke
            Clear _ n -> do
                case n of 
                    0   -> do
                        setLineCap LineCapSquare
                        setLineWidth 0.03
                        moveTo (-0.2) 0
                        lineTo   0.2  0
                        stroke
                    1   -> do
                        point 0 0
                    2   -> do
                        point (-0.2) 0
                        point   0.2  0
                    3   -> do
                        point   0    (-0.20)
                        point (-0.2)   0.14
                        point   0.2    0.14
                    4   -> do
                        point (-0.2)   0.2
                        point   0.2    0.2
                        point (-0.2) (-0.2)
                        point   0.2  (-0.2)
                    5   -> do
                        point   0      0
                        point (-0.2)   0.2
                        point   0.2    0.2
                        point (-0.2) (-0.2)
                        point   0.2  (-0.2)
                    6   -> do
                        point (-0.2)   0
                        point   0.2    0
                        point (-0.2)   0.2
                        point   0.2    0.2
                        point (-0.2) (-0.2)
                        point   0.2  (-0.2)
                    7   -> do
                        point   0      0
                        point (-0.2)   0
                        point   0.2    0
                        point (-0.2)   0.2
                        point   0.2    0.2
                        point (-0.2) (-0.2)
                        point   0.2  (-0.2)
                    8   -> do
                        point (-0.2)   0
                        point   0.2    0
                        point   0    (-0.2)
                        point   0      0.2 
                        point (-0.2)   0.2
                        point   0.2    0.2
                        point (-0.2) (-0.2)
                        point   0.2  (-0.2)
                return ()
            _ -> return ()


point :: Double -> Double -> Render ()
point x y = do
    moveTo x y
    relLineTo 0 0
    stroke


data Color_ = Color_ Double Double Double

bg, blue, black, white :: Color_
blue = Color_ 0.65 0.8 1
black = Color_ 0 0 0
white = Color_ 1 1 1
bg = Color_ 0.9 0.9 0.9

setSourceRGB' :: Color_ -> Render ()
setSourceRGB' (Color_ r g b) = setSourceRGB r g b


betw ::
    Double -> Color_ -> Color_ -> Color_
betw pr (Color_ a b c) (Color_ a' b' c') = Color_ (f a a') (f b b') (f c c') where

    f i j = max 0 $ min 1 $ i + pr * (j - i)