mirror of
https://github.com/jtdaugherty/brick.git
synced 2024-09-11 23:57:22 +03:00
This experimental change makes it possible to: * Avoid runtime errors due to name typos * Achieve compile-time guarantees about name matching and usage * Force widget functions to be name-agnostic by being polymorphic in their name type * Clean up focus handling by making it possible to pattern-match on cursor location names The change also made many types more heavyweight and in some cases this is unpleasant when we don't want to have to care about names. But in those cases we can just use 'n' or '()' depending on how concrete we need to be. I'm not yet sure how this is going to play out in practice.
66 lines
1.9 KiB
Haskell
66 lines
1.9 KiB
Haskell
{-# LANGUAGE OverloadedStrings #-}
|
|
module Main where
|
|
|
|
import Data.Monoid
|
|
import Graphics.Vty
|
|
( Event, Attr, white, blue, cyan, green, red, yellow
|
|
, black
|
|
)
|
|
|
|
import Brick.Main
|
|
import Brick.Types
|
|
( Widget
|
|
)
|
|
import Brick.Widgets.Core
|
|
( (<=>)
|
|
, withAttr
|
|
, vBox
|
|
, str
|
|
)
|
|
import Brick.Util (on, fg)
|
|
import Brick.AttrMap (attrMap, AttrMap)
|
|
|
|
ui :: Widget ()
|
|
ui =
|
|
vBox [ str "This text uses the global default attribute."
|
|
, withAttr "foundFull" $
|
|
str "Specifying an attribute name means we look it up in the attribute tree."
|
|
, (withAttr "foundFgOnly" $
|
|
str ("When we find a value, we merge it with its parent in the attribute")
|
|
<=> str "name tree all the way to the root (the global default).")
|
|
, withAttr "missing" $
|
|
str "A missing attribute name just resumes the search at its parent."
|
|
, withAttr ("general" <> "specific") $
|
|
str "In this way we build complete attribute values by using an inheritance scheme."
|
|
, withAttr "foundFull" $
|
|
str "You can override everything ..."
|
|
, withAttr "foundFgOnly" $
|
|
str "... or only you want to change and inherit the rest."
|
|
, str "Attribute names are assembled with the Monoid append operation to indicate"
|
|
, str "hierarchy levels, e.g. \"window\" <> \"title\"."
|
|
]
|
|
|
|
globalDefault :: Attr
|
|
globalDefault = white `on` blue
|
|
|
|
theMap :: AttrMap
|
|
theMap = attrMap globalDefault
|
|
[ ("foundFull", white `on` green)
|
|
, ("foundFgOnly", fg red)
|
|
, ("general", yellow `on` black)
|
|
, ("general" <> "specific", fg cyan)
|
|
]
|
|
|
|
app :: App () Event ()
|
|
app =
|
|
App { appDraw = const [ui]
|
|
, appHandleEvent = resizeOrQuit
|
|
, appStartEvent = return
|
|
, appAttrMap = const theMap
|
|
, appChooseCursor = neverShowCursor
|
|
, appLiftVtyEvent = id
|
|
}
|
|
|
|
main :: IO ()
|
|
main = defaultMain app ()
|