ui: d cycles report duration, n/p steps to next/prev period (#381)

This commit is contained in:
Simon Michael 2016-08-02 08:22:21 -07:00
parent 0cb5703ad1
commit 3c724efe4f
5 changed files with 53 additions and 3 deletions

View File

@ -155,6 +155,7 @@ asDraw UIState{aopts=UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}
<+> withAttr (borderAttr <> "query") (str (if flat_ ropts then " (flat)" else "")) <+> withAttr (borderAttr <> "query") (str (if flat_ ropts then " (flat)" else ""))
<+> borderQueryStr querystr <+> borderQueryStr querystr
<+> togglefilters <+> togglefilters
<+> borderPeriodStr (period_ ropts)
<+> borderDepthStr mdepth <+> borderDepthStr mdepth
<+> str " (" <+> str " ("
<+> cur <+> cur
@ -288,6 +289,9 @@ asHandle ui0@UIState{
EvKey (KChar '-') [] -> continue $ regenerateScreens j d $ decDepth ui EvKey (KChar '-') [] -> continue $ regenerateScreens j d $ decDepth ui
EvKey (KChar '_') [] -> continue $ regenerateScreens j d $ decDepth ui EvKey (KChar '_') [] -> continue $ regenerateScreens j d $ decDepth ui
EvKey (KChar c) [] | c `elem` ['+','='] -> continue $ regenerateScreens j d $ incDepth ui EvKey (KChar c) [] | c `elem` ['+','='] -> continue $ regenerateScreens j d $ incDepth ui
EvKey (KChar 'd') [] -> continue $ regenerateScreens j d $ cycleReportDuration d ui
EvKey (KChar 'n') [] -> continue $ regenerateScreens j d $ nextReportPeriod ui
EvKey (KChar 'p') [] -> continue $ regenerateScreens j d $ previousReportPeriod ui
EvKey (KChar 'F') [] -> continue $ regenerateScreens j d $ toggleFlat ui EvKey (KChar 'F') [] -> continue $ regenerateScreens j d $ toggleFlat ui
EvKey (KChar 'Z') [] -> scrollTop >> (continue $ regenerateScreens j d $ toggleEmpty ui) EvKey (KChar 'Z') [] -> scrollTop >> (continue $ regenerateScreens j d $ toggleEmpty ui)
EvKey (KChar 'C') [] -> scrollTop >> (continue $ regenerateScreens j d $ toggleCleared ui) EvKey (KChar 'C') [] -> scrollTop >> (continue $ regenerateScreens j d $ toggleCleared ui)

View File

@ -160,11 +160,12 @@ rsDraw UIState{aopts=UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}
where where
toplabel = toplabel =
withAttr ("border" <> "bold") (str $ T.unpack $ replaceHiddenAccountsNameWith "All" rsAccount) withAttr ("border" <> "bold") (str $ T.unpack $ replaceHiddenAccountsNameWith "All" rsAccount)
<+> withAttr (borderAttr <> "query") (str $ if inclusive then "" else " (exclusive)") <+> withAttr (borderAttr <> "query") (str $ if inclusive then "" else " exclusive")
<+> togglefilters <+> togglefilters
<+> str " transactions" <+> str " transactions"
<+> borderQueryStr (query_ ropts) <+> borderQueryStr (query_ ropts)
-- <+> str " and subs" -- <+> str " and subs"
<+> borderPeriodStr (period_ ropts)
<+> str " (" <+> str " ("
<+> cur <+> cur
<+> str "/" <+> str "/"
@ -258,6 +259,9 @@ rsHandle ui@UIState{
EvKey (KChar 'g') [] -> liftIO (uiReloadJournalIfChanged copts d j ui) >>= continue EvKey (KChar 'g') [] -> liftIO (uiReloadJournalIfChanged copts d j ui) >>= continue
EvKey (KChar 'I') [] -> continue $ uiCheckBalanceAssertions d (toggleIgnoreBalanceAssertions ui) EvKey (KChar 'I') [] -> continue $ uiCheckBalanceAssertions d (toggleIgnoreBalanceAssertions ui)
EvKey (KChar 'a') [] -> suspendAndResume $ clearScreen >> setCursorPosition 0 0 >> add copts j >> uiReloadJournalIfChanged copts d j ui EvKey (KChar 'a') [] -> suspendAndResume $ clearScreen >> setCursorPosition 0 0 >> add copts j >> uiReloadJournalIfChanged copts d j ui
EvKey (KChar 'd') [] -> continue $ regenerateScreens j d $ cycleReportDuration d ui
EvKey (KChar 'n') [] -> continue $ regenerateScreens j d $ nextReportPeriod ui
EvKey (KChar 'p') [] -> continue $ regenerateScreens j d $ previousReportPeriod ui
EvKey (KChar 'E') [] -> suspendAndResume $ void (runEditor pos f) >> uiReloadJournalIfChanged copts d j ui EvKey (KChar 'E') [] -> suspendAndResume $ void (runEditor pos f) >> uiReloadJournalIfChanged copts d j ui
where where
(pos,f) = case listSelectedElement rsList of (pos,f) = case listSelectedElement rsList of

View File

@ -68,6 +68,36 @@ toggleIgnoreBalanceAssertions :: UIState -> UIState
toggleIgnoreBalanceAssertions ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{}}} = toggleIgnoreBalanceAssertions ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{}}} =
ui{aopts=uopts{cliopts_=copts{ignore_assertions_=not $ ignore_assertions_ copts}}} ui{aopts=uopts{cliopts_=copts{ignore_assertions_=not $ ignore_assertions_ copts}}}
-- | Cycle through increasingly larger report periods enclosing the current one.
cycleReportDuration :: Day -> UIState -> UIState
cycleReportDuration d ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}} =
ui{aopts=uopts{cliopts_=copts{reportopts_=reportOptsCycleDuration d ropts}}}
-- | Cycle through increasingly larger report periods.
-- Simple periods (a specific day, monday-starting week, month, quarter, year)
-- become the next larger enclosing period.
-- Other periods (between two arbitrary dates, or unbounded on one or both ends)
-- become today.
reportOptsCycleDuration :: Day -> ReportOpts -> ReportOpts
reportOptsCycleDuration d ropts@ReportOpts{period_=p} = ropts{period_=p'}
where
p' = case p of
PeriodAll -> DayPeriod d
PeriodFrom _ -> DayPeriod d
PeriodTo _ -> DayPeriod d
PeriodBetween _ _ -> DayPeriod d
_ -> periodGrow p
-- | Step the report start/end dates to the next period of same duration.
nextReportPeriod :: UIState -> UIState
nextReportPeriod ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts@ReportOpts{period_=p}}}} =
ui{aopts=uopts{cliopts_=copts{reportopts_=ropts{period_=periodNext p}}}}
-- | Step the report start/end dates to the next period of same duration.
previousReportPeriod :: UIState -> UIState
previousReportPeriod ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts@ReportOpts{period_=p}}}} =
ui{aopts=uopts{cliopts_=copts{reportopts_=ropts{period_=periodPrevious p}}}}
-- | Apply a new filter query. -- | Apply a new filter query.
setFilter :: String -> UIState -> UIState setFilter :: String -> UIState -> UIState
setFilter s ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}} = setFilter s ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}} =
@ -82,6 +112,7 @@ resetFilter ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=rop
,clearedstatus_=Nothing ,clearedstatus_=Nothing
,real_=False ,real_=False
,query_="" ,query_=""
,period_=PeriodAll
}}}} }}}}
resetDepth :: UIState -> UIState resetDepth :: UIState -> UIState

View File

@ -127,6 +127,10 @@ borderDepthStr :: Maybe Int -> Widget Name
borderDepthStr Nothing = str "" borderDepthStr Nothing = str ""
borderDepthStr (Just d) = str " to " <+> withAttr (borderAttr <> "query") (str $ "depth "++show d) borderDepthStr (Just d) = str " to " <+> withAttr (borderAttr <> "query") (str $ "depth "++show d)
borderPeriodStr :: Period -> Widget Name
borderPeriodStr PeriodAll = str ""
borderPeriodStr p = str " in " <+> withAttr (borderAttr <> "query") (str $ showPeriod p)
borderKeysStr :: [(String,String)] -> Widget Name borderKeysStr :: [(String,String)] -> Widget Name
borderKeysStr keydescs = borderKeysStr keydescs =
hBox $ hBox $

View File

@ -84,10 +84,11 @@ The cursor keys navigate:
`left` returns to the previous screen, `left` returns to the previous screen,
`up`/`down`/`page up`/`page down`/`home`/`end` move up and down through lists. `up`/`down`/`page up`/`page down`/`home`/`end` move up and down through lists.
Vi-style `h`/`j`/`k`/`l` movement keys are also supported. Vi-style `h`/`j`/`k`/`l` movement keys are also supported.
A tip: movement speed is limited by your keyboard repeat rate, (A tip: movement speed is limited by your keyboard repeat rate,
to move faster you may want to adjust that. to move faster you may want to adjust that.
(On a mac, the Karabiner app is one way to do that). On a mac, the Karabiner app is one way to do that.)
On most screens,
`/` lets you set or change the [filter query](/hledger.html#queries), `/` lets you set or change the [filter query](/hledger.html#queries),
which limits the data shown on most screens (in addition to the quick which limits the data shown on most screens (in addition to the quick
filters described below). While editing the query you can use typical filters described below). While editing the query you can use typical
@ -95,6 +96,12 @@ command-line edit keys
([CTRL-a/e/d/k, cursor keys etc.](http://hackage.haskell.org/package/brick-0.7/docs/Brick-Widgets-Edit.html#t:Editor)), ([CTRL-a/e/d/k, cursor keys etc.](http://hackage.haskell.org/package/brick-0.7/docs/Brick-Widgets-Edit.html#t:Editor)),
and `ENTER`to set the new filter or `ESCAPE`to cancel. and `ENTER`to set the new filter or `ESCAPE`to cancel.
`d` cycles through the common report period durations:
day, week, month, quarter, year, and unlimited (the default).
When the report duration is limited in this way, `n` and `p`
step to the next or previous day/week/month/etc.
(To set arbitrary start/end dates, you can use `/` and a `date:` query.)
`BACKSPACE` or `DELETE` clears any filters in effect. `BACKSPACE` or `DELETE` clears any filters in effect.
`ESCAPE` removes any filters currently in effect, and jumps to the top screen. `ESCAPE` removes any filters currently in effect, and jumps to the top screen.