taskell-1.11.2: src/Taskell/Events/Actions.hs
module Taskell.Events.Actions
( event
, generateActions
, ActionSets
) where
import ClassyPrelude
import Control.Lens ((^.))
import Graphics.Vty.Input.Events (Event (..))
import Taskell.Events.State.Types (State, Stateful, mode)
import Taskell.Events.State.Types.Mode (DetailMode (..), ModalType (..), Mode (..))
import Taskell.IO.Keyboard (generate)
import Taskell.IO.Keyboard.Types (Bindings, BoundActions)
import qualified Taskell.Events.Actions.Insert as Insert
import qualified Taskell.Events.Actions.Modal as Modal
import qualified Taskell.Events.Actions.Modal.Detail as Detail
import qualified Taskell.Events.Actions.Modal.Due as Due
import qualified Taskell.Events.Actions.Modal.Help as Help
import qualified Taskell.Events.Actions.Normal as Normal
import qualified Taskell.Events.Actions.Search as Search
-- takes an event and returns a Maybe State
event' :: Event -> Stateful
-- for other events pass through to relevant modules
event' e state =
case state ^. mode of
Normal -> Normal.event e state
Search -> Search.event e state
Insert {} -> Insert.event e state
Modal {} -> Modal.event e state
_ -> pure state
-- returns new state if successful
event :: ActionSets -> Event -> State -> State
event actions e state = do
let mEv =
case state ^. mode of
Normal -> lookup e $ normal actions
Modal (Detail _ DetailNormal) -> lookup e $ detail actions
Modal Due {} -> lookup e $ due actions
Modal (Help _) -> lookup e $ help actions
_ -> Nothing
fromMaybe state $
case mEv of
Nothing -> event' e state
Just ev -> ev state
data ActionSets = ActionSets
{ normal :: BoundActions
, detail :: BoundActions
, help :: BoundActions
, due :: BoundActions
}
generateActions :: Bindings -> ActionSets
generateActions bindings =
ActionSets
{ normal = generate bindings Normal.events
, detail = generate bindings Detail.events
, help = generate bindings Help.events
, due = generate bindings Due.events
}