immutaball-core-0.1.0.4.1: Immutaball/Ball/State/Preplay.hs
{-# OPTIONS_GHC -fno-warn-tabs #-} -- Support tab indentation better, for a better default of no warning if tabs are used: https://dmitryfrank.com/articles/indent_with_tabs_align_with_spaces .
-- Enable warnings:
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}
-- Play.hs.
{-# LANGUAGE Haskell2010 #-}
{-# LANGUAGE Arrows, TemplateHaskell, ScopedTypeVariables #-}
module Immutaball.Ball.State.Preplay
(
mkPreplayState,
PreplayWidget(..), AsPreplayWidget(..),
preplayGui
) where
import Prelude ()
import Immutaball.Prelude
import Control.Arrow
import Control.Lens
--import Control.Monad
--import Data.Functor.Identity
--import Control.Lens
--import qualified Data.Map as M
import qualified SDL.Raw.Enum as Raw
import Immutaball.Ball.LevelSets
import Immutaball.Share.GUI
import Immutaball.Share.Level
--import Immutaball.Share.Math
import Immutaball.Share.State
import Immutaball.Share.State.Context
import Immutaball.Share.Utils
import Immutaball.Share.Wire
-- TODO:
mkPreplayState :: LevelSet -> LevelIB -> (Either IBContext IBStateContext -> Immutaball) -> Either IBContext IBStateContext -> Immutaball
mkPreplayState _levelSet _level mkBack baseCxt0 = closeSecondI . switch . fromImmutaballSingleWith Nothing . openSecondI $ proc (Identity request) -> do
rec
cxtLast <- delay cxt0 -< cxt
cxtn <- requireBasics -< (cxtLast, request)
(_guiResponse, cxtnp1) <- mkGUI preplayGui -< (GUIDrive request, cxtn)
let response = ContinueResponse
let isEsc = (const False ||| (== (fromIntegral Raw.SDLK_ESCAPE, True))) . matching _Keybd $ request
let isBack = isEsc
() <- finishFrame -< (request, cxtnp1)
cxt <- returnA -< cxtnp1
-- Switch on Back button.
let switchTo = if' (not isBack) Nothing . Just . openSecondI $ mkBack (Right cxt)
returnA -< (Identity response, switchTo)
where cxt0 = either initialStateCxt id baseCxt0
data PreplayWidget =
PreplayRoot
| Anonymous Integer
deriving (Eq, Ord, Show)
--makeClassyPrisms ''PreplayWidget
-- TODO:
preplayGui :: [Widget PreplayWidget]
preplayGui =
[
RootWidget $ Root { _rootWid = PreplayRoot }
]
makeClassyPrisms ''PreplayWidget