brick/programs/Main.hs

88 lines
2.1 KiB
Haskell
Raw Normal View History

2015-05-09 09:09:40 +03:00
{-# LANGUAGE OverloadedStrings #-}
2015-05-11 17:55:48 +03:00
{-# LANGUAGE TemplateHaskell #-}
2015-05-09 09:09:40 +03:00
module Main where
2015-05-11 17:55:48 +03:00
import Control.Lens
2015-05-09 19:56:14 +03:00
import Data.Default
2015-05-17 19:22:08 +03:00
import Data.Monoid
2015-05-09 09:09:40 +03:00
import Graphics.Vty
import System.Exit
2015-05-18 04:41:38 +03:00
import Brick.Main
import Brick.Edit
import Brick.List
import Brick.Core
import Brick.Prim
2015-05-18 05:37:25 +03:00
import Brick.Center
2015-05-18 04:41:38 +03:00
import Brick.Border
import Brick.Util
2015-05-09 10:18:29 +03:00
2015-05-19 06:59:58 +03:00
styles :: [(String, BorderStyle)]
styles =
2015-05-19 07:01:59 +03:00
[ ("ascii", ascii)
, ("uni", unicode)
, ("uni-bold", unicodeBold)
, ("uni-rounded", unicodeRounded)
2015-05-19 06:59:58 +03:00
]
data St =
2015-05-11 17:55:48 +03:00
St { _stEditor :: Editor
2015-05-19 00:14:13 +03:00
, _stList :: List Int
2015-05-19 06:59:58 +03:00
, _stBorderStyle :: Int
}
2015-05-09 10:18:29 +03:00
2015-05-11 17:55:48 +03:00
makeLenses ''St
drawUI :: St -> [Prim St]
2015-05-19 06:59:58 +03:00
drawUI st = [a]
2015-05-10 00:28:37 +03:00
where
2015-05-19 07:07:55 +03:00
(bsName, bs) = styles !! (st^.stBorderStyle)
2015-05-17 05:16:06 +03:00
a = centered $
borderedWithLabel bs bsName $
(VLimit 1 $ HLimit 25 $ UseAttr (cyan `on` blue) $
With stEditor drawEditor)
2015-05-18 18:38:30 +03:00
<<=
2015-05-19 06:59:58 +03:00
hBorder bs
2015-05-18 18:38:30 +03:00
=>>
(VLimit 10 $ HLimit 25 $ With stList drawList)
2015-05-09 09:09:40 +03:00
appEvent :: Event -> St -> IO St
appEvent e st =
2015-05-09 09:09:40 +03:00
case e of
EvKey (KChar '+') [] ->
return $ st & stBorderStyle %~ ((`mod` (length styles)) . (+ 1))
2015-05-19 06:59:58 +03:00
2015-05-17 05:42:25 +03:00
EvKey KEsc [] -> exitSuccess
2015-05-18 18:38:30 +03:00
EvKey KEnter [] ->
2015-05-17 20:01:23 +03:00
let el = length $ listElements $ st^.stList
in return $ st & stList %~ listInsert el el
2015-05-18 18:38:30 +03:00
ev -> return $ st & stEditor %~ (handleEvent ev)
& stList %~ (handleEvent ev)
initialState :: St
initialState =
St { _stEditor = editor (CursorName "edit") ""
2015-05-19 04:51:06 +03:00
, _stList = list listDrawElem []
2015-05-19 06:59:58 +03:00
, _stBorderStyle = 0
}
2015-05-19 00:14:13 +03:00
listDrawElem :: Bool -> Int -> Prim (List Int)
2015-05-17 19:44:18 +03:00
listDrawElem sel i =
2015-05-17 19:22:08 +03:00
let selAttr = white `on` blue
2015-05-18 18:38:30 +03:00
maybeSelect = if sel
then UseAttr selAttr
else id
in maybeSelect $ hCentered (Txt $ "Number " <> show i)
2015-05-17 19:22:08 +03:00
2015-05-11 01:51:08 +03:00
theApp :: App St Event
2015-05-11 00:56:58 +03:00
theApp =
2015-05-09 19:56:14 +03:00
def { appDraw = drawUI
2015-05-11 01:42:59 +03:00
, appChooseCursor = showFirstCursor
, appHandleEvent = appEvent
}
2015-05-09 09:09:40 +03:00
main :: IO ()
2015-05-11 01:51:08 +03:00
main = defaultMain theApp initialState