ui: pressing g once now reloads all screens
This commit is contained in:
parent
b527209e9f
commit
2515025a84
@ -208,7 +208,11 @@ handleAccountsScreen st@AppState{
|
|||||||
acct = case listSelectedElement l of
|
acct = case listSelectedElement l of
|
||||||
Just (_, (_, fullacct, _, _)) -> fullacct
|
Just (_, (_, fullacct, _, _)) -> fullacct
|
||||||
Nothing -> ""
|
Nothing -> ""
|
||||||
reload = continue . initAccountsScreen (Just acct) d
|
|
||||||
|
-- Customize reload to preserve the account selection while reloading.
|
||||||
|
-- XXX reloads only the current screen, not previous ones - ok for now as accounts screen is always the first
|
||||||
|
-- XXX won't have any effect when this screen is reloaded by a deeper screen's reload - should move selected acct into state
|
||||||
|
reload' = initAccountsScreen (Just acct)
|
||||||
|
|
||||||
case e of
|
case e of
|
||||||
Vty.EvKey Vty.KEsc [] -> halt st
|
Vty.EvKey Vty.KEsc [] -> halt st
|
||||||
@ -218,7 +222,7 @@ handleAccountsScreen st@AppState{
|
|||||||
Vty.EvKey (Vty.KChar 'g') [] -> do
|
Vty.EvKey (Vty.KChar 'g') [] -> do
|
||||||
ej <- liftIO $ journalReload j
|
ej <- liftIO $ journalReload j
|
||||||
case ej of
|
case ej of
|
||||||
Right j' -> reload st{ajournal=j'}
|
Right j' -> continue $ reload j' d st
|
||||||
Left err -> continue $ screenEnter d ES.screen{esState=err} st
|
Left err -> continue $ screenEnter d ES.screen{esState=err} st
|
||||||
-- (ej, changed) <- liftIO $ journalReloadIfChanged copts j
|
-- (ej, changed) <- liftIO $ journalReloadIfChanged copts j
|
||||||
-- case (changed, ej) of
|
-- case (changed, ej) of
|
||||||
@ -226,20 +230,20 @@ handleAccountsScreen st@AppState{
|
|||||||
-- -- (True, Left err) -> continue st{amsg=err} -- XXX report parse error
|
-- -- (True, Left err) -> continue st{amsg=err} -- XXX report parse error
|
||||||
-- _ -> continue st
|
-- _ -> continue st
|
||||||
|
|
||||||
Vty.EvKey (Vty.KChar '-') [] -> reload $ decDepth st
|
Vty.EvKey (Vty.KChar '-') [] -> continue $ reload' d $ decDepth st
|
||||||
Vty.EvKey (Vty.KChar '+') [] -> reload $ incDepth st
|
Vty.EvKey (Vty.KChar '+') [] -> continue $ reload' d $ incDepth st
|
||||||
Vty.EvKey (Vty.KChar '=') [] -> reload $ incDepth st
|
Vty.EvKey (Vty.KChar '=') [] -> continue $ reload' d $ incDepth st
|
||||||
Vty.EvKey (Vty.KChar '1') [] -> reload $ setDepth 1 st
|
Vty.EvKey (Vty.KChar '1') [] -> continue $ reload' d $ setDepth 1 st
|
||||||
Vty.EvKey (Vty.KChar '2') [] -> reload $ setDepth 2 st
|
Vty.EvKey (Vty.KChar '2') [] -> continue $ reload' d $ setDepth 2 st
|
||||||
Vty.EvKey (Vty.KChar '3') [] -> reload $ setDepth 3 st
|
Vty.EvKey (Vty.KChar '3') [] -> continue $ reload' d $ setDepth 3 st
|
||||||
Vty.EvKey (Vty.KChar '4') [] -> reload $ setDepth 4 st
|
Vty.EvKey (Vty.KChar '4') [] -> continue $ reload' d $ setDepth 4 st
|
||||||
Vty.EvKey (Vty.KChar '5') [] -> reload $ setDepth 5 st
|
Vty.EvKey (Vty.KChar '5') [] -> continue $ reload' d $ setDepth 5 st
|
||||||
Vty.EvKey (Vty.KChar '6') [] -> reload $ setDepth 6 st
|
Vty.EvKey (Vty.KChar '6') [] -> continue $ reload' d $ setDepth 6 st
|
||||||
Vty.EvKey (Vty.KChar '7') [] -> reload $ setDepth 7 st
|
Vty.EvKey (Vty.KChar '7') [] -> continue $ reload' d $ setDepth 7 st
|
||||||
Vty.EvKey (Vty.KChar '8') [] -> reload $ setDepth 8 st
|
Vty.EvKey (Vty.KChar '8') [] -> continue $ reload' d $ setDepth 8 st
|
||||||
Vty.EvKey (Vty.KChar '9') [] -> reload $ setDepth 9 st
|
Vty.EvKey (Vty.KChar '9') [] -> continue $ reload' d $ setDepth 9 st
|
||||||
Vty.EvKey (Vty.KChar '0') [] -> reload $ setDepth 0 st
|
Vty.EvKey (Vty.KChar '0') [] -> continue $ reload' d $ setDepth 0 st
|
||||||
Vty.EvKey (Vty.KChar 'f') [] -> reload $ st'
|
Vty.EvKey (Vty.KChar 'f') [] -> continue $ reload' d $ st'
|
||||||
where
|
where
|
||||||
st' = st{
|
st' = st{
|
||||||
aopts=(aopts st){
|
aopts=(aopts st){
|
||||||
|
|||||||
@ -103,24 +103,16 @@ handleErrorScreen st@AppState{
|
|||||||
,aopts=UIOpts{cliopts_=_copts}
|
,aopts=UIOpts{cliopts_=_copts}
|
||||||
,ajournal=j
|
,ajournal=j
|
||||||
} e = do
|
} e = do
|
||||||
-- d <- liftIO getCurrentDay
|
|
||||||
-- let
|
|
||||||
-- reload = continue . initErrorScreen d
|
|
||||||
case e of
|
case e of
|
||||||
Vty.EvKey Vty.KEsc [] -> halt st
|
Vty.EvKey Vty.KEsc [] -> halt st
|
||||||
Vty.EvKey (Vty.KChar 'q') [] -> halt st
|
Vty.EvKey (Vty.KChar 'q') [] -> halt st
|
||||||
|
|
||||||
Vty.EvKey (Vty.KChar 'g') [] -> do
|
Vty.EvKey (Vty.KChar 'g') [] -> do
|
||||||
ej <- liftIO $ journalReload j
|
d <- liftIO getCurrentDay
|
||||||
|
ej <- liftIO $ journalReload j -- (ej, changed) <- liftIO $ journalReloadIfChanged copts j
|
||||||
case ej of
|
case ej of
|
||||||
Left err -> continue st{aScreen=s{esState=err}} -- show latest parse error
|
Left err -> continue st{aScreen=s{esState=err}} -- show latest parse error
|
||||||
Right _j' -> continue $ popScreen st -- return to previous screen. XXX should reload it too
|
Right j' -> continue $ reload j' d $ popScreen st -- return to previous screen, and reload it
|
||||||
|
|
||||||
-- (ej, changed) <- liftIO $ journalReloadIfChanged copts j
|
|
||||||
-- case (changed, ej) of
|
|
||||||
-- (True, Right j') -> reload st{ajournal=j'}
|
|
||||||
-- -- (True, Left err) -> continue st{amsg=err} -- XXX report parse error
|
|
||||||
-- _ -> continue st
|
|
||||||
|
|
||||||
-- Vty.EvKey (Vty.KLeft) [] -> continue $ popScreen st
|
-- Vty.EvKey (Vty.KLeft) [] -> continue $ popScreen st
|
||||||
-- Vty.EvKey (Vty.KRight) [] -> error (show curItem) where curItem = listSelectedElement is
|
-- Vty.EvKey (Vty.KRight) [] -> error (show curItem) where curItem = listSelectedElement is
|
||||||
|
|||||||
@ -185,26 +185,19 @@ drawRegisterItem (datewidth,descwidth,acctswidth,changewidth,balwidth) selected
|
|||||||
handleRegisterScreen :: AppState -> Vty.Event -> EventM (Next AppState)
|
handleRegisterScreen :: AppState -> Vty.Event -> EventM (Next AppState)
|
||||||
handleRegisterScreen st@AppState{
|
handleRegisterScreen st@AppState{
|
||||||
aScreen=s@RegisterScreen{rsState=is}
|
aScreen=s@RegisterScreen{rsState=is}
|
||||||
,aopts=UIOpts{cliopts_=copts}
|
,aopts=UIOpts{cliopts_=_copts}
|
||||||
,ajournal=j
|
,ajournal=j
|
||||||
} e = do
|
} e = do
|
||||||
d <- liftIO getCurrentDay
|
|
||||||
let
|
|
||||||
reload = continue . initRegisterScreen d
|
|
||||||
case e of
|
case e of
|
||||||
Vty.EvKey Vty.KEsc [] -> halt st
|
Vty.EvKey Vty.KEsc [] -> halt st
|
||||||
Vty.EvKey (Vty.KChar 'q') [] -> halt st
|
Vty.EvKey (Vty.KChar 'q') [] -> halt st
|
||||||
|
|
||||||
Vty.EvKey (Vty.KChar 'g') [] -> do
|
Vty.EvKey (Vty.KChar 'g') [] -> do
|
||||||
ej <- liftIO $ journalReload j
|
d <- liftIO getCurrentDay
|
||||||
|
ej <- liftIO $ journalReload j -- (ej, changed) <- liftIO $ journalReloadIfChanged copts j
|
||||||
case ej of
|
case ej of
|
||||||
Right j' -> reload st{ajournal=j'}
|
Right j' -> continue $ reload j' d st
|
||||||
Left err -> continue $ screenEnter d ES.screen{esState=err} st
|
Left err -> continue $ screenEnter d ES.screen{esState=err} st
|
||||||
-- (ej, changed) <- liftIO $ journalReloadIfChanged copts j
|
|
||||||
-- case (changed, ej) of
|
|
||||||
-- (True, Right j') -> reload st{ajournal=j'}
|
|
||||||
-- -- (True, Left err) -> continue st{amsg=err} -- XXX report parse error
|
|
||||||
-- _ -> continue st
|
|
||||||
|
|
||||||
Vty.EvKey (Vty.KLeft) [] -> continue $ popScreen st
|
Vty.EvKey (Vty.KLeft) [] -> continue $ popScreen st
|
||||||
-- Vty.EvKey (Vty.KRight) [] -> error (show curItem) where curItem = listSelectedElement is
|
-- Vty.EvKey (Vty.KRight) [] -> error (show curItem) where curItem = listSelectedElement is
|
||||||
|
|||||||
@ -4,6 +4,7 @@ module Hledger.UI.UIUtils (
|
|||||||
pushScreen
|
pushScreen
|
||||||
,popScreen
|
,popScreen
|
||||||
,screenEnter
|
,screenEnter
|
||||||
|
,reload
|
||||||
,getViewportSize
|
,getViewportSize
|
||||||
-- ,margin
|
-- ,margin
|
||||||
,withBorderAttr
|
,withBorderAttr
|
||||||
@ -29,7 +30,24 @@ import Brick.Widgets.Border.Style
|
|||||||
import Graphics.Vty as Vty
|
import Graphics.Vty as Vty
|
||||||
|
|
||||||
import Hledger.UI.UITypes
|
import Hledger.UI.UITypes
|
||||||
|
import Hledger.Data.Types (Journal)
|
||||||
import Hledger.Utils (applyN)
|
import Hledger.Utils (applyN)
|
||||||
|
-- import Hledger.Utils.Debug
|
||||||
|
|
||||||
|
-- | Regenerate the content for the current and previous screens, from a new journal and current date.
|
||||||
|
reload :: Journal -> Day -> AppState -> AppState
|
||||||
|
reload j d st@AppState{aScreen=s,aPrevScreens=ss} =
|
||||||
|
-- clumsy due to entanglement of AppState and Screen.
|
||||||
|
-- sInitFn operates only on an appstate's current screen, so
|
||||||
|
-- remove all the screens from the appstate and then add them back
|
||||||
|
-- one at a time, regenerating as we go.
|
||||||
|
let
|
||||||
|
first:rest = reverse $ s:ss
|
||||||
|
st0 = st{ajournal=j, aScreen=first, aPrevScreens=[]}
|
||||||
|
st1 = (sInitFn first) d st0
|
||||||
|
st2 = foldl' (\st s -> (sInitFn s) d $ pushScreen s st) st1 rest
|
||||||
|
in
|
||||||
|
st2
|
||||||
|
|
||||||
pushScreen :: Screen -> AppState -> AppState
|
pushScreen :: Screen -> AppState -> AppState
|
||||||
pushScreen scr st = st{aPrevScreens=(aScreen st:aPrevScreens st)
|
pushScreen scr st = st{aPrevScreens=(aScreen st:aPrevScreens st)
|
||||||
|
|||||||
@ -178,6 +178,7 @@ The need to precede options with `--` when invoked from hledger is awkward.
|
|||||||
|
|
||||||
`-V` doesn't affect the register screen.
|
`-V` doesn't affect the register screen.
|
||||||
|
|
||||||
If you reload while in the register screen, when you return to the
|
When you press `g`, the current and all previous screens are
|
||||||
accounts screen it will be showing old data, and pressing g again will
|
regenerated. With large data this will cause a noticeable pause,
|
||||||
not reload it; you must adjust depth to force it (eg press 0).
|
which could be reduced if the previous screens were processed in a
|
||||||
|
background thread.
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user