今回の目標はーー
ログ表示部分と エディタ部分を 1つづ つくり タイマーで 1秒ごとにログを表示していくもの
をつくること
{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TemplateHaskell #-} module Main(main) where import Lens.Micro ((^.)) import Lens.Micro.TH (makeLenses) import Lens.Micro.Mtl ((%=),zoom) import Control.Monad (void, forever) import Control.Concurrent (threadDelay, forkIO) import qualified Graphics.Vty as V import Brick.BChan (newBChan, writeBChan) import Brick.Main (App(..), showFirstCursor, customMain, halt) import Brick.AttrMap (attrMap) import Brick.Types (Widget, EventM, BrickEvent(..)) import Brick.Widgets.Core (str, (<+>), (<=>), hLimit, vLimit) import Brick.Widgets.Edit as E import Brick.Widgets.Center as C data Name = Edit deriving (Ord, Show, Eq) data CustomEvent = Counter deriving Show data St = St { _stCounter :: Int , _edit :: E.Editor String Name } makeLenses ''St drawUI :: St -> [Brick.Types.Widget Name] drawUI st = [ui] where a = (str $ "Counter value is: " <> (show $ st^.stCounter)) e1 = E.renderEditor (str.unlines) True (st^.edit) ui = C.center $ (str "Input : " <+> (hLimit 50 $ vLimit 5 e1)) <=> str " " <=> a <=> str " " <=> str "Esc to quit." appEvent :: BrickEvent Name CustomEvent -> EventM Name St () appEvent e = case e of VtyEvent (V.EvKey V.KEsc []) -> halt AppEvent Counter -> do stCounter %= (+1) ev -> zoom edit $ E.handleEditorEvent ev initialState :: St initialState = St { _stCounter = 0 , _edit = E.editor Edit Nothing "" } theApp :: App St CustomEvent Name theApp = App { appDraw = drawUI , appChooseCursor = showFirstCursor , appHandleEvent = appEvent , appStartEvent = return () , appAttrMap = const $ attrMap V.defAttr [] } main :: IO () main = do chan <- newBChan 1 void $ forkIO $ forever $ do writeBChan chan Counter threadDelay 100000 let buildVty = V.mkVty V.defaultConfig initialVty <- buildVty void $ customMain initialVty buildVty (Just chan) theApp initialState
まだ目標は達成されてゐない
カウンターの値を 一行ごとに表示して スクロールさせていきたいんだよね
でも 我ながら 一應動くものをつくれて 満足してゐるよん〜
他のデモを見ていきながら 目標の實現を目指さうかな