mirror of
https://github.com/simonmichael/hledger.git
synced 2024-11-07 21:15:19 +03:00
ui: ESC now restores exactly to initial app state (#1286)
Also resetFilter (DEL/BS key) no longer changes tree/list mode.
This commit is contained in:
parent
bac3028704
commit
7868da2a48
@ -136,7 +136,8 @@ runBrickUi uopts@UIOpts{cliopts_=copts@CliOpts{inputopts_=_iopts,reportopts_=rop
|
||||
ascr' = aScreen $
|
||||
asInit d True
|
||||
UIState{
|
||||
aopts=uopts'
|
||||
astartupopts=uopts'
|
||||
,aopts=uopts'
|
||||
,ajournal=j
|
||||
,aScreen=asSetSelectedAccount acct accountsScreen
|
||||
,aPrevScreens=[]
|
||||
@ -147,7 +148,8 @@ runBrickUi uopts@UIOpts{cliopts_=copts@CliOpts{inputopts_=_iopts,reportopts_=rop
|
||||
(sInit scr) d True $
|
||||
(if change_ uopts' then toggleHistorical else id) -- XXX
|
||||
UIState{
|
||||
aopts=uopts'
|
||||
astartupopts=uopts'
|
||||
,aopts=uopts'
|
||||
,ajournal=j
|
||||
,aScreen=scr
|
||||
,aPrevScreens=prevscrs
|
||||
|
@ -245,18 +245,22 @@ setFilter :: String -> UIState -> UIState
|
||||
setFilter s ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}} =
|
||||
ui{aopts=uopts{cliopts_=copts{reportopts_=ropts{query_=s}}}}
|
||||
|
||||
-- | Clear all filters/flags.
|
||||
-- | Reset some filters & toggles.
|
||||
resetFilter :: UIState -> UIState
|
||||
resetFilter ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}} =
|
||||
ui{aopts=uopts{cliopts_=copts{reportopts_=ropts{
|
||||
accountlistmode_=ALFlat
|
||||
,empty_=True
|
||||
empty_=True
|
||||
,statuses_=[]
|
||||
,real_=False
|
||||
,query_=""
|
||||
--,period_=PeriodAll
|
||||
}}}}
|
||||
|
||||
-- | Reset all options state to exactly what it was at startup
|
||||
-- (preserving any command-line options/arguments).
|
||||
resetOpts :: UIState -> UIState
|
||||
resetOpts ui@UIState{astartupopts} = ui{aopts=astartupopts}
|
||||
|
||||
resetDepth :: UIState -> UIState
|
||||
resetDepth ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}} =
|
||||
ui{aopts=uopts{cliopts_=copts{reportopts_=ropts{depth_=Nothing}}}}
|
||||
@ -345,7 +349,9 @@ popScreen ui = ui
|
||||
|
||||
resetScreens :: Day -> UIState -> UIState
|
||||
resetScreens d ui@UIState{aScreen=s,aPrevScreens=ss} =
|
||||
(sInit topscreen) d True $ resetDepth $ resetReportPeriod $ resetFilter $ closeMinibuffer ui{aScreen=topscreen, aPrevScreens=[]}
|
||||
(sInit topscreen) d True $
|
||||
resetOpts $
|
||||
closeMinibuffer ui{aScreen=topscreen, aPrevScreens=[]}
|
||||
where
|
||||
topscreen = case ss of _:_ -> last ss
|
||||
[] -> s
|
||||
|
@ -54,7 +54,8 @@ import Hledger.UI.UIOptions
|
||||
-- The app can be in one of several modes: normal screen operation,
|
||||
-- showing a help dialog, entering data in the minibuffer etc.
|
||||
data UIState = UIState {
|
||||
aopts :: UIOpts -- ^ the command-line options and query arguments currently in effect
|
||||
astartupopts :: UIOpts -- ^ the command-line options and query arguments specified at startup
|
||||
,aopts :: UIOpts -- ^ the command-line options and query arguments currently in effect
|
||||
,ajournal :: Journal -- ^ the journal being viewed
|
||||
,aPrevScreens :: [Screen] -- ^ previously visited screens, most recent first
|
||||
,aScreen :: Screen -- ^ the currently active screen
|
||||
|
@ -98,11 +98,10 @@ helpDialog _copts =
|
||||
vBox [
|
||||
withAttr ("help" <> "heading") $ str "Navigation"
|
||||
,renderKey ("UP/DOWN/PUP/PDN/HOME/END/k/j/C-p/C-n", "")
|
||||
,str " move selection up/down"
|
||||
,renderKey ("RIGHT/l/C-f", "")
|
||||
,str " show account txns, or txn detail"
|
||||
,str " move selection up/down"
|
||||
,renderKey ("RIGHT/l/C-f", "show txns, or txn detail")
|
||||
,renderKey ("LEFT/h/C-b ", "go back")
|
||||
,renderKey ("ESC ", "cancel or reset")
|
||||
,renderKey ("ESC ", "cancel or reset to initial state")
|
||||
|
||||
,str " "
|
||||
,withAttr ("help" <> "heading") $ str "Accounts screen"
|
||||
@ -168,15 +167,14 @@ helpHandle :: UIState -> BrickEvent Name AppEvent -> EventM Name (Next UIState)
|
||||
helpHandle ui ev = do
|
||||
pagerprog <- liftIO $ fromMaybe "less" <$> lookupEnv "PAGER"
|
||||
case ev of
|
||||
VtyEvent e
|
||||
| e `elem` (moveLeftEvents ++ [EvKey KEsc [], EvKey (KChar '?') [], EvKey (KChar 'q') []])
|
||||
-> continue $ setMode Normal ui
|
||||
VtyEvent e | e `elem` closeHelpEvents -> continue $ setMode Normal ui
|
||||
VtyEvent (EvKey (KChar 'p') []) -> suspendAndResume $ runPagerForTopic pagerprog "hledger-ui" >> return ui'
|
||||
VtyEvent (EvKey (KChar 'm') []) -> suspendAndResume $ runManForTopic "hledger-ui" >> return ui'
|
||||
VtyEvent (EvKey (KChar 'i') []) -> suspendAndResume $ runInfoForTopic "hledger-ui" >> return ui'
|
||||
_ -> continue ui
|
||||
where
|
||||
ui' = setMode Normal ui
|
||||
closeHelpEvents = moveLeftEvents ++ [EvKey KEsc [], EvKey (KChar '?') [], EvKey (KChar 'q') []]
|
||||
|
||||
-- | Draw the minibuffer.
|
||||
minibuffer :: Editor String Name -> Widget Name
|
||||
|
@ -131,8 +131,9 @@ both ordinary transactions recorded in the journal, and periodic
|
||||
transactions generated by rule. `f` toggles forecast mode, in which
|
||||
future/forecasted transactions are shown. *(experimental)*
|
||||
|
||||
`escape` removes all filters and report period limits and jumps back to the top screen.
|
||||
Or, it cancels minibuffer data entry or a help popup.
|
||||
`escape` resets the UI state and jumps back to the top screen,
|
||||
restoring the app's initial state at startup.
|
||||
Or, it cancels minibuffer data entry or the help dialog.
|
||||
|
||||
`ctrl-l` redraws the screen and centers the selection if possible
|
||||
(selections near the top won't be centered, since we don't scroll above the top).
|
||||
|
Loading…
Reference in New Issue
Block a user