hledger-ui (formerly hledger-vty) is now built on brick, a new declarative UI layer built on vty. This brings much new power, and should make the UI much easier to grow and maintain. At this point, functionality and performance are similar to the old version. There's no journal entries screen, but entering the postings screen jumps to the latest posting, and layout is better (multiple commodities are rendered on one line). Requires unreleased brick from github (HEAD or some branch) for now.
		
			
				
	
	
		
			52 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Haskell
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Haskell
		
	
	
	
	
	
| {-# LANGUAGE OverloadedStrings #-}
 | |
| 
 | |
| module Hledger.UI.UIUtils
 | |
| where
 | |
| 
 | |
| -- import Control.Lens ((^.))
 | |
| -- import Control.Monad
 | |
| -- import Data.Default
 | |
| import Data.Monoid              -- 
 | |
| import Data.Time.Calendar (Day)
 | |
| import qualified Graphics.Vty as V
 | |
| -- import qualified Brick.Types as T
 | |
| -- import qualified Brick.Main as M
 | |
| import qualified Brick.AttrMap as A
 | |
| -- import qualified Brick.Widgets.Border as B
 | |
| -- import qualified Brick.Widgets.Center as C
 | |
| import qualified Brick.Widgets.List as L
 | |
| import Brick.Util
 | |
| 
 | |
| import Hledger.UI.UITypes
 | |
| 
 | |
| pushScreen :: Screen -> AppState -> AppState
 | |
| pushScreen scr st = st{aPrevScreens=(aScreen st:aPrevScreens st)
 | |
|                       ,aScreen=scr
 | |
|                       }
 | |
| 
 | |
| popScreen :: AppState -> AppState
 | |
| popScreen st@AppState{aPrevScreens=s:ss} = st{aScreen=s, aPrevScreens=ss}
 | |
| popScreen st = st
 | |
| 
 | |
| -- clearScreens :: AppState -> AppState
 | |
| -- clearScreens st = st{aPrevScreens=[]}
 | |
| 
 | |
| -- | Enter a new screen, saving the old screen & state in the
 | |
| -- navigation history and initialising the new screen's state.
 | |
| -- Extra args can be passed to the new screen's init function,
 | |
| -- these can be eg query arguments.
 | |
| screenEnter :: Day -> [String] -> Screen -> AppState -> AppState
 | |
| screenEnter d args scr st = (sInitFn scr) d args $
 | |
|                             pushScreen scr
 | |
|                             st
 | |
| 
 | |
| attrMap :: A.AttrMap
 | |
| attrMap = A.attrMap V.defAttr
 | |
|     [ (L.listAttr,            V.white `on` V.blue)
 | |
|     , (L.listSelectedAttr,    V.black `on` V.white)
 | |
|     -- , (customAttr,            fg V.cyan)
 | |
|     ]
 | |
| 
 | |
| customAttr :: A.AttrName
 | |
| customAttr = L.listSelectedAttr <> "custom"
 |