Files
loop/src/Dodge/Event/Menu.hs
T

62 lines
2.1 KiB
Haskell

module Dodge.Event.Menu
( handlePressedKeyInMenu
) where
import Dodge.Data
import Dodge.Debug.Terminal
--import Dodge.Menu
import Dodge.Menu.PushPop
import Dodge.WindowLayout
import Data.Maybe
--import Control.Monad
import Control.Lens
import SDL
--import qualified Debug.Trace
import qualified Data.Text as T
handlePressedKeyInMenu :: ScreenLayer -> Scancode -> Universe -> IO (Maybe Universe)
handlePressedKeyInMenu mState scode = case mState of
OptionScreen { _scOptions = mos, _scDefaultEff = defeff}
-> optionListToEffects defeff scode mos
DisplayScreen {} -> popScreen
ColumnsScreen {} -> popScreen
WaitScreen {} -> return . Just
InputScreen s help -> case scode of
ScancodeEscape -> popScreen
ScancodeReturn -> popScreen . applyTerminalString (words $ T.unpack s)
ScancodeTab -> autoCompleteTerminal (T.unpack s) help
ScancodeBackspace -> return . Just . (menuLayers . ix 0 . scInput %~ doBackspace)
-- text input handled by handleTextInput
_ -> return . Just
where
doBackspace t = case T.unsnoc t of
Nothing -> t
Just (t',_) -> t'
optionListToEffects
:: (Universe -> IO (Maybe Universe))
-> Scancode
-> [MenuOption]
-> Universe -> IO (Maybe Universe)
optionListToEffects defaulteff sc mops u = case sc of
ScancodeSpace -> return . Just
. (menuLayers . ix 0 . scOptionsOffset %~ (f . (+ mlines)))
$ u
_ -> (fromMaybe defaulteff
. lookup sc
. concatMap menuOptionToEffects $ mops) u
where
f x | x > length mops = 0
| otherwise = x
mlines = availableMenuLines $ _uvConfig u
menuOptionToEffects :: MenuOption -> [(Scancode,Universe -> IO (Maybe Universe))]
menuOptionToEffects Toggle {_moKey = k, _moEff = eff} = [(k,eff)]
menuOptionToEffects InvisibleToggle {_moKey = k, _moEff = eff} = [(k,eff)]
menuOptionToEffects Toggle2
{ _moKey1 = k1
, _moEff1 = eff1
, _moKey2 = k2
, _moEff2 = eff2
} = [(k1,eff1) , (k2,eff2)]