fix: ui: Make sure that you can scroll between matching transactions in
TransactionScreen. (#1607) Make sure that the previous register screen is updated whenever we scroll in TransactionScreen.
This commit is contained in:
		
							parent
							
								
									70dab8eccd
								
							
						
					
					
						commit
						5f53da87e0
					
				| @ -5,10 +5,8 @@ | |||||||
| {-# LANGUAGE TupleSections     #-} | {-# LANGUAGE TupleSections     #-} | ||||||
| 
 | 
 | ||||||
| module Hledger.UI.TransactionScreen | module Hledger.UI.TransactionScreen | ||||||
|  (transactionScreen | ( transactionScreen | ||||||
|  ,rsSelect | ) where | ||||||
|  ) |  | ||||||
| where |  | ||||||
| 
 | 
 | ||||||
| import Control.Monad | import Control.Monad | ||||||
| import Control.Monad.IO.Class (liftIO) | import Control.Monad.IO.Class (liftIO) | ||||||
| @ -133,9 +131,7 @@ tsDraw UIState{aopts=UIOpts{cliopts_=copts@CliOpts{reportspec_=rspec@ReportSpec{ | |||||||
| tsDraw _ = error "draw function called with wrong screen type, should not happen"  -- PARTIAL: | tsDraw _ = error "draw function called with wrong screen type, should not happen"  -- PARTIAL: | ||||||
| 
 | 
 | ||||||
| tsHandle :: UIState -> BrickEvent Name AppEvent -> EventM Name (Next UIState) | tsHandle :: UIState -> BrickEvent Name AppEvent -> EventM Name (Next UIState) | ||||||
| tsHandle ui@UIState{aScreen=s@TransactionScreen{tsTransaction=(i,t) | tsHandle ui@UIState{aScreen=TransactionScreen{tsTransaction=(i,t), tsTransactions=nts} | ||||||
|                                                ,tsTransactions=nts |  | ||||||
|                                                } |  | ||||||
|                    ,aopts=UIOpts{cliopts_=copts} |                    ,aopts=UIOpts{cliopts_=copts} | ||||||
|                    ,ajournal=j |                    ,ajournal=j | ||||||
|                    ,aMode=mode |                    ,aMode=mode | ||||||
| @ -181,28 +177,25 @@ tsHandle ui@UIState{aScreen=s@TransactionScreen{tsTransaction=(i,t) | |||||||
|         -- EvKey (KChar 'E') [] -> continue $ regenerateScreens j d $ stToggleEmpty ui |         -- EvKey (KChar 'E') [] -> continue $ regenerateScreens j d $ stToggleEmpty ui | ||||||
|         -- EvKey (KChar 'C') [] -> continue $ regenerateScreens j d $ stToggleCleared ui |         -- EvKey (KChar 'C') [] -> continue $ regenerateScreens j d $ stToggleCleared ui | ||||||
|         -- EvKey (KChar 'R') [] -> continue $ regenerateScreens j d $ stToggleReal ui |         -- EvKey (KChar 'R') [] -> continue $ regenerateScreens j d $ stToggleReal ui | ||||||
|         VtyEvent (EvKey (KChar 'B') []) -> |         VtyEvent (EvKey (KChar 'B') []) -> continue . regenerateScreens j d $ toggleCost ui | ||||||
|           continue $ |         VtyEvent (EvKey (KChar 'V') []) -> continue . regenerateScreens j d $ toggleValue ui | ||||||
|           regenerateScreens j d $ |  | ||||||
|           toggleCost ui |  | ||||||
|         VtyEvent (EvKey (KChar 'V') []) -> |  | ||||||
|           continue $ |  | ||||||
|           regenerateScreens j d $ |  | ||||||
|           toggleValue ui |  | ||||||
| 
 | 
 | ||||||
|         VtyEvent e | e `elem` moveUpEvents   -> continue $ regenerateScreens j d ui{aScreen=s{tsTransaction=(iprev,tprev)}} |         VtyEvent e | e `elem` moveUpEvents   -> continue $ tsSelect iprev tprev ui | ||||||
|         VtyEvent e | e `elem` moveDownEvents -> continue $ regenerateScreens j d ui{aScreen=s{tsTransaction=(inext,tnext)}} |         VtyEvent e | e `elem` moveDownEvents -> continue $ tsSelect inext tnext ui | ||||||
|         VtyEvent e | e `elem` moveLeftEvents -> continue ui'' |         VtyEvent e | e `elem` moveLeftEvents -> continue . popScreen $ tsSelect i t ui  -- Probably not necessary to tsSelect here, but it's safe. | ||||||
|           where |  | ||||||
|             ui'@UIState{aScreen=scr} = popScreen ui |  | ||||||
|             ui'' = ui'{aScreen=rsSelect (fromIntegral i) scr} |  | ||||||
|         VtyEvent (EvKey (KChar 'l') [MCtrl]) -> redraw ui |         VtyEvent (EvKey (KChar 'l') [MCtrl]) -> redraw ui | ||||||
|         VtyEvent (EvKey (KChar 'z') [MCtrl]) -> suspend ui |         VtyEvent (EvKey (KChar 'z') [MCtrl]) -> suspend ui | ||||||
|         _ -> continue ui |         _ -> continue ui | ||||||
| 
 | 
 | ||||||
| tsHandle _ _ = error "event handler called with wrong screen type, should not happen"  -- PARTIAL: | tsHandle _ _ = error "event handler called with wrong screen type, should not happen"  -- PARTIAL: | ||||||
| 
 | 
 | ||||||
|  | -- | Select a new transaction and update the previous register screen | ||||||
|  | tsSelect i t ui@UIState{aScreen=s@TransactionScreen{}} = case aPrevScreens ui of | ||||||
|  |     x:xs -> ui'{aPrevScreens=rsSelect i x : xs} | ||||||
|  |     []   -> ui' | ||||||
|  |   where ui' = ui{aScreen=s{tsTransaction=(i,t)}} | ||||||
|  | tsSelect _ _ ui = ui | ||||||
|  | 
 | ||||||
| -- | Select the nth item on the register screen. | -- | Select the nth item on the register screen. | ||||||
| rsSelect i scr@RegisterScreen{..} = scr{rsList=l'} | rsSelect i scr@RegisterScreen{..} = scr{rsList=listMoveTo (fromInteger $ i-1) rsList} | ||||||
|   where l' = listMoveTo (i-1) rsList |  | ||||||
| rsSelect _ scr = scr | rsSelect _ scr = scr | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user