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
|
|
|
]
|
|
|
|
|
2015-05-09 10:45:46 +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:45:46 +03:00
|
|
|
}
|
2015-05-09 10:18:29 +03:00
|
|
|
|
2015-05-11 17:55:48 +03:00
|
|
|
makeLenses ''St
|
|
|
|
|
2015-05-19 00:10:00 +03:00
|
|
|
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 $
|
2015-05-19 07:03:48 +03:00
|
|
|
borderedWithLabel bs bsName $
|
2015-05-19 00:10:00 +03:00
|
|
|
(VLimit 1 $ HLimit 25 $ UseAttr (cyan `on` blue) $
|
2015-05-19 04:44:28 +03:00
|
|
|
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
|
|
|
=>>
|
2015-05-19 04:44:28 +03:00
|
|
|
(VLimit 10 $ HLimit 25 $ With stList drawList)
|
2015-05-09 09:09:40 +03:00
|
|
|
|
2015-05-17 19:41:17 +03:00
|
|
|
appEvent :: Event -> St -> IO St
|
|
|
|
appEvent e st =
|
2015-05-09 09:09:40 +03:00
|
|
|
case e of
|
2015-05-19 07:09:59 +03:00
|
|
|
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
|
|
|
|
2015-05-17 19:53:00 +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
|
|
|
|
2015-05-17 19:41:17 +03:00
|
|
|
ev -> return $ st & stEditor %~ (handleEvent ev)
|
|
|
|
& stList %~ (handleEvent ev)
|
2015-05-09 10:45:46 +03:00
|
|
|
|
|
|
|
initialState :: St
|
|
|
|
initialState =
|
2015-05-19 04:53:34 +03:00
|
|
|
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-09 19:14:56 +03:00
|
|
|
}
|
|
|
|
|
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
|
2015-05-17 19:41:17 +03:00
|
|
|
, appHandleEvent = appEvent
|
2015-05-09 19:24:59 +03:00
|
|
|
}
|
|
|
|
|
2015-05-09 09:09:40 +03:00
|
|
|
main :: IO ()
|
2015-05-11 01:51:08 +03:00
|
|
|
main = defaultMain theApp initialState
|