diff --git a/hledger-ui/Hledger/UI/AccountsScreen.hs b/hledger-ui/Hledger/UI/AccountsScreen.hs index cfeaa2762..ed078b953 100644 --- a/hledger-ui/Hledger/UI/AccountsScreen.hs +++ b/hledger-ui/Hledger/UI/AccountsScreen.hs @@ -40,40 +40,62 @@ screen = AccountsScreen{ } initAccountsScreen :: Maybe AccountName -> Day -> AppState -> AppState -initAccountsScreen mselacct d st@AppState{aopts=opts, ajournal=j, aScreen=s@AccountsScreen{}} = - st{aScreen=s{asState=is''}} +initAccountsScreen mselacct d st@AppState{ + aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}, + ajournal=j, + aScreen=s@AccountsScreen{} + } = + st{aopts=opts', aScreen=s{asState=l'}} where - is' = list (Name "accounts") (V.fromList items) 1 - -- crazy hacks dept. - -- when we're adjusting depth, mselacct is the account that was selected previously, + l = list (Name "accounts") (V.fromList items) 1 + + -- hacky: when we're adjusting depth, mselacct is the account that was selected previously, -- in which case try and keep the selection near where it was - is'' = case mselacct of - Nothing -> is' + l' = case mselacct of + Nothing -> l Just a -> -- vScrollToBeginning $ viewportScroll "accounts" - maybe is' (flip listMoveTo is') mi + maybe l (flip listMoveTo l) mi where mi = findIndex (\((acct,_,_),_) -> acct==a') items a' = maybe a (flip clipAccountName a) $ depth_ ropts + -- XXX messing around with depth, which is different from other queries + -- In hledger, + -- - reportopts{depth_} indicates --depth options + -- - reportopts{query_} is the query arguments as a string + -- - the report query is based on both of these. + -- For hledger-ui, currently, we move depth: arguments out of reportopts{query_} + -- and into reportopts{depth_}, so that depth and other kinds of filter query + -- can be displayed independently. + opts' = uopts{cliopts_=copts{reportopts_=ropts'}} q = queryFromOpts d ropts - -- query_="cur:\\$"} -- XXX limit to one commodity to ensure one-line items - --{query_=unwords' $ locArgs l} - ropts = (reportopts_ cliopts) + ropts' = ropts { - balancetype_=HistoricalBalance -- XXX balanceReport doesn't respect this yet + -- ensure depth_ also reflects depth: args + depth_=depthfromoptsandargs, + -- remove depth: args from query_ + query_=ltrace "b" $ unwords $ -- as in ReportOptions, with same limitations + [v | (k,v) <- rawopts_ copts, k=="args", not $ "depth" `isPrefixOf` v], + -- XXX balanceReport doesn't respect this yet + balancetype_=HistoricalBalance } - cliopts = cliopts_ opts - convert | value_ ropts = balanceReportValue j valuedate + where + depthfromoptsandargs = case queryDepth q of 99999 -> Nothing + d -> Just d + -- maybe convert balances to market value + convert | value_ ropts' = balanceReportValue j valuedate | otherwise = id where valuedate = fromMaybe d $ queryEndDate False q - (items,_total) = convert $ balanceReport ropts q j + -- run the report + (items,_total) = convert $ balanceReport ropts' q j initAccountsScreen _ _ _ = error "init function called with wrong screen type, should not happen" drawAccountsScreen :: AppState -> [Widget] -drawAccountsScreen st@AppState{aopts=uopts, ajournal=j, aScreen=AccountsScreen{asState=is}} = [ui] +drawAccountsScreen st@AppState{aopts=uopts, ajournal=j, aScreen=AccountsScreen{asState=is}} = + [ui] where toplabel = files <+> str " accounts" @@ -91,6 +113,9 @@ drawAccountsScreen st@AppState{aopts=uopts, ajournal=j, aScreen=AccountsScreen{a f:fs -> (withAttr ("border" <> "bold") $ str $ takeFileName f) <+> str (" (& " ++ show (length fs) ++ " included files)") querystr = query_ $ reportopts_ $ cliopts_ uopts depth = depth_ $ reportopts_ $ cliopts_ uopts + -- ropts = reportopts_ $ cliopts_ uopts + -- q = queryFromOpts d ropts + -- depth = queryDepth q cur = str (case is^.listSelectedL of Nothing -> "-" Just i -> show (i + 1)) diff --git a/hledger-ui/Hledger/UI/RegisterScreen.hs b/hledger-ui/Hledger/UI/RegisterScreen.hs index e59838558..a90bf1272 100644 --- a/hledger-ui/Hledger/UI/RegisterScreen.hs +++ b/hledger-ui/Hledger/UI/RegisterScreen.hs @@ -49,7 +49,7 @@ initRegisterScreen d st@AppState{aopts=opts, ajournal=j, aScreen=s@RegisterScree } -- XXX temp thisacctq = Acct $ accountNameToAccountRegex acct -- includes subs - q = queryFromOpts d ropts + q = filterQuery (not . queryIsDepth) $ queryFromOpts d ropts -- query_="cur:\\$"} -- XXX limit to one commodity to ensure one-line items --{query_=unwords' $ locArgs l} diff --git a/hledger-ui/Hledger/UI/UITypes.hs b/hledger-ui/Hledger/UI/UITypes.hs index a0d2a75ce..5466a10c7 100644 --- a/hledger-ui/Hledger/UI/UITypes.hs +++ b/hledger-ui/Hledger/UI/UITypes.hs @@ -13,7 +13,7 @@ import Hledger.UI.Options -- | hledger-ui's application state. This is part of, but distinct -- from, brick's App. data AppState = AppState { - aopts :: UIOpts -- ^ command-line options at startup + aopts :: UIOpts -- ^ command-line options, query, depth etc. currently in effect. -- ,aargs :: [String] -- ^ command-line arguments at startup ,ajournal :: Journal -- ^ the parsed journal ,aScreen :: Screen -- ^ the currently active screen