ui: reg: refactor, consolidate state

This commit is contained in:
Simon Michael 2015-10-28 11:29:49 -07:00
parent 45db0a28cc
commit b950bd0d83
4 changed files with 30 additions and 26 deletions

View File

@ -36,9 +36,9 @@ import qualified Hledger.UI.RegisterScreen as RS (screen)
import qualified Hledger.UI.ErrorScreen as ES (screen) import qualified Hledger.UI.ErrorScreen as ES (screen)
screen = AccountsScreen{ screen = AccountsScreen{
asState = (list "accounts" V.empty 1, "") asState = (list "accounts" V.empty 1, "")
,sInitFn = initAccountsScreen ,sInitFn = initAccountsScreen
,sDrawFn = drawAccountsScreen ,sDrawFn = drawAccountsScreen
,sHandleFn = handleAccountsScreen ,sHandleFn = handleAccountsScreen
} }
@ -247,7 +247,9 @@ handleAccountsScreen st@AppState{
} }
Vty.EvKey (Vty.KLeft) [] -> continue $ popScreen st' Vty.EvKey (Vty.KLeft) [] -> continue $ popScreen st'
Vty.EvKey (k) [] | k `elem` [Vty.KRight, Vty.KEnter] -> do Vty.EvKey (k) [] | k `elem` [Vty.KRight, Vty.KEnter] -> do
let st'' = screenEnter d RS.screen{rsAcct=selacct'} st' let
scr = setRegisterScreenCurrentAccount selacct' RS.screen
st'' = screenEnter d scr st'
vScrollToBeginning $ viewportScroll "register" vScrollToBeginning $ viewportScroll "register"
continue st'' continue st''

View File

@ -94,7 +94,7 @@ runBrickUi uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}} j = do
-- with --register, start on the register screen, and also put -- with --register, start on the register screen, and also put
-- the accounts screen on the prev screens stack so you can exit -- the accounts screen on the prev screens stack so you can exit
-- to that as usual. -- to that as usual.
Just apat -> (RS.screen{rsAcct=acct}, [ascr']) Just apat -> (setRegisterScreenCurrentAccount acct RS.screen, [ascr'])
where where
acct = headDef acct = headDef
(error' $ "--register "++apat++" did not match any account") (error' $ "--register "++apat++" did not match any account")
@ -106,12 +106,9 @@ runBrickUi uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}} j = do
AppState{ AppState{
aopts=uopts' aopts=uopts'
,ajournal=j ,ajournal=j
,aScreen=setAccountsScreenSelection acct AS.screen ,aScreen=setAccountsScreenSelectedAccount acct AS.screen
,aPrevScreens=[] ,aPrevScreens=[]
} }
-- ugh
setAccountsScreenSelection a scr@AccountsScreen{asState=(l,_)} = scr{asState=(l,a)}
setAccountsScreenSelection _ scr = scr
st = (sInitFn scr) d st = (sInitFn scr) d
AppState{ AppState{

View File

@ -31,16 +31,15 @@ import Hledger.UI.UIUtils
import qualified Hledger.UI.ErrorScreen as ES (screen) import qualified Hledger.UI.ErrorScreen as ES (screen)
screen = RegisterScreen{ screen = RegisterScreen{
rsState = list "register" V.empty 1 rsState = (list "register" V.empty 1, "")
,rsAcct = "" ,sInitFn = initRegisterScreen
,sInitFn = initRegisterScreen ,sDrawFn = drawRegisterScreen
,sDrawFn = drawRegisterScreen
,sHandleFn = handleRegisterScreen ,sHandleFn = handleRegisterScreen
} }
initRegisterScreen :: Day -> AppState -> AppState initRegisterScreen :: Day -> AppState -> AppState
initRegisterScreen d st@AppState{aopts=opts, ajournal=j, aScreen=s@RegisterScreen{rsAcct=acct}} = initRegisterScreen d st@AppState{aopts=opts, ajournal=j, aScreen=s@RegisterScreen{rsState=(_,acct)}} =
st{aScreen=s{rsState=l}} st{aScreen=s{rsState=(l,acct)}}
where where
-- gather arguments and queries -- gather arguments and queries
ropts = (reportopts_ $ cliopts_ opts) ropts = (reportopts_ $ cliopts_ opts)
@ -87,7 +86,7 @@ initRegisterScreen _ _ = error "init function called with wrong screen type, sho
drawRegisterScreen :: AppState -> [Widget] drawRegisterScreen :: AppState -> [Widget]
drawRegisterScreen AppState{ -- aopts=_uopts@UIOpts{cliopts_=_copts@CliOpts{reportopts_=_ropts@ReportOpts{query_=querystr}}}, drawRegisterScreen AppState{ -- aopts=_uopts@UIOpts{cliopts_=_copts@CliOpts{reportopts_=_ropts@ReportOpts{query_=querystr}}},
aScreen=RegisterScreen{rsState=l,rsAcct=acct}} = [ui] aScreen=RegisterScreen{rsState=(l,acct)}} = [ui]
where where
toplabel = withAttr ("border" <> "bold") (str acct) toplabel = withAttr ("border" <> "bold") (str acct)
<+> str " transactions" <+> str " transactions"
@ -184,7 +183,7 @@ drawRegisterItem (datewidth,descwidth,acctswidth,changewidth,balwidth) selected
handleRegisterScreen :: AppState -> Vty.Event -> EventM (Next AppState) handleRegisterScreen :: AppState -> Vty.Event -> EventM (Next AppState)
handleRegisterScreen st@AppState{ handleRegisterScreen st@AppState{
aScreen=s@RegisterScreen{rsState=is} aScreen=s@RegisterScreen{rsState=(l,acct)}
,aopts=UIOpts{cliopts_=_copts} ,aopts=UIOpts{cliopts_=_copts}
,ajournal=j ,ajournal=j
} e = do } e = do
@ -203,7 +202,7 @@ handleRegisterScreen st@AppState{
-- Vty.EvKey (Vty.KRight) [] -> error (show curItem) where curItem = listSelectedElement is -- Vty.EvKey (Vty.KRight) [] -> error (show curItem) where curItem = listSelectedElement is
-- fall through to the list's event handler (handles [pg]up/down) -- fall through to the list's event handler (handles [pg]up/down)
ev -> do ev -> do
is' <- handleEvent ev is l' <- handleEvent ev l
continue st{aScreen=s{rsState=is'}} continue st{aScreen=s{rsState=(l',acct)}}
-- continue =<< handleEventLensed st someLens ev -- continue =<< handleEventLensed st someLens ev
handleRegisterScreen _ _ = error "event handler called with wrong screen type, should not happen" handleRegisterScreen _ _ = error "event handler called with wrong screen type, should not happen"

View File

@ -26,15 +26,14 @@ data AppState = AppState {
data Screen = data Screen =
AccountsScreen { AccountsScreen {
asState :: (List (Int,String,String,[String]), AccountName) -- ^ list widget holding (indent level, full account name, full or short account name to display, rendered amounts); asState :: (List (Int,String,String,[String]), AccountName) -- ^ list widget holding (indent level, full account name, full or short account name to display, rendered amounts);
-- the currently selected account's full name (or "") -- the full name of the currently selected account (or "")
,sInitFn :: Day -> AppState -> AppState -- ^ function to initialise the screen's state on entry ,sInitFn :: Day -> AppState -> AppState -- ^ function to initialise the screen's state on entry
,sHandleFn :: AppState -> V.Event -> EventM (Next AppState) -- ^ brick event handler to use for this screen ,sHandleFn :: AppState -> V.Event -> EventM (Next AppState) -- ^ brick event handler to use for this screen
,sDrawFn :: AppState -> [Widget] -- ^ brick renderer to use for this screen ,sDrawFn :: AppState -> [Widget] -- ^ brick renderer to use for this screen
} }
| RegisterScreen { | RegisterScreen {
rsState :: List (String,String,String,String,String) -- ^ list widget holding (date, description, other accts, change amt, balance amt) rsState :: (List (String,String,String,String,String), AccountName) -- ^ list widget holding (date, description, other accts, change amt, balance amt);
-- XXX move into rsState ? -- the full name of the account we are showing a register for
,rsAcct :: AccountName -- ^ the account we are showing a register for
,sInitFn :: Day -> AppState -> AppState ,sInitFn :: Day -> AppState -> AppState
,sHandleFn :: AppState -> V.Event -> EventM (Next AppState) ,sHandleFn :: AppState -> V.Event -> EventM (Next AppState)
,sDrawFn :: AppState -> [Widget] ,sDrawFn :: AppState -> [Widget]
@ -48,3 +47,10 @@ data Screen =
deriving (Show) deriving (Show)
instance Show (List a) where show _ = "<List>" instance Show (List a) where show _ = "<List>"
-- ugh
setAccountsScreenSelectedAccount a scr@AccountsScreen{asState=(l,_)} = scr{asState=(l,a)}
setAccountsScreenSelectedAccount _ scr = scr
setRegisterScreenCurrentAccount a scr@RegisterScreen{rsState=(l,_)} = scr{rsState=(l,a)}
setRegisterScreenCurrentAccount _ scr = scr