diff --git a/hledger-ui/Hledger/UI/AccountsScreen.hs b/hledger-ui/Hledger/UI/AccountsScreen.hs index c3fd78fd0..50bf24265 100644 --- a/hledger-ui/Hledger/UI/AccountsScreen.hs +++ b/hledger-ui/Hledger/UI/AccountsScreen.hs @@ -6,6 +6,7 @@ module Hledger.UI.AccountsScreen (screen ,initAccountsScreen + ,asSetSelectedAccount ) where @@ -32,7 +33,7 @@ import Hledger.UI.UIOptions -- import Hledger.UI.Theme import Hledger.UI.UITypes import Hledger.UI.UIUtils -import qualified Hledger.UI.RegisterScreen as RS (screen) +import qualified Hledger.UI.RegisterScreen as RS (screen, rsSetCurrentAccount) import qualified Hledger.UI.ErrorScreen as ES (screen) screen = AccountsScreen{ @@ -42,6 +43,9 @@ screen = AccountsScreen{ ,sHandleFn = handleAccountsScreen } +asSetSelectedAccount a scr@AccountsScreen{asState=(l,_)} = scr{asState=(l,a)} +asSetSelectedAccount _ scr = scr + initAccountsScreen :: Day -> AppState -> AppState initAccountsScreen d st@AppState{ aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}, @@ -248,7 +252,7 @@ handleAccountsScreen st@AppState{ Vty.EvKey (Vty.KLeft) [] -> continue $ popScreen st' Vty.EvKey (k) [] | k `elem` [Vty.KRight, Vty.KEnter] -> do let - scr = setRegisterScreenCurrentAccount selacct' RS.screen + scr = RS.rsSetCurrentAccount 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 e2c666df3..7983d63ce 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 -> (setRegisterScreenCurrentAccount acct RS.screen, [ascr']) + Just apat -> (rsSetCurrentAccount acct RS.screen, [ascr']) where acct = headDef (error' $ "--register "++apat++" did not match any account") @@ -106,7 +106,7 @@ runBrickUi uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}} j = do AppState{ aopts=uopts' ,ajournal=j - ,aScreen=setAccountsScreenSelectedAccount acct AS.screen + ,aScreen=asSetSelectedAccount acct AS.screen ,aPrevScreens=[] } diff --git a/hledger-ui/Hledger/UI/RegisterScreen.hs b/hledger-ui/Hledger/UI/RegisterScreen.hs index 5c3ddc6fc..26aaa01f1 100644 --- a/hledger-ui/Hledger/UI/RegisterScreen.hs +++ b/hledger-ui/Hledger/UI/RegisterScreen.hs @@ -3,7 +3,9 @@ {-# LANGUAGE OverloadedStrings, FlexibleContexts #-} module Hledger.UI.RegisterScreen - (screen) + (screen + ,rsSetCurrentAccount + ) where import Control.Lens ((^.)) @@ -37,6 +39,9 @@ screen = RegisterScreen{ ,sHandleFn = handleRegisterScreen } +rsSetCurrentAccount a scr@RegisterScreen{rsState=(l,_)} = scr{rsState=(l,a)} +rsSetCurrentAccount _ scr = scr + initRegisterScreen :: Day -> AppState -> AppState initRegisterScreen d st@AppState{aopts=opts, ajournal=j, aScreen=s@RegisterScreen{rsState=(_,acct)}} = st{aScreen=s{rsState=(l,acct)}} diff --git a/hledger-ui/Hledger/UI/UITypes.hs b/hledger-ui/Hledger/UI/UITypes.hs index 0d98e4e7d..ffb8707a3 100644 --- a/hledger-ui/Hledger/UI/UITypes.hs +++ b/hledger-ui/Hledger/UI/UITypes.hs @@ -13,16 +13,17 @@ import Hledger.UI.UIOptions -- | hledger-ui's application state. This is part of, but distinct -- from, brick's App. data AppState = AppState { - aopts :: UIOpts -- ^ command-line options, query, depth etc. currently in effect. - -- ,aargs :: [String] -- ^ command-line arguments at startup - ,ajournal :: Journal -- ^ the parsed journal + aopts :: UIOpts -- ^ the command-line options and query currently in effect + ,ajournal :: Journal -- ^ the journal being viewed ,aScreen :: Screen -- ^ the currently active screen - ,aPrevScreens :: [Screen] -- ^ previously visited screens + ,aPrevScreens :: [Screen] -- ^ previously visited screens, most recent first } deriving (Show) -- | Types of screen available within the app, along with their state. --- Screen types are distinguished by their constructor and by the type --- of their state (which must have unique accessor names). +-- Screen types are distinguished by their constructor and their state +-- field, which must have unique names. +-- +-- This type causes partial functions, so take care. 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); @@ -39,7 +40,7 @@ data Screen = ,sDrawFn :: AppState -> [Widget] } | ErrorScreen { - esState :: String -- ^ error message to display + esState :: String -- ^ error message to display ,sInitFn :: Day -> AppState -> AppState ,sHandleFn :: AppState -> V.Event -> EventM (Next AppState) ,sDrawFn :: AppState -> [Widget] @@ -47,10 +48,3 @@ 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