register: auto-size amount columns, like hledger-ui
This commit is contained in:
parent
eb75946e64
commit
7b8c992f5a
@ -81,7 +81,12 @@ postingsReportItemAsCsvRecord (_, _, _, p, b) = [date,desc,acct,amt,bal]
|
|||||||
|
|
||||||
-- | Render a register report as plain text suitable for console output.
|
-- | Render a register report as plain text suitable for console output.
|
||||||
postingsReportAsText :: CliOpts -> PostingsReport -> String
|
postingsReportAsText :: CliOpts -> PostingsReport -> String
|
||||||
postingsReportAsText opts = unlines . map (postingsReportItemAsText opts) . snd
|
postingsReportAsText opts (_,items) = unlines $ map (postingsReportItemAsText opts amtwidth balwidth) items
|
||||||
|
where
|
||||||
|
amtwidth = maximum $ 12 : map (strWidth . showMixedAmount . itemamt) items
|
||||||
|
balwidth = maximum $ 12 : map (strWidth . showMixedAmount . itembal) items
|
||||||
|
itemamt (_,_,_,Posting{pamount=a},_) = a
|
||||||
|
itembal (_,_,_,_,a) = a
|
||||||
|
|
||||||
tests_postingsReportAsText = [
|
tests_postingsReportAsText = [
|
||||||
"postingsReportAsText" ~: do
|
"postingsReportAsText" ~: do
|
||||||
@ -116,9 +121,10 @@ tests_postingsReportAsText = [
|
|||||||
-- has multiple commodities. Does not yet support formatting control
|
-- has multiple commodities. Does not yet support formatting control
|
||||||
-- like balance reports.
|
-- like balance reports.
|
||||||
--
|
--
|
||||||
postingsReportItemAsText :: CliOpts -> PostingsReportItem -> String
|
postingsReportItemAsText :: CliOpts -> Int -> Int -> PostingsReportItem -> String
|
||||||
postingsReportItemAsText opts (mdate, menddate, mdesc, p, b) =
|
postingsReportItemAsText opts preferredamtwidth preferredbalwidth (mdate, menddate, mdesc, p, b) =
|
||||||
-- use elide*Width to be wide-char-aware
|
-- use elide*Width to be wide-char-aware
|
||||||
|
-- trace (show (totalwidth, datewidth, descwidth, acctwidth, amtwidth, balwidth)) $
|
||||||
intercalate "\n" $
|
intercalate "\n" $
|
||||||
[concat [fitString (Just datewidth) (Just datewidth) True True date
|
[concat [fitString (Just datewidth) (Just datewidth) True True date
|
||||||
," "
|
," "
|
||||||
@ -140,15 +146,23 @@ postingsReportItemAsText opts (mdate, menddate, mdesc, p, b) =
|
|||||||
]
|
]
|
||||||
where
|
where
|
||||||
-- calculate widths
|
-- calculate widths
|
||||||
-- XXX should be smarter, eg resize amount columns when needed; cf hledger-ui
|
|
||||||
(totalwidth,mdescwidth) = registerWidthsFromOpts opts
|
(totalwidth,mdescwidth) = registerWidthsFromOpts opts
|
||||||
amtwidth = 12
|
|
||||||
balwidth = 12
|
|
||||||
(datewidth, date) = case (mdate,menddate) of
|
(datewidth, date) = case (mdate,menddate) of
|
||||||
(Just _, Just _) -> (21, showDateSpan (DateSpan mdate menddate))
|
(Just _, Just _) -> (21, showDateSpan (DateSpan mdate menddate))
|
||||||
(Nothing, Just _) -> (21, "")
|
(Nothing, Just _) -> (21, "")
|
||||||
(Just d, Nothing) -> (10, showDate d)
|
(Just d, Nothing) -> (10, showDate d)
|
||||||
_ -> (10, "")
|
_ -> (10, "")
|
||||||
|
(amtwidth, balwidth)
|
||||||
|
| shortfall <= 0 = (preferredamtwidth, preferredbalwidth)
|
||||||
|
| otherwise = (adjustedamtwidth, adjustedbalwidth)
|
||||||
|
where
|
||||||
|
mincolwidth = 2 -- columns always show at least an ellipsis
|
||||||
|
maxamtswidth = max 0 (totalwidth - (datewidth + 1 + mincolwidth + 2 + mincolwidth + 2 + 2))
|
||||||
|
shortfall = (preferredamtwidth + preferredbalwidth) - maxamtswidth
|
||||||
|
amtwidthproportion = fromIntegral preferredamtwidth / fromIntegral (preferredamtwidth + preferredbalwidth)
|
||||||
|
adjustedamtwidth = round $ amtwidthproportion * fromIntegral maxamtswidth
|
||||||
|
adjustedbalwidth = maxamtswidth - adjustedamtwidth
|
||||||
|
|
||||||
remaining = totalwidth - (datewidth + 1 + 2 + amtwidth + 2 + balwidth)
|
remaining = totalwidth - (datewidth + 1 + 2 + amtwidth + 2 + balwidth)
|
||||||
(descwidth, acctwidth)
|
(descwidth, acctwidth)
|
||||||
| hasinterval = (0, remaining - 2)
|
| hasinterval = (0, remaining - 2)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user