ui: preserve B/V state when reloading, simplify code (#1588)
In hledger-ui TransactionScreen, set the current transaction based on RegisterScreen.
This commit is contained in:
commit
943b548591
@ -72,7 +72,7 @@ rsInit d reset ui@UIState{aopts=_uopts@UIOpts{cliopts_=CliOpts{reportspec_=rspec
|
||||
-- always show historical balance
|
||||
-- , balancetype_= HistoricalBalance
|
||||
}
|
||||
rspec' =
|
||||
rspec' =
|
||||
either (error "rsInit: adjusting the query for register, should not have failed") id $ -- PARTIAL:
|
||||
updateReportSpec ropts' rspec
|
||||
|
||||
@ -365,17 +365,9 @@ rsHandle ui@UIState{
|
||||
VtyEvent (EvKey (KChar 'z') [MCtrl]) -> suspend ui
|
||||
|
||||
-- enter transaction screen for selected transaction
|
||||
VtyEvent e | e `elem` moveRightEvents -> do
|
||||
VtyEvent e | e `elem` moveRightEvents ->
|
||||
case listSelectedElement rsList of
|
||||
Just (_, RegisterScreenItem{rsItemTransaction=t}) ->
|
||||
let
|
||||
ts = map rsItemTransaction $ V.toList $ nonblanks
|
||||
numberedts = zip [1..] ts
|
||||
i = maybe 0 (toInteger . (+1)) $ elemIndex t ts -- XXX
|
||||
in
|
||||
continue $ screenEnter d transactionScreen{tsTransaction=(i,t)
|
||||
,tsTransactions=numberedts
|
||||
,tsAccount=rsAccount} ui
|
||||
Just _ -> continue $ screenEnter d transactionScreen{tsAccount=rsAccount} ui
|
||||
Nothing -> continue ui
|
||||
|
||||
-- prevent moving down over blank padding items;
|
||||
|
||||
@ -16,9 +16,11 @@ import Data.List
|
||||
import Data.Maybe
|
||||
import qualified Data.Text as T
|
||||
import Data.Time.Calendar (Day)
|
||||
import qualified Data.Vector as V
|
||||
import Graphics.Vty (Event(..),Key(..),Modifier(..))
|
||||
import Lens.Micro ((^.))
|
||||
import Brick
|
||||
import Brick.Widgets.List (listMoveTo)
|
||||
import Brick.Widgets.List (listElementsL, listMoveTo, listSelectedElement)
|
||||
|
||||
import Hledger
|
||||
import Hledger.Cli hiding (progname,prognameandversion)
|
||||
@ -43,16 +45,20 @@ transactionScreen = TransactionScreen{
|
||||
tsInit :: Day -> Bool -> UIState -> UIState
|
||||
tsInit _d _reset ui@UIState{aopts=UIOpts{cliopts_=CliOpts{reportspec_=_rspec}}
|
||||
,ajournal=_j
|
||||
,aScreen=TransactionScreen{}
|
||||
,aScreen=s@TransactionScreen{tsTransaction=(_,t),tsTransactions=nts}
|
||||
,aPrevScreens=prevscreens
|
||||
} =
|
||||
-- plog ("initialising TransactionScreen, value_ is "
|
||||
-- -- ++ (pshow (Just (AtDefault Nothing)::Maybe ValuationType))
|
||||
-- ++(pshow (value_ _ropts)) -- XXX calling value_ here causes plog to fail with: debug.log: openFile: resource busy (file is locked)
|
||||
-- ++ "?"
|
||||
-- ++" and first commodity is")
|
||||
-- (acommodity$head$amounts$pamount$head$tpostings$snd$tsTransaction)
|
||||
-- `seq`
|
||||
ui
|
||||
ui{aScreen=s{tsTransaction=(i',t'),tsTransactions=nts'}}
|
||||
where
|
||||
i' = maybe 0 (toInteger . (+1)) . elemIndex t' $ map snd nts'
|
||||
-- If the previous screen was RegisterScreen, use the listed and selected items as
|
||||
-- the transactions. Otherwise, use the provided transaction and list.
|
||||
(t',nts') = case prevscreens of
|
||||
RegisterScreen{rsList=xs}:_ -> (seltxn, zip [1..] $ map rsItemTransaction nonblanks)
|
||||
where
|
||||
seltxn = maybe nulltransaction (rsItemTransaction . snd) $ listSelectedElement xs
|
||||
nonblanks = V.toList . V.takeWhile (not . T.null . rsItemDate) $ xs ^. listElementsL
|
||||
_ -> (t, nts)
|
||||
tsInit _ _ _ = error "init function called with wrong screen type, should not happen" -- PARTIAL:
|
||||
|
||||
tsDraw :: UIState -> [Widget Name]
|
||||
@ -129,9 +135,8 @@ tsDraw _ = error "draw function called with wrong screen type, should not happen
|
||||
tsHandle :: UIState -> BrickEvent Name AppEvent -> EventM Name (Next UIState)
|
||||
tsHandle ui@UIState{aScreen=s@TransactionScreen{tsTransaction=(i,t)
|
||||
,tsTransactions=nts
|
||||
,tsAccount=acct
|
||||
}
|
||||
,aopts=UIOpts{cliopts_=copts@CliOpts{reportspec_=rspec}}
|
||||
,aopts=UIOpts{cliopts_=copts}
|
||||
,ajournal=j
|
||||
,aMode=mode
|
||||
}
|
||||
@ -168,12 +173,7 @@ tsHandle ui@UIState{aScreen=s@TransactionScreen{tsTransaction=(i,t)
|
||||
ej <- liftIO $ journalReload copts
|
||||
case ej of
|
||||
Left err -> continue $ screenEnter d errorScreen{esError=err} ui
|
||||
Right j' -> do
|
||||
continue $
|
||||
regenerateScreens j' d $
|
||||
regenerateTransactions rspec j' s acct i $ -- added (inline) 201512 (why ?)
|
||||
clearCostValue $
|
||||
ui
|
||||
Right j' -> continue $ regenerateScreens j' d ui
|
||||
VtyEvent (EvKey (KChar 'I') []) -> continue $ uiCheckBalanceAssertions d (toggleIgnoreBalanceAssertions ui)
|
||||
|
||||
-- for toggles that may change the current/prev/next transactions,
|
||||
@ -184,12 +184,10 @@ tsHandle ui@UIState{aScreen=s@TransactionScreen{tsTransaction=(i,t)
|
||||
VtyEvent (EvKey (KChar 'B') []) ->
|
||||
continue $
|
||||
regenerateScreens j d $
|
||||
-- regenerateTransactions ropts d j s acct i $
|
||||
toggleCost ui
|
||||
VtyEvent (EvKey (KChar 'V') []) ->
|
||||
continue $
|
||||
regenerateScreens j d $
|
||||
-- regenerateTransactions ropts d j s acct i $
|
||||
toggleValue ui
|
||||
|
||||
VtyEvent e | e `elem` moveUpEvents -> continue $ regenerateScreens j d ui{aScreen=s{tsTransaction=(iprev,tprev)}}
|
||||
@ -204,29 +202,6 @@ tsHandle ui@UIState{aScreen=s@TransactionScreen{tsTransaction=(i,t)
|
||||
|
||||
tsHandle _ _ = error "event handler called with wrong screen type, should not happen" -- PARTIAL:
|
||||
|
||||
-- Got to redo the register screen's transactions report, to get the latest transactions list for this screen.
|
||||
-- XXX Duplicates rsInit. Why do we have to do this as well as regenerateScreens ?
|
||||
regenerateTransactions :: ReportSpec -> Journal -> Screen -> AccountName -> Integer -> UIState -> UIState
|
||||
regenerateTransactions rspec j s acct i ui =
|
||||
let
|
||||
q = filterQuery (not . queryIsDepth) $ rsQuery rspec
|
||||
thisacctq = Acct $ accountNameToAccountRegex acct -- includes subs
|
||||
items = reverse $ accountTransactionsReport rspec j q thisacctq
|
||||
ts = map first6 items
|
||||
numberedts = zip [1..] ts
|
||||
-- select the best current transaction from the new list
|
||||
-- stay at the same index if possible, or if we are now past the end, select the last, otherwise select the first
|
||||
(i',t') = case lookup i numberedts
|
||||
of Just t'' -> (i,t'')
|
||||
Nothing | null numberedts -> (0,nulltransaction)
|
||||
| i > fst (last numberedts) -> last numberedts
|
||||
| otherwise -> head numberedts
|
||||
in
|
||||
ui{aScreen=s{tsTransaction=(i',t')
|
||||
,tsTransactions=numberedts
|
||||
,tsAccount=acct
|
||||
}}
|
||||
|
||||
-- | Select the nth item on the register screen.
|
||||
rsSelect i scr@RegisterScreen{..} = scr{rsList=l'}
|
||||
where l' = listMoveTo (i-1) rsList
|
||||
|
||||
@ -105,11 +105,6 @@ toggleEmpty ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportspec_=rsp
|
||||
where
|
||||
toggleEmpty ropts = ropts{empty_=not $ empty_ ropts}
|
||||
|
||||
-- | Show primary amounts, not cost or value.
|
||||
clearCostValue :: UIState -> UIState
|
||||
clearCostValue ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportspec_=rspec@ReportSpec{rsOpts=ropts}}}} =
|
||||
ui{aopts=uopts{cliopts_=copts{reportspec_=rspec{rsOpts=ropts{cost_ = NoCost, value_ = Nothing}}}}}
|
||||
|
||||
-- | Toggle between showing the primary amounts or costs.
|
||||
toggleCost :: UIState -> UIState
|
||||
toggleCost ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportspec_=rspec@ReportSpec{rsOpts=ropts}}}} =
|
||||
|
||||
Loading…
Reference in New Issue
Block a user