{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE CPP #-} module Main where import Lens.Micro ((^.)) import Lens.Micro.TH (makeLenses) import Control.Monad (void) #if !(MIN_VERSION_base(4,11,0)) import Data.Monoid #endif import qualified Graphics.Vty as V import Brick.Main ( App(..), neverShowCursor, defaultMain , suspendAndResume, halt ) import Brick.AttrMap ( attrMap ) import Brick.Types ( Widget , EventM , BrickEvent(..) ) import Brick.Widgets.Core ( vBox , str ) data St = St { _stExternalInput :: String } makeLenses ''St drawUI :: St -> [Widget ()] drawUI st = [ui] where ui = vBox [ str $ "External input: \"" <> st^.stExternalInput <> "\"" , str "(Press Esc to quit or Space to ask for input)" ] appEvent :: BrickEvent () e -> EventM () St () appEvent (VtyEvent e) = case e of V.EvKey V.KEsc [] -> halt V.EvKey (V.KChar ' ') [] -> suspendAndResume $ do putStrLn "Suspended. Please enter something and press enter to resume:" s <- getLine return $ St { _stExternalInput = s } _ -> return () appEvent _ = return () initialState :: St initialState = St { _stExternalInput = "" } theApp :: App St e () theApp = App { appDraw = drawUI , appChooseCursor = neverShowCursor , appHandleEvent = appEvent , appStartEvent = return () , appAttrMap = const $ attrMap V.defAttr [] } main :: IO () main = void $ defaultMain theApp initialState