mirror of
https://github.com/simonmichael/hledger.git
synced 2024-11-07 21:15:19 +03:00
ui: add temporary --status-toggles for testing toggle styles (#564)
This commit is contained in:
parent
4a61f94d9e
commit
59af88b796
@ -16,6 +16,7 @@ module Hledger.Reports.ReportOptions (
|
||||
flat_,
|
||||
tree_,
|
||||
reportOptsToggleStatus,
|
||||
simplifyStatuses,
|
||||
whichDateFromOpts,
|
||||
journalSelectingAmountFromOpts,
|
||||
queryFromOpts,
|
||||
|
@ -109,7 +109,7 @@ asDraw UIState{aopts=UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}
|
||||
,aMode=mode
|
||||
} =
|
||||
case mode of
|
||||
Help -> [helpDialog, maincontent]
|
||||
Help -> [helpDialog copts, maincontent]
|
||||
-- Minibuffer e -> [minibuffer e, maincontent]
|
||||
_ -> [maincontent]
|
||||
where
|
||||
@ -181,7 +181,7 @@ asDraw UIState{aopts=UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}
|
||||
mdepth = depth_ ropts
|
||||
togglefilters =
|
||||
case concat [
|
||||
uiShowStatus $ statuses_ ropts
|
||||
uiShowStatus copts $ statuses_ ropts
|
||||
,if real_ ropts then ["real"] else []
|
||||
] of
|
||||
[] -> str ""
|
||||
|
@ -39,11 +39,11 @@ esInit _ _ ui@UIState{aScreen=ErrorScreen{}} = ui
|
||||
esInit _ _ _ = error "init function called with wrong screen type, should not happen"
|
||||
|
||||
esDraw :: UIState -> [Widget Name]
|
||||
esDraw UIState{ --aopts=UIOpts{cliopts_=copts@CliOpts{}}
|
||||
aScreen=ErrorScreen{..}
|
||||
esDraw UIState{aopts=UIOpts{cliopts_=copts@CliOpts{}}
|
||||
,aScreen=ErrorScreen{..}
|
||||
,aMode=mode} =
|
||||
case mode of
|
||||
Help -> [helpDialog, maincontent]
|
||||
Help -> [helpDialog copts, maincontent]
|
||||
-- Minibuffer e -> [minibuffer e, maincontent]
|
||||
_ -> [maincontent]
|
||||
where
|
||||
|
@ -108,7 +108,7 @@ rsDraw UIState{aopts=UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}
|
||||
,aMode=mode
|
||||
} =
|
||||
case mode of
|
||||
Help -> [helpDialog, maincontent]
|
||||
Help -> [helpDialog copts, maincontent]
|
||||
-- Minibuffer e -> [minibuffer e, maincontent]
|
||||
_ -> [maincontent]
|
||||
where
|
||||
@ -178,7 +178,7 @@ rsDraw UIState{aopts=UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}
|
||||
where
|
||||
togglefilters =
|
||||
case concat [
|
||||
uiShowStatus $ statuses_ ropts
|
||||
uiShowStatus copts $ statuses_ ropts
|
||||
,if real_ ropts then ["real"] else []
|
||||
,if empty_ ropts then [] else ["nonzero"]
|
||||
] of
|
||||
|
@ -53,7 +53,7 @@ tsDraw UIState{aopts=UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}
|
||||
,tsAccount=acct}
|
||||
,aMode=mode} =
|
||||
case mode of
|
||||
Help -> [helpDialog, maincontent]
|
||||
Help -> [helpDialog copts, maincontent]
|
||||
-- Minibuffer e -> [minibuffer e, maincontent]
|
||||
_ -> [maincontent]
|
||||
where
|
||||
@ -78,7 +78,7 @@ tsDraw UIState{aopts=UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}
|
||||
where
|
||||
togglefilters =
|
||||
case concat [
|
||||
uiShowStatus $ statuses_ ropts
|
||||
uiShowStatus copts $ statuses_ ropts
|
||||
,if real_ ropts then ["real"] else []
|
||||
,if empty_ ropts then [] else ["nonzero"]
|
||||
] of
|
||||
|
@ -39,6 +39,15 @@ uiflags = [
|
||||
-- ,flagReq ["drop"] (\s opts -> Right $ setopt "drop" s opts) "N" "with --flat, omit this many leading account name components"
|
||||
-- ,flagReq ["format"] (\s opts -> Right $ setopt "format" s opts) "FORMATSTR" "use this custom line format"
|
||||
-- ,flagNone ["no-elide"] (\opts -> setboolopt "no-elide" opts) "don't compress empty parent accounts on one line"
|
||||
,flagReq ["status-toggles"] (\s opts -> Right $ setopt "status-toggles" s opts) "N"
|
||||
(intercalate "\n"
|
||||
["choose how status toggles work:"
|
||||
," 1 UPC toggles X/all"
|
||||
," 2 UPC cycles X/not-X/all"
|
||||
," 3 UPC toggles each X"
|
||||
-- ," 4 upc sets X, UPC sets not-X"
|
||||
-- ," 5 upc toggles X, UPC toggles not-X"
|
||||
])
|
||||
]
|
||||
|
||||
--uimode :: Mode [([Char], [Char])]
|
||||
|
@ -20,17 +20,83 @@ import Hledger.UI.UIOptions
|
||||
-- | Toggle between showing only unmarked items or all items.
|
||||
toggleUnmarked :: UIState -> UIState
|
||||
toggleUnmarked ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}} =
|
||||
ui{aopts=uopts{cliopts_=copts{reportopts_=reportOptsToggleStatus Unmarked ropts}}}
|
||||
ui{aopts=uopts{cliopts_=copts{reportopts_=reportOptsToggleStatusSomehow Unmarked copts ropts}}}
|
||||
|
||||
-- | Toggle between showing only pending items or all items.
|
||||
togglePending :: UIState -> UIState
|
||||
togglePending ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}} =
|
||||
ui{aopts=uopts{cliopts_=copts{reportopts_=reportOptsToggleStatus Pending ropts}}}
|
||||
ui{aopts=uopts{cliopts_=copts{reportopts_=reportOptsToggleStatusSomehow Pending copts ropts}}}
|
||||
|
||||
-- | Toggle between showing only cleared items or all items.
|
||||
toggleCleared :: UIState -> UIState
|
||||
toggleCleared ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}} =
|
||||
ui{aopts=uopts{cliopts_=copts{reportopts_=reportOptsToggleStatus Cleared ropts}}}
|
||||
ui{aopts=uopts{cliopts_=copts{reportopts_=reportOptsToggleStatusSomehow Cleared copts ropts}}}
|
||||
|
||||
-- TODO testing different status toggle styles
|
||||
|
||||
-- | Generate zero or more indicators of the status filters currently active,
|
||||
-- which will be shown comma-separated as part of the indicators list.
|
||||
uiShowStatus :: CliOpts -> [Status] -> [String]
|
||||
uiShowStatus copts ss =
|
||||
case style of
|
||||
-- in style 2, instead of "Y, Z" show "not X"
|
||||
Just 2 | length ss == numstatuses-1
|
||||
-> map (("not "++). showstatus) $ sort $ complement ss -- should be just one
|
||||
_ -> map showstatus $ sort ss
|
||||
where
|
||||
numstatuses = length [minBound..maxBound::Status]
|
||||
style = maybeintopt "status-toggles" $ rawopts_ copts
|
||||
showstatus Cleared = "cleared"
|
||||
showstatus Pending = "pending"
|
||||
showstatus Unmarked = "unmarked"
|
||||
|
||||
reportOptsToggleStatusSomehow :: Status -> CliOpts -> ReportOpts -> ReportOpts
|
||||
reportOptsToggleStatusSomehow s copts ropts =
|
||||
case maybeintopt "status-toggles" $ rawopts_ copts of
|
||||
Just 2 -> reportOptsToggleStatus2 s ropts
|
||||
Just 3 -> reportOptsToggleStatus3 s ropts
|
||||
-- Just 4 -> reportOptsToggleStatus4 s ropts
|
||||
-- Just 5 -> reportOptsToggleStatus5 s ropts
|
||||
_ -> reportOptsToggleStatus1 s ropts
|
||||
|
||||
-- 1 UPC toggles only X/all
|
||||
reportOptsToggleStatus1 s ropts@ReportOpts{statuses_=ss}
|
||||
| ss == [s] = ropts{statuses_=[]}
|
||||
| otherwise = ropts{statuses_=[s]}
|
||||
|
||||
-- 2 UPC cycles X/not-X/all
|
||||
-- repeatedly pressing X cycles:
|
||||
-- [] U [u]
|
||||
-- [u] U [pc]
|
||||
-- [pc] U []
|
||||
-- pressing Y after first or second step starts new cycle:
|
||||
-- [u] P [p]
|
||||
-- [pc] P [p]
|
||||
reportOptsToggleStatus2 s ropts@ReportOpts{statuses_=ss}
|
||||
| ss == [s] = ropts{statuses_=complement [s]}
|
||||
| ss == complement [s] = ropts{statuses_=[]}
|
||||
| otherwise = ropts{statuses_=[s]} -- XXX assume only three values
|
||||
|
||||
-- 3 UPC toggles each X
|
||||
reportOptsToggleStatus3 s ropts@ReportOpts{statuses_=ss}
|
||||
| s `elem` ss = ropts{statuses_=filter (/= s) ss}
|
||||
| otherwise = ropts{statuses_=simplifyStatuses (s:ss)}
|
||||
|
||||
-- 4 upc sets X, UPC sets not-X
|
||||
--reportOptsToggleStatus4 s ropts@ReportOpts{statuses_=ss}
|
||||
-- | s `elem` ss = ropts{statuses_=filter (/= s) ss}
|
||||
-- | otherwise = ropts{statuses_=simplifyStatuses (s:ss)}
|
||||
--
|
||||
-- 5 upc toggles X, UPC toggles not-X
|
||||
--reportOptsToggleStatus5 s ropts@ReportOpts{statuses_=ss}
|
||||
-- | s `elem` ss = ropts{statuses_=filter (/= s) ss}
|
||||
-- | otherwise = ropts{statuses_=simplifyStatuses (s:ss)}
|
||||
|
||||
-- | Given a list of unique enum values, list the other possible values of that enum.
|
||||
complement :: (Bounded a, Enum a, Eq a) => [a] -> [a]
|
||||
complement = ([minBound..maxBound] \\)
|
||||
|
||||
--
|
||||
|
||||
-- | Toggle between showing all and showing only nonempty (more precisely, nonzero) items.
|
||||
toggleEmpty :: UIState -> UIState
|
||||
|
@ -12,12 +12,14 @@ import Brick.Widgets.Border.Style
|
||||
import Brick.Widgets.Dialog
|
||||
import Brick.Widgets.Edit
|
||||
import Data.List
|
||||
import Data.Maybe
|
||||
import Data.Monoid
|
||||
import Graphics.Vty (Event(..),Key(..),Color,Attr,currentAttr)
|
||||
import Lens.Micro.Platform
|
||||
import System.Process
|
||||
|
||||
import Hledger hiding (Color)
|
||||
import Hledger.Cli (CliOpts(rawopts_))
|
||||
import Hledger.UI.UITypes
|
||||
import Hledger.UI.UIState
|
||||
|
||||
@ -28,15 +30,9 @@ runHelp = runCommand "hledger-ui --help | less" >>= waitForProcess
|
||||
|
||||
-- ui
|
||||
|
||||
uiShowStatus = map showstatus . sort
|
||||
where
|
||||
showstatus Cleared = "cleared"
|
||||
showstatus Pending = "pending"
|
||||
showstatus Unmarked = "unmarked"
|
||||
|
||||
-- | Draw the help dialog, called when help mode is active.
|
||||
helpDialog :: Widget Name
|
||||
helpDialog =
|
||||
helpDialog :: CliOpts -> Widget Name
|
||||
helpDialog copts =
|
||||
Widget Fixed Fixed $ do
|
||||
c <- getContext
|
||||
render $
|
||||
@ -76,9 +72,21 @@ helpDialog =
|
||||
,renderKey ("t", "set report period to today")
|
||||
,str " "
|
||||
,renderKey ("/", "set a filter query")
|
||||
,renderKey ("U", "toggle unmarked filter")
|
||||
,renderKey ("P", "toggle pending filter")
|
||||
,renderKey ("C", "toggle cleared filter")
|
||||
,renderKey ("U",
|
||||
["toggle unmarked/all"
|
||||
,"cycle unmarked/not unmarked/all"
|
||||
,"toggle unmarked filter"
|
||||
] !! (statusstyle-1))
|
||||
,renderKey ("P",
|
||||
["toggle pending/all"
|
||||
,"cycle pending/not pending/all"
|
||||
,"toggle pending filter"
|
||||
] !! (statusstyle-1))
|
||||
,renderKey ("C",
|
||||
["toggle cleared/all"
|
||||
,"cycle cleared/not cleared/all"
|
||||
,"toggle cleared filter"
|
||||
] !! (statusstyle-1))
|
||||
,renderKey ("R", "toggle real/all")
|
||||
,renderKey ("Z", "toggle nonzero/all")
|
||||
,renderKey ("DEL/BS", "remove filters")
|
||||
@ -109,6 +117,7 @@ helpDialog =
|
||||
]
|
||||
where
|
||||
renderKey (key,desc) = withAttr (borderAttr <> "keys") (str key) <+> str " " <+> str desc
|
||||
statusstyle = min 3 $ fromMaybe 1 $ maybeintopt "status-toggles" $ rawopts_ copts
|
||||
|
||||
-- | Event handler used when help mode is active.
|
||||
helpHandle :: UIState -> BrickEvent Name AppEvent -> EventM Name (Next UIState)
|
||||
|
Loading…
Reference in New Issue
Block a user