brick/programs/SuspendAndResumeDemo.hs

66 lines
1.4 KiB
Haskell
Raw Normal View History

2015-06-29 09:45:04 +03:00
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
module Main where
import Control.Lens (makeLenses, (.~), (^.), (&))
2015-06-29 09:45:04 +03:00
import Control.Monad (void)
import Data.Monoid
import Data.Default
import qualified Graphics.Vty as V
2015-06-29 09:45:04 +03:00
import Brick.Main
( App(..), neverShowCursor, defaultMain
, suspendAndResume, halt, continue
)
import Brick.Types
( Widget
, EventM
, Next
)
import Brick.Widgets.Core
( vBox
, str
)
2015-06-29 09:45:04 +03:00
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)"
2015-06-29 09:45:04 +03:00
]
appEvent :: St -> V.Event -> EventM (Next St)
appEvent st e =
2015-06-29 09:45:04 +03:00
case e of
V.EvKey V.KEsc [] -> halt st
V.EvKey (V.KChar ' ') [] -> suspendAndResume $ do
2015-06-29 09:45:04 +03:00
putStrLn "Suspended. Please enter something and press enter to resume:"
s <- getLine
return $ st & stExternalInput .~ s
_ -> continue st
initialState :: St
initialState =
St { _stExternalInput = ""
}
theApp :: App St V.Event
2015-06-29 09:45:04 +03:00
theApp =
App { appDraw = drawUI
, appChooseCursor = neverShowCursor
, appHandleEvent = appEvent
, appStartEvent = return
2015-06-29 09:45:04 +03:00
, appAttrMap = const def
, appLiftVtyEvent = id
2015-06-29 09:45:04 +03:00
}
main :: IO ()
main =
2015-06-29 09:45:04 +03:00
void $ defaultMain theApp initialState