packages feed

titan-1.0.2: src/Controller/Conditions/CurFrameInfo.hs

{-# LANGUAGE ScopedTypeVariables #-}
module Controller.Conditions.CurFrameInfo where

import Control.Applicative
import Control.Exception
import Control.Monad
import Control.Monad.IfElse
import Data.Maybe
import Data.ReactiveValue
import Graphics.UI.Gtk
import Graphics.UI.Gtk.Reactive
import Graphics.UI.Gtk.Reactive.Gtk2
import Hails.MVC.Model.ProtectedModel.Reactive
import System.IO
import Text.Read                               (readMaybe)

import CombinedEnvironment
import IOBridge

installCondition :: CEnv -> IO ()
installCondition cenv = do
  installConditionInput       cenv
  installConditionModifyInput cenv

  installConditionShowFrame   cenv
  installConditionShowTime    cenv
  installConditionShowDTime   cenv

installConditionModifyInput cenv = do
  let curFrameField'      = mkFieldAccessor selectedFrameField      (model cenv)
      curFrameInputField' = mkFieldAccessor selectedFrameInputField (model cenv)
      curFrameData        = liftR2 (,) curFrameField' curFrameInputField'

  btn <- toolButtonActivateField <$> toolBtnModifyInput (uiBuilder (view cenv))
  (btn `governingR` curFrameData) =:> conditionVMModifyInput cenv

installConditionInput cenv = do
  let curFrameField'      = mkFieldAccessor selectedFrameField (model cenv)
  let curFrameInputField' = mkFieldAccessor selectedFrameInputField (model cenv)
  txtFrameInput' <- entryTextReactive <$> txtFrameInput (uiBuilder (view cenv))

  curFrameField' =:> wrapMW (\f ->
    case f of
      Just ix -> do
        let command = "GetInput " ++ show (ix :: Int)
        n <- sendToYampaSocketSync (extra cenv) command
        case n >>= readMaybe of
          Just (Just x) -> do putStrLn ("Want to show " ++ show x)
                              postGUIAsync $ do reactiveValueWrite txtFrameInput' x
                                                reactiveValueWrite curFrameInputField' (Just x)
          _      -> postGUIAsync $ do reactiveValueWrite txtFrameInput' ""
                                      reactiveValueWrite curFrameInputField' Nothing
      Nothing -> do reactiveValueWrite txtFrameInput' ""
                    reactiveValueWrite curFrameInputField' Nothing
   )

conditionVMModifyInput :: CEnv -> (Maybe Int, Maybe String) -> IO ()
conditionVMModifyInput cenv (Just ix, Just info) = do
    let command = "ModifyInputAt " ++ show ix ++ " " ++ show info
    sendToYampaSocketAsync (extra cenv) command
    print command
conditionVMModifyInput _ _ = return ()

installConditionShowFrame cenv = do
  let curFrameField' = mkFieldAccessor selectedFrameField (model cenv)
  txtFrameNumber' <- entryTextReactive <$> txtFrameNumber      (uiBuilder (view cenv))

  liftR (maybe "" show) curFrameField' =:> txtFrameNumber'

installConditionShowTime cenv = do
  let curFrameField' = mkFieldAccessor selectedFrameField (model cenv)
  txtFrameTime' <- entryTextReactive <$> txtFrameTime (uiBuilder (view cenv))

  curFrameField' =:> wrapMW (\f ->
       case f of
        Just ix -> do
          let command = "GetGTime " ++ show (ix :: Int)
          n <- sendToYampaSocketSync (extra cenv) command
          case n >>= readMaybe of
            Just (Just x) -> do putStrLn ("Want to show " ++ show x)
                                postGUIAsync $ reactiveValueWrite txtFrameTime' (show (x :: Double))
            _      -> postGUIAsync $ reactiveValueWrite txtFrameTime' ""
        Nothing -> reactiveValueWrite txtFrameTime' ""
    )

installConditionShowDTime cenv = do
  let curFrameField' = mkFieldAccessor selectedFrameField (model cenv)
  txtFrameDTime' <- entryTextReactive <$> txtFrameDTime (uiBuilder (view cenv))

  curFrameField' =:> wrapMW (\f ->
      case f of
       Just ix -> do
         let command = "GetDTime " ++ show (ix :: Int)
         n <- sendToYampaSocketSync (extra cenv) command
         case n >>= readMaybe of
           Just (Just x) -> do putStrLn ("Want to show " ++ show x)
                               postGUIAsync $ reactiveValueWrite txtFrameDTime' (show (x :: Double))
           _      -> postGUIAsync $ reactiveValueWrite txtFrameDTime' ""
       Nothing -> reactiveValueWrite txtFrameDTime' ""
    )