Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
135965e
commit 00428e7
Showing
2 changed files
with
100 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
{-# LANGUAGE OverloadedStrings #-} | ||
module Main where | ||
|
||
import Control.Monad (void) | ||
import Graphics.Vty | ||
( white, blue, green, yellow, black, magenta | ||
, Event(EvKey) | ||
, Key(KChar, KEsc) | ||
) | ||
|
||
import Brick.Main | ||
import Brick.Themes | ||
( Theme | ||
, newTheme | ||
, themeToAttrMap | ||
) | ||
import Brick.Types | ||
( Widget | ||
, BrickEvent(VtyEvent) | ||
, EventM | ||
, Next | ||
) | ||
import Brick.Widgets.Center | ||
( hCenter | ||
, center | ||
) | ||
import Brick.Widgets.Core | ||
( (<+>) | ||
, vBox | ||
, str | ||
, hLimit | ||
, withDefAttr | ||
) | ||
import Brick.Util (on, fg) | ||
import Brick.AttrMap (AttrName) | ||
|
||
ui :: Widget n | ||
ui = | ||
center $ | ||
hLimit 40 $ | ||
vBox $ hCenter <$> | ||
[ str "Press " <+> (withDefAttr keybindingAttr $ str "1") <+> str " to switch to theme 1." | ||
, str "Press " <+> (withDefAttr keybindingAttr $ str "2") <+> str " to switch to theme 2." | ||
] | ||
|
||
keybindingAttr :: AttrName | ||
keybindingAttr = "keybinding" | ||
|
||
theme1 :: Theme | ||
theme1 = | ||
newTheme (white `on` blue) | ||
[ (keybindingAttr, fg magenta) | ||
] | ||
|
||
theme2 :: Theme | ||
theme2 = | ||
newTheme (green `on` black) | ||
[ (keybindingAttr, fg yellow) | ||
] | ||
|
||
appEvent :: Int -> BrickEvent () e -> EventM () (Next Int) | ||
appEvent _ (VtyEvent (EvKey (KChar '1') [])) = continue 1 | ||
appEvent _ (VtyEvent (EvKey (KChar '2') [])) = continue 2 | ||
appEvent s (VtyEvent (EvKey (KChar 'q') [])) = halt s | ||
appEvent s (VtyEvent (EvKey KEsc [])) = halt s | ||
appEvent s _ = continue s | ||
|
||
app :: App Int e () | ||
app = | ||
App { appDraw = const [ui] | ||
, appHandleEvent = appEvent | ||
, appStartEvent = return | ||
, appAttrMap = \s -> | ||
-- Note that in practice this is not ideal: we don't want | ||
-- to build an attribute from a theme every time this is | ||
-- invoked, because it gets invoked once per redraw. Instead | ||
-- we'd build the attribute map at startup and store it in | ||
-- the application state. Here I just use themeToAttrMap to | ||
-- show the mechanics of the API. | ||
if s == 1 | ||
then themeToAttrMap theme1 | ||
else themeToAttrMap theme2 | ||
, appChooseCursor = neverShowCursor | ||
} | ||
|
||
main :: IO () | ||
main = void $ defaultMain app 1 |