penny-lib-0.2.0.0: Penny/Cabin/Colors.hs
module Penny.Cabin.Colors where
import qualified Penny.Lincoln as L
import qualified Penny.Lincoln.Balance as Bal
import qualified Penny.Lincoln.Bits as Bits
import qualified Penny.Cabin.Chunk as C
import qualified Penny.Cabin.Meta as M
-- | The colors for debits and credits. These are used for the entry's
-- amount and for the total amounts that accompany each entry. Here,
-- @even@ and @odd@ refer to the the posting's visible number. @Zero@
-- is for the balance entries whose balance is zero.
data DrCrColors =
DrCrColors { evenDebit :: !C.TextSpec
, evenCredit :: !C.TextSpec
, oddDebit :: !C.TextSpec
, oddCredit :: !C.TextSpec
, evenZero :: !C.TextSpec
, oddZero :: !C.TextSpec }
-- | The colors for all fields other than entries and totals.
data BaseColors =
BaseColors { evenColors :: !C.TextSpec
, oddColors :: !C.TextSpec }
-- | Change a BaseColors to a TextSpec.
colors :: M.VisibleNum -> BaseColors -> C.TextSpec
colors vn b = let n = L.forward . M.unVisibleNum $ vn in
if odd n then oddColors b else evenColors b
-- | Change a DrCrColors to a BaseColors; you can then use 'colors' to
-- change that to a TextSpec.
drCrToBaseColors :: Bits.DrCr -> DrCrColors -> BaseColors
drCrToBaseColors dc col = case dc of
Bits.Debit -> BaseColors (evenDebit col) (oddDebit col)
Bits.Credit -> BaseColors (evenCredit col) (oddCredit col)
-- | Change a DrCrColors to a BaseColors, based on a balance (unlike
-- entries, balances might be zero.)
bottomLineToBaseColors :: DrCrColors -> Bal.BottomLine -> BaseColors
bottomLineToBaseColors col no = case no of
Bal.Zero -> BaseColors (evenZero col) (oddZero col)
Bal.NonZero column -> drCrToBaseColors (Bal.drCr column) col
-- | TextSpec to use when showing the lack of a balance.
noBalanceColors :: M.VisibleNum -> DrCrColors -> C.TextSpec
noBalanceColors vn dc =
if odd . L.forward . M.unVisibleNum $ vn
then oddZero dc
else evenZero dc