module Glue where import Brick import Control.Monad (when) import Control.Monad.State.Lazy 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 { appDraw :: GlobalState -> [Widget Name] appDraw = GlobalState -> [Widget Name] drawUI , appChooseCursor :: GlobalState -> [CursorLocation Name] -> Maybe (CursorLocation Name) appChooseCursor = forall s n. s -> [CursorLocation n] -> Maybe (CursorLocation n) showFirstCursor , appHandleEvent :: BrickEvent Name Event -> EventM Name GlobalState Event appHandleEvent = BrickEvent Name Event -> EventM Name GlobalState Event handleEvent , appStartEvent :: EventM Name GlobalState Event appStartEvent = forall {n} {s}. EventM n s Event enableMouse , appAttrMap :: GlobalState -> AttrMap appAttrMap = GlobalState -> AttrMap handleAttrMap } enableMouse :: EventM n s Event enableMouse = do Vty vty <- forall n s. EventM n s Vty getVtyHandle let output :: Output output = Vty -> Output V.outputIface Vty vty forall (f :: * -> *). Applicative f => Bool -> f Event -> f Event when (Output -> Mode -> Bool V.supportsMode Output output Mode V.Mouse) forall a b. (a -> b) -> a -> b $ forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO forall a b. (a -> b) -> a -> b $ Output -> Mode -> Bool -> IO Event V.setMode Output output Mode V.Mouse Bool True drawUI :: GlobalState -> [Widget Name] drawUI :: GlobalState -> [Widget Name] drawUI GlobalState gs = case forall s a. State s a -> s -> a evalState forall (m :: * -> *). MonadState GlobalState m => m 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 :: BrickEvent Name Event -> EventM Name GlobalState () handleEvent :: BrickEvent Name Event -> EventM Name GlobalState Event handleEvent BrickEvent Name Event ev = do if BrickEvent Name Event ev forall a. Eq a => a -> a -> Bool == forall n e. Event -> BrickEvent n e VtyEvent (Key -> [Modifier] -> Event V.EvKey (Char -> Key V.KChar Char 'c') [Modifier V.MCtrl]) then forall {n} {s}. EventM n s Event halt else do State s <- forall (m :: * -> *). MonadState GlobalState m => m State getState case State s of MainMenuState MMS s -> BrickEvent Name Event -> EventM Name GlobalState Event MM.handleEvent BrickEvent Name Event ev SettingsState SS s -> BrickEvent Name Event -> EventM Name GlobalState Event S.handleEvent BrickEvent Name Event ev InfoState Event s -> BrickEvent Name Event -> EventM Name GlobalState Event I.handleEvent BrickEvent Name Event ev CardSelectorState CSS s -> BrickEvent Name Event -> EventM Name GlobalState Event CS.handleEvent BrickEvent Name Event ev FileBrowserState FBS s -> BrickEvent Name Event -> EventM Name GlobalState Event FB.handleEvent BrickEvent Name Event ev CardsState CS s -> BrickEvent Name Event -> EventM Name GlobalState Event C.handleEvent BrickEvent Name Event ev ParameterState PS s -> BrickEvent Name Event -> EventM Name GlobalState Event P.handleEvent BrickEvent Name Event ev handleAttrMap :: GlobalState -> AttrMap handleAttrMap :: GlobalState -> AttrMap handleAttrMap GlobalState gs = case forall s a. State s a -> s -> a evalState forall (m :: * -> *). MonadState GlobalState m => m 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