mirror of
https://github.com/simonmichael/hledger.git
synced 2024-11-07 21:15:19 +03:00
lib,cli,ui: Introduce showMixed*Unnormalised, eliminate most direct calls of strWidth.
This introduces some new helper functions which are exactly the same as what we had before, but do not call normaliseMixedAmountSquashPricesForDisplay, so that we can use the new functions for displaying Transaction and Posting. It also goes through and gets rid of most uses of the old showMixed* functions which would benefit from using the new interface.
This commit is contained in:
parent
a838366c9d
commit
9de238757b
@ -117,7 +117,9 @@ module Hledger.Data.Amount (
|
||||
showMixedAmountWithZeroCommodity,
|
||||
showMixedAmountWithPrecision,
|
||||
showMixed,
|
||||
showMixedUnnormalised,
|
||||
showMixedOneLine,
|
||||
showMixedOneLineUnnormalised,
|
||||
setMixedAmountPrecision,
|
||||
canonicaliseMixedAmount,
|
||||
-- * misc.
|
||||
@ -659,12 +661,16 @@ showMixedAmountDebug m | m == missingmixedamt = "(missing)"
|
||||
-- width (if given) will be elided. The function also returns the actual
|
||||
-- width of the output string.
|
||||
showMixed :: (Amount -> String) -> Maybe Int -> Maybe Int -> Bool -> MixedAmount -> (String, Int)
|
||||
showMixed showamt mmin mmax c mixed =
|
||||
showMixed showamt mmin mmax c =
|
||||
showMixedUnnormalised showamt mmin mmax c . normaliseMixedAmountSquashPricesForDisplay
|
||||
|
||||
-- | Like showMixed, but does not normalise the MixedAmount before displaying.
|
||||
showMixedUnnormalised :: (Amount -> String) -> Maybe Int -> Maybe Int -> Bool -> MixedAmount -> (String, Int)
|
||||
showMixedUnnormalised showamt mmin mmax c (Mixed as) =
|
||||
(intercalate "\n" $ map finalise elided, width)
|
||||
where
|
||||
width = maximum $ fromMaybe 0 mmin : map adLength elided
|
||||
astrs = amtDisplayList sepwidth showamt as
|
||||
Mixed as = normaliseMixedAmountSquashPricesForDisplay mixed
|
||||
sepwidth = 0 -- "\n" has width 0
|
||||
|
||||
finalise = adString . pad . if c then colourise else id
|
||||
@ -683,12 +689,17 @@ showMixed showamt mmin mmax c mixed =
|
||||
-- as it can in the maximum width (if given), and further Amounts will be
|
||||
-- elided. The function also returns the actual width of the output string.
|
||||
showMixedOneLine :: (Amount -> String) -> Maybe Int -> Maybe Int -> Bool -> MixedAmount -> (String, Int)
|
||||
showMixedOneLine showamt mmin mmax c mixed =
|
||||
showMixedOneLine showamt mmin mmax c =
|
||||
showMixedOneLineUnnormalised showamt mmin mmax c . normaliseMixedAmountSquashPricesForDisplay
|
||||
|
||||
-- | Like showMixedOneLine, but does not normalise the MixedAmount before
|
||||
-- displaying.
|
||||
showMixedOneLineUnnormalised :: (Amount -> String) -> Maybe Int -> Maybe Int -> Bool -> MixedAmount -> (String, Int)
|
||||
showMixedOneLineUnnormalised showamt mmin mmax c (Mixed as) =
|
||||
(pad . intercalate ", " $ map finalise elided, max width $ fromMaybe 0 mmin)
|
||||
where
|
||||
width = maybe 0 adTotal $ lastMay elided
|
||||
astrs = amtDisplayList sepwidth showamt as
|
||||
Mixed as = normaliseMixedAmountSquashPricesForDisplay mixed
|
||||
sepwidth = 2 -- ", " has width 2
|
||||
n = length as
|
||||
|
||||
|
@ -256,11 +256,11 @@ postingAsLines elideamount onelineamounts pstoalignwith p = concat [
|
||||
-- currently prices are considered part of the amount string when right-aligning amounts
|
||||
shownAmounts
|
||||
| elideamount = [""]
|
||||
| onelineamounts = [fitString (Just amtwidth) Nothing False False $ showMixedAmountOneLine $ pamount p]
|
||||
| onelineamounts = [fst . showMixedOneLineUnnormalised showAmount (Just amtwidth) Nothing False $ pamount p]
|
||||
| null (amounts $ pamount p) = [""]
|
||||
| otherwise = map (fitStringMulti (Just amtwidth) Nothing False False . showAmount ) . amounts $ pamount p
|
||||
| otherwise = lines . fst . showMixedUnnormalised showAmount (Just amtwidth) Nothing False $ pamount p
|
||||
where
|
||||
amtwidth = maximum $ 12 : map (strWidth . showMixedAmount . pamount) pstoalignwith -- min. 12 for backwards compatibility
|
||||
amtwidth = maximum $ map (snd . showMixed showAmount (Just 12) Nothing False . pamount) pstoalignwith -- min. 12 for backwards compatibility
|
||||
|
||||
(samelinecomment, newlinecomments) =
|
||||
case renderCommentLines (pcomment p) of [] -> ("",[])
|
||||
|
@ -93,8 +93,8 @@ rsInit d reset ui@UIState{aopts=_uopts@UIOpts{cliopts_=CliOpts{reportspec_=rspec
|
||||
[s] -> s
|
||||
ss -> intercalate ", " ss
|
||||
-- _ -> "<split>" -- should do this if accounts field width < 30
|
||||
,rsItemChangeAmount = showMixedAmountElided 22 False change
|
||||
,rsItemBalanceAmount = showMixedAmountElided 22 False bal
|
||||
,rsItemChangeAmount = showMixed showAmountWithoutPrice Nothing (Just 22) False change
|
||||
,rsItemBalanceAmount = showMixed showAmountWithoutPrice Nothing (Just 22) False bal
|
||||
,rsItemTransaction = t
|
||||
}
|
||||
-- blank items are added to allow more control of scroll position; we won't allow movement over these
|
||||
@ -103,8 +103,8 @@ rsInit d reset ui@UIState{aopts=_uopts@UIOpts{cliopts_=CliOpts{reportspec_=rspec
|
||||
,rsItemStatus = Unmarked
|
||||
,rsItemDescription = ""
|
||||
,rsItemOtherAccounts = ""
|
||||
,rsItemChangeAmount = ""
|
||||
,rsItemBalanceAmount = ""
|
||||
,rsItemChangeAmount = ("", 0)
|
||||
,rsItemBalanceAmount = ("", 0)
|
||||
,rsItemTransaction = nulltransaction
|
||||
}
|
||||
-- build the List
|
||||
@ -162,8 +162,8 @@ rsDraw UIState{aopts=_uopts@UIOpts{cliopts_=copts@CliOpts{reportspec_=rspec}}
|
||||
whitespacewidth = 10 -- inter-column whitespace, fixed width
|
||||
minnonamtcolswidth = datewidth + 1 + 2 + 2 -- date column plus at least 1 for status and 2 for desc and accts
|
||||
maxamtswidth = max 0 (totalwidth - minnonamtcolswidth - whitespacewidth)
|
||||
maxchangewidthseen = maximum' $ map (strWidth . rsItemChangeAmount) displayitems
|
||||
maxbalwidthseen = maximum' $ map (strWidth . rsItemBalanceAmount) displayitems
|
||||
maxchangewidthseen = maximum' $ map (snd . rsItemChangeAmount) displayitems
|
||||
maxbalwidthseen = maximum' $ map (snd . rsItemBalanceAmount) displayitems
|
||||
changewidthproportion = fromIntegral maxchangewidthseen / fromIntegral (maxchangewidthseen + maxbalwidthseen)
|
||||
maxchangewidth = round $ changewidthproportion * fromIntegral maxamtswidth
|
||||
maxbalwidth = maxamtswidth - maxchangewidth
|
||||
@ -261,13 +261,13 @@ rsDrawItem (datewidth,descwidth,acctswidth,changewidth,balwidth) selected Regist
|
||||
str " " <+>
|
||||
str (fitString (Just acctswidth) (Just acctswidth) True True rsItemOtherAccounts) <+>
|
||||
str " " <+>
|
||||
withAttr changeattr (str (fitString (Just changewidth) (Just changewidth) True False rsItemChangeAmount)) <+>
|
||||
withAttr changeattr (str (fitString (Just changewidth) (Just changewidth) True False $ fst rsItemChangeAmount)) <+>
|
||||
str " " <+>
|
||||
withAttr balattr (str (fitString (Just balwidth) (Just balwidth) True False rsItemBalanceAmount))
|
||||
withAttr balattr (str (fitString (Just balwidth) (Just balwidth) True False $ fst rsItemBalanceAmount))
|
||||
where
|
||||
changeattr | '-' `elem` rsItemChangeAmount = sel $ "list" <> "amount" <> "decrease"
|
||||
changeattr | '-' `elem` fst rsItemChangeAmount = sel $ "list" <> "amount" <> "decrease"
|
||||
| otherwise = sel $ "list" <> "amount" <> "increase"
|
||||
balattr | '-' `elem` rsItemBalanceAmount = sel $ "list" <> "balance" <> "negative"
|
||||
balattr | '-' `elem` fst rsItemBalanceAmount = sel $ "list" <> "balance" <> "negative"
|
||||
| otherwise = sel $ "list" <> "balance" <> "positive"
|
||||
sel | selected = (<> "selected")
|
||||
| otherwise = id
|
||||
|
@ -146,8 +146,8 @@ data RegisterScreenItem = RegisterScreenItem {
|
||||
,rsItemStatus :: Status -- ^ transaction status
|
||||
,rsItemDescription :: String -- ^ description
|
||||
,rsItemOtherAccounts :: String -- ^ other accounts
|
||||
,rsItemChangeAmount :: String -- ^ the change to the current account from this transaction
|
||||
,rsItemBalanceAmount :: String -- ^ the balance or running total after this transaction
|
||||
,rsItemChangeAmount :: (String, Int) -- ^ the change to the current account from this transaction
|
||||
,rsItemBalanceAmount :: (String, Int) -- ^ the balance or running total after this transaction
|
||||
,rsItemTransaction :: Transaction -- ^ the full transaction
|
||||
}
|
||||
deriving (Show)
|
||||
|
@ -147,11 +147,10 @@ accountTransactionsReportAsText
|
||||
= unlines $ title :
|
||||
map (accountTransactionsReportItemAsText copts reportq thisacctq amtwidth balwidth) items
|
||||
where
|
||||
amtwidth = maximumStrict $ 12 : map (strWidth . showamt . itemamt) items
|
||||
balwidth = maximumStrict $ 12 : map (strWidth . showamt . itembal) items
|
||||
showamt
|
||||
| no_elide_ = showMixedAmountOneLineWithoutPrice False -- color_
|
||||
| otherwise = showMixedAmountElided 22 False
|
||||
amtwidth = maximumStrict $ 12 : map (snd . showamt . itemamt) items
|
||||
balwidth = maximumStrict $ 12 : map (snd . showamt . itembal) items
|
||||
showamt = showMixedOneLine showAmountWithoutPrice (Just 12) mmax False -- color_
|
||||
where mmax = if no_elide_ then Nothing else Just 22
|
||||
itemamt (_,_,_,_,a,_) = a
|
||||
itembal (_,_,_,_,_,a) = a
|
||||
-- show a title indicating which account was picked, which can be confusing otherwise
|
||||
@ -176,7 +175,7 @@ accountTransactionsReportAsText
|
||||
--
|
||||
accountTransactionsReportItemAsText :: CliOpts -> Query -> Query -> Int -> Int -> AccountTransactionsReportItem -> String
|
||||
accountTransactionsReportItemAsText
|
||||
copts@CliOpts{reportspec_=ReportSpec{rsOpts=ReportOpts{color_,no_elide_}}}
|
||||
copts@CliOpts{reportspec_=ReportSpec{rsOpts=ReportOpts{color_}}}
|
||||
reportq thisacctq preferredamtwidth preferredbalwidth
|
||||
(t@Transaction{tdescription}, _, _issplit, otheracctsstr, change, balance)
|
||||
-- Transaction -- the transaction, unmodified
|
||||
@ -193,15 +192,15 @@ accountTransactionsReportItemAsText
|
||||
," "
|
||||
,fitString (Just acctwidth) (Just acctwidth) True True accts
|
||||
," "
|
||||
,fitString (Just amtwidth) (Just amtwidth) True False amtfirstline
|
||||
,amtfirstline
|
||||
," "
|
||||
,fitString (Just balwidth) (Just balwidth) True False balfirstline
|
||||
,balfirstline
|
||||
]
|
||||
:
|
||||
[concat [spacer
|
||||
,fitString (Just amtwidth) (Just amtwidth) True False a
|
||||
,a
|
||||
," "
|
||||
,fitString (Just balwidth) (Just balwidth) True False b
|
||||
,b
|
||||
]
|
||||
| (a,b) <- zip amtrest balrest
|
||||
]
|
||||
@ -229,19 +228,16 @@ accountTransactionsReportItemAsText
|
||||
desc = T.unpack tdescription
|
||||
accts = -- T.unpack $ elideAccountName acctwidth $ T.pack
|
||||
otheracctsstr
|
||||
showamt
|
||||
| no_elide_ = showMixedAmountOneLineWithoutPrice color_
|
||||
| otherwise = showMixedAmountElided 22 color_
|
||||
amt = showamt change
|
||||
bal = showamt balance
|
||||
amt = fst $ showMixed showAmountWithoutPrice (Just amtwidth) (Just balwidth) color_ change
|
||||
bal = fst $ showMixed showAmountWithoutPrice (Just balwidth) (Just balwidth) color_ balance
|
||||
-- alternate behaviour, show null amounts as 0 instead of blank
|
||||
-- amt = if null amt' then "0" else amt'
|
||||
-- bal = if null bal' then "0" else bal'
|
||||
(amtlines, ballines) = (lines amt, lines bal)
|
||||
(amtlen, ballen) = (length amtlines, length ballines)
|
||||
numlines = max 1 (max amtlen ballen)
|
||||
(amtfirstline:amtrest) = take numlines $ amtlines ++ repeat "" -- posting amount is top-aligned
|
||||
(balfirstline:balrest) = take numlines $ replicate (numlines - ballen) "" ++ ballines -- balance amount is bottom-aligned
|
||||
(amtfirstline:amtrest) = take numlines $ amtlines ++ repeat (replicate amtwidth ' ') -- posting amount is top-aligned
|
||||
(balfirstline:balrest) = take numlines $ replicate (numlines - ballen) (replicate balwidth ' ') ++ ballines -- balance amount is bottom-aligned
|
||||
spacer = replicate (totalwidth - (amtwidth + 2 + balwidth)) ' '
|
||||
|
||||
-- tests
|
||||
|
@ -207,10 +207,10 @@ $ hledger -f- close -p 2016 assets liabilities --show-costs -x
|
||||
liabilities:employer $5,000.00 @ 0.93 EUR
|
||||
liabilities:employer $5,000.00 @ 0.95 EUR = $0.00
|
||||
liabilities:employer -1.00 EUR = 0.00 EUR
|
||||
equity:opening/closing balances $10,000.00
|
||||
equity:opening/closing balances $10,000.00
|
||||
equity:opening/closing balances $-5,000.00 @ 0.93 EUR
|
||||
equity:opening/closing balances $-5,000.00 @ 0.95 EUR
|
||||
equity:opening/closing balances 5,734.00 EUR
|
||||
equity:opening/closing balances 5,734.00 EUR
|
||||
|
||||
2017-01-01 opening balances
|
||||
assets:bank 5,733.00 EUR = 5,733.00 EUR
|
||||
@ -274,9 +274,9 @@ $ hledger -f- close -p 2019 assets --show-costs -x
|
||||
assets:aaa AAA -510.00000000 = AAA 0.00000000
|
||||
assets:usd $-49.50
|
||||
assets:usd $49.390001 @ AAA 10.3528242505 = $0.00
|
||||
equity:opening/closing balances $49.50
|
||||
equity:opening/closing balances $49.50
|
||||
equity:opening/closing balances $-49.390001 @ AAA 10.3528242505
|
||||
equity:opening/closing balances AAA 510.00000000
|
||||
equity:opening/closing balances AAA 510.00000000
|
||||
|
||||
2020-01-01 opening balances
|
||||
assets:aaa AAA 510.00000000 = AAA 510.00000000
|
||||
|
@ -408,15 +408,15 @@ account1 assets
|
||||
account2 income
|
||||
$ ./csvtest.sh
|
||||
2018-10-15 Assets Update
|
||||
assets = EUR 100
|
||||
assets = EUR 100
|
||||
income
|
||||
|
||||
2018-10-16 Assets Update
|
||||
assets = EUR 200
|
||||
assets = EUR 200
|
||||
income
|
||||
|
||||
2018-10-17 Assets Update
|
||||
assets = EUR 300
|
||||
assets = EUR 300
|
||||
income
|
||||
|
||||
>=0
|
||||
|
@ -21,7 +21,7 @@ hledger -f - print
|
||||
>>>
|
||||
2000-01-01 transaction 1
|
||||
㐀 㐃㐃1 @ 2 㐂㐂㐂㐂㐂㐂㐂㐂㐂㐂㐂
|
||||
㐀:㐁 ; 㐃㐃-1
|
||||
㐀:㐁 ; 㐃㐃-1
|
||||
|
||||
2000-01-02 transaction 2
|
||||
㐀:㐁:㐂 USD 1
|
||||
|
@ -64,7 +64,7 @@ hledger -f - print
|
||||
equity
|
||||
>>>
|
||||
2017-01-01
|
||||
assets = $100
|
||||
assets = $100
|
||||
equity
|
||||
|
||||
>>>2
|
||||
|
@ -42,7 +42,7 @@ hledger rewrite -f- expenses:gifts --add-posting '(budget:gifts) *-1'
|
||||
|
||||
2016-01-01 gift ; modified:
|
||||
assets:cash $-15
|
||||
expenses:gifts ; [1/2]
|
||||
expenses:gifts ; [1/2]
|
||||
(budget:gifts) $-15 ; [2016-01-02], generated-posting: = expenses:gifts
|
||||
|
||||
>>>2
|
||||
@ -107,17 +107,17 @@ hledger rewrite -f- -B
|
||||
2017-04-24 * 09:00-09:25 ; modified:
|
||||
(assets:unbilled:client1) 0.42h
|
||||
assets:to bill:client1 $42.00 ; generated-posting: = ^assets:unbilled:client1
|
||||
income:consulting:client1 ; generated-posting: = ^assets:unbilled:client1
|
||||
income:consulting:client1 ; generated-posting: = ^assets:unbilled:client1
|
||||
|
||||
2017-04-25 * 10:00-11:15 ; modified:
|
||||
(assets:unbilled:client1) 1.25h
|
||||
assets:to bill:client1 $125.00 ; generated-posting: = ^assets:unbilled:client1
|
||||
income:consulting:client1 ; generated-posting: = ^assets:unbilled:client1
|
||||
income:consulting:client1 ; generated-posting: = ^assets:unbilled:client1
|
||||
|
||||
2017-04-25 * 14:00-15:32 ; modified:
|
||||
(assets:unbilled:client2) 1.54h
|
||||
assets:to bill:client2 $231.00 ; generated-posting: = ^assets:unbilled:client2
|
||||
income:consulting:client2 ; generated-posting: = ^assets:unbilled:client2
|
||||
income:consulting:client2 ; generated-posting: = ^assets:unbilled:client2
|
||||
|
||||
>>>2
|
||||
>>>=0
|
||||
|
Loading…
Reference in New Issue
Block a user