1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
{-# 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
|