layers-game-0.3: src/Callback/Key.hs
module Callback.Key where
#include "Utils.cpp"
import Control.Arrow ((&&&))
import Control.Monad (when)
import Control.Applicative ((<$>))
import qualified Data.IORef as R
import System.Exit (exitSuccess)
import qualified Graphics.UI.GLFW as GLFW
import Gamgine.Control ((?))
import qualified AppData as AP
import qualified Gamgine.State.KeyInfo as KI
import qualified Gamgine.State.InputInfo as II
import qualified Callback.Common as CC
import qualified Convert.ToFileData as TF
import qualified Utils as U
IMPORT_LENS_AS_LE
type Pressed = Bool
type KeyCallback = (GLFW.Key -> Pressed -> IO ())
newKeyCallback :: AP.AppDataRef -> KeyCallback
newKeyCallback appDataRef = callback
where
callback GLFW.KeyEsc True = quit
callback (GLFW.CharKey 'Q') True = quit
callback (GLFW.CharKey 'S') True = do
appMode <- AP.appMode <$> R.readIORef appDataRef
when (appMode == AP.EditMode) $ do
(gdata, saveTo) <- (AP.gameData &&& AP.saveLevelsTo) <$> R.readIORef appDataRef
writeFile saveTo (show . TF.toFileData $ gdata)
putStrLn $ "layers: Levels data written to file '" ++ saveTo ++ "'"
callback key pressed = do
mpos <- CC.mousePosition appDataRef
mods <- II.pressedModifiers
let keyInfo = KI.KeyInfo key (pressed ? KI.Pressed $ KI.Released) mpos mods
R.modifyIORef appDataRef (AP.handleKeyEvent keyInfo)
quit = GLFW.closeWindow >> GLFW.terminate >> exitSuccess