diff --git a/hledger-ui/Hledger/UI/AccountsScreen.hs b/hledger-ui/Hledger/UI/AccountsScreen.hs index 773058dfc..c3fd78fd0 100644 --- a/hledger-ui/Hledger/UI/AccountsScreen.hs +++ b/hledger-ui/Hledger/UI/AccountsScreen.hs @@ -36,9 +36,9 @@ import qualified Hledger.UI.RegisterScreen as RS (screen) import qualified Hledger.UI.ErrorScreen as ES (screen) screen = AccountsScreen{ - asState = (list "accounts" V.empty 1, "") - ,sInitFn = initAccountsScreen - ,sDrawFn = drawAccountsScreen + asState = (list "accounts" V.empty 1, "") + ,sInitFn = initAccountsScreen + ,sDrawFn = drawAccountsScreen ,sHandleFn = handleAccountsScreen } @@ -247,7 +247,9 @@ handleAccountsScreen st@AppState{ } Vty.EvKey (Vty.KLeft) [] -> continue $ popScreen st' 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" continue st'' diff --git a/hledger-ui/Hledger/UI/Main.hs b/hledger-ui/Hledger/UI/Main.hs index 6e03718ab..e2c666df3 100644 --- a/hledger-ui/Hledger/UI/Main.hs +++ b/hledger-ui/Hledger/UI/Main.hs @@ -94,7 +94,7 @@ runBrickUi uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}} j = do -- with --register, start on the register screen, and also put -- the accounts screen on the prev screens stack so you can exit -- to that as usual. - Just apat -> (RS.screen{rsAcct=acct}, [ascr']) + Just apat -> (setRegisterScreenCurrentAccount acct RS.screen, [ascr']) where acct = headDef (error' $ "--register "++apat++" did not match any account") @@ -106,12 +106,9 @@ runBrickUi uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}} j = do AppState{ aopts=uopts' ,ajournal=j - ,aScreen=setAccountsScreenSelection acct AS.screen + ,aScreen=setAccountsScreenSelectedAccount acct AS.screen ,aPrevScreens=[] } - -- ugh - setAccountsScreenSelection a scr@AccountsScreen{asState=(l,_)} = scr{asState=(l,a)} - setAccountsScreenSelection _ scr = scr st = (sInitFn scr) d AppState{ diff --git a/hledger-ui/Hledger/UI/RegisterScreen.hs b/hledger-ui/Hledger/UI/RegisterScreen.hs index 92e49be76..5c3ddc6fc 100644 --- a/hledger-ui/Hledger/UI/RegisterScreen.hs +++ b/hledger-ui/Hledger/UI/RegisterScreen.hs @@ -31,16 +31,15 @@ import Hledger.UI.UIUtils import qualified Hledger.UI.ErrorScreen as ES (screen) screen = RegisterScreen{ - rsState = list "register" V.empty 1 - ,rsAcct = "" - ,sInitFn = initRegisterScreen - ,sDrawFn = drawRegisterScreen + rsState = (list "register" V.empty 1, "") + ,sInitFn = initRegisterScreen + ,sDrawFn = drawRegisterScreen ,sHandleFn = handleRegisterScreen } initRegisterScreen :: Day -> AppState -> AppState -initRegisterScreen d st@AppState{aopts=opts, ajournal=j, aScreen=s@RegisterScreen{rsAcct=acct}} = - st{aScreen=s{rsState=l}} +initRegisterScreen d st@AppState{aopts=opts, ajournal=j, aScreen=s@RegisterScreen{rsState=(_,acct)}} = + st{aScreen=s{rsState=(l,acct)}} where -- gather arguments and queries ropts = (reportopts_ $ cliopts_ opts) @@ -87,7 +86,7 @@ initRegisterScreen _ _ = error "init function called with wrong screen type, sho drawRegisterScreen :: AppState -> [Widget] 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 toplabel = withAttr ("border" <> "bold") (str acct) <+> str " transactions" @@ -184,7 +183,7 @@ drawRegisterItem (datewidth,descwidth,acctswidth,changewidth,balwidth) selected handleRegisterScreen :: AppState -> Vty.Event -> EventM (Next AppState) handleRegisterScreen st@AppState{ - aScreen=s@RegisterScreen{rsState=is} + aScreen=s@RegisterScreen{rsState=(l,acct)} ,aopts=UIOpts{cliopts_=_copts} ,ajournal=j } e = do @@ -203,7 +202,7 @@ handleRegisterScreen st@AppState{ -- Vty.EvKey (Vty.KRight) [] -> error (show curItem) where curItem = listSelectedElement is -- fall through to the list's event handler (handles [pg]up/down) ev -> do - is' <- handleEvent ev is - continue st{aScreen=s{rsState=is'}} + l' <- handleEvent ev l + continue st{aScreen=s{rsState=(l',acct)}} -- continue =<< handleEventLensed st someLens ev handleRegisterScreen _ _ = error "event handler called with wrong screen type, should not happen" diff --git a/hledger-ui/Hledger/UI/UITypes.hs b/hledger-ui/Hledger/UI/UITypes.hs index c5c39fda1..0d98e4e7d 100644 --- a/hledger-ui/Hledger/UI/UITypes.hs +++ b/hledger-ui/Hledger/UI/UITypes.hs @@ -26,15 +26,14 @@ data AppState = AppState { data Screen = 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); - -- the currently selected account's full name (or "") - ,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 - ,sDrawFn :: AppState -> [Widget] -- ^ brick renderer to use for this screen + -- the full name of the currently selected account (or "") + ,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 + ,sDrawFn :: AppState -> [Widget] -- ^ brick renderer to use for this screen } | RegisterScreen { - rsState :: List (String,String,String,String,String) -- ^ list widget holding (date, description, other accts, change amt, balance amt) - -- XXX move into rsState ? - ,rsAcct :: AccountName -- ^ the account we are showing a register for + rsState :: (List (String,String,String,String,String), AccountName) -- ^ list widget holding (date, description, other accts, change amt, balance amt); + -- the full name of the account we are showing a register for ,sInitFn :: Day -> AppState -> AppState ,sHandleFn :: AppState -> V.Event -> EventM (Next AppState) ,sDrawFn :: AppState -> [Widget] @@ -48,3 +47,10 @@ data Screen = deriving (Show) instance Show (List a) where show _ = "" + +-- 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