module Glue where
import Brick
import States
import StateManagement
import qualified Graphics.Vty     as V
import qualified UI.MainMenu      as MM
import qualified UI.Settings      as S
import qualified UI.Info          as I
import qualified UI.CardSelector  as CS
import qualified UI.FileBrowser   as FB
import qualified UI.Cards         as C
import qualified UI.Parameter     as P

globalApp :: App GlobalState Event Name
globalApp :: App GlobalState Event Name
globalApp = App :: forall s e n.
(s -> [Widget n])
-> (s -> [CursorLocation n] -> Maybe (CursorLocation n))
-> (s -> BrickEvent n e -> EventM n (Next s))
-> (s -> EventM n s)
-> (s -> AttrMap)
-> App s e n
App
  { appDraw :: GlobalState -> [Widget Name]
appDraw = GlobalState -> [Widget Name]
drawUI
  , appChooseCursor :: GlobalState -> [CursorLocation Name] -> Maybe (CursorLocation Name)
appChooseCursor = GlobalState -> [CursorLocation Name] -> Maybe (CursorLocation Name)
forall s n. s -> [CursorLocation n] -> Maybe (CursorLocation n)
showFirstCursor
  , appHandleEvent :: GlobalState
-> BrickEvent Name Event -> EventM Name (Next GlobalState)
appHandleEvent = GlobalState
-> BrickEvent Name Event -> EventM Name (Next GlobalState)
handleEvent
  , appStartEvent :: GlobalState -> EventM Name GlobalState
appStartEvent = GlobalState -> EventM Name GlobalState
forall (m :: * -> *) a. Monad m => a -> m a
return
  , appAttrMap :: GlobalState -> AttrMap
appAttrMap = GlobalState -> AttrMap
handleAttrMap
  }

drawUI :: GlobalState -> [Widget Name]
drawUI :: GlobalState -> [Widget Name]
drawUI GlobalState
gs = case GlobalState -> State
getState GlobalState
gs of
  MainMenuState     MMS
s -> MMS -> [Widget Name]
MM.drawUI MMS
s
  SettingsState     SS
s ->  SS -> [Widget Name]
S.drawUI SS
s
  InfoState         Event
s ->  Event -> [Widget Name]
I.drawUI Event
s
  CardSelectorState CSS
s -> GlobalState -> CSS -> [Widget Name]
CS.drawUI GlobalState
gs CSS
s
  FileBrowserState  FBS
s -> FBS -> [Widget Name]
FB.drawUI FBS
s
  CardsState        CS
s ->  CS -> [Widget Name]
C.drawUI CS
s
  ParameterState    PS
s ->  PS -> [Widget Name]
P.drawUI PS
s

handleEvent :: GlobalState -> BrickEvent Name Event -> EventM Name (Next GlobalState)
handleEvent :: GlobalState
-> BrickEvent Name Event -> EventM Name (Next GlobalState)
handleEvent GlobalState
gs BrickEvent Name Event
ev =
  if BrickEvent Name Event
ev BrickEvent Name Event -> BrickEvent Name Event -> Bool
forall a. Eq a => a -> a -> Bool
== Event -> BrickEvent Name Event
forall n e. Event -> BrickEvent n e
VtyEvent (Key -> [Modifier] -> Event
V.EvKey (Char -> Key
V.KChar Char
'c') [Modifier
V.MCtrl]) then GlobalState -> EventM Name (Next GlobalState)
forall s n. s -> EventM n (Next s)
halt GlobalState
gs else
  case GlobalState -> State
getState GlobalState
gs of
    MainMenuState     MMS
s -> GlobalState
-> MMS -> BrickEvent Name Event -> EventM Name (Next GlobalState)
MM.handleEvent GlobalState
gs MMS
s BrickEvent Name Event
ev
    SettingsState     SS
s ->  GlobalState
-> SS -> BrickEvent Name Event -> EventM Name (Next GlobalState)
S.handleEvent GlobalState
gs SS
s BrickEvent Name Event
ev
    InfoState         Event
s ->  GlobalState
-> Event -> BrickEvent Name Event -> EventM Name (Next GlobalState)
I.handleEvent GlobalState
gs Event
s BrickEvent Name Event
ev
    CardSelectorState CSS
s -> GlobalState
-> CSS -> BrickEvent Name Event -> EventM Name (Next GlobalState)
CS.handleEvent GlobalState
gs CSS
s BrickEvent Name Event
ev
    FileBrowserState  FBS
s -> GlobalState
-> FBS -> BrickEvent Name Event -> EventM Name (Next GlobalState)
FB.handleEvent GlobalState
gs FBS
s BrickEvent Name Event
ev
    CardsState        CS
s ->  GlobalState
-> CS -> BrickEvent Name Event -> EventM Name (Next GlobalState)
C.handleEvent GlobalState
gs CS
s BrickEvent Name Event
ev
    ParameterState    PS
s ->  GlobalState
-> PS -> BrickEvent Name Event -> EventM Name (Next GlobalState)
P.handleEvent GlobalState
gs PS
s BrickEvent Name Event
ev

handleAttrMap :: GlobalState -> AttrMap
handleAttrMap :: GlobalState -> AttrMap
handleAttrMap GlobalState
gs = case GlobalState -> State
getState GlobalState
gs of
  MainMenuState     MMS
_ -> AttrMap
MM.theMap
  SettingsState     SS
_ ->  AttrMap
S.theMap
  InfoState         Event
_ ->  AttrMap
I.theMap
  CardSelectorState CSS
_ -> AttrMap
CS.theMap
  FileBrowserState  FBS
_ -> AttrMap
FB.theMap
  CardsState        CS
_ ->  AttrMap
C.theMap
  ParameterState    PS
_ ->  AttrMap
P.theMap