ui: display depth and other filters independently
As the comment says:
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 (and controlled) independently.
This commit is contained in:
parent
5fa06453f1
commit
cc0c981d29
@ -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))
|
||||
|
||||
@ -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}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user