ui: reg: refactor, consolidate state
This commit is contained in:
		
							parent
							
								
									45db0a28cc
								
							
						
					
					
						commit
						b950bd0d83
					
				| @ -247,7 +247,9 @@ handleAccountsScreen st@AppState{ | ||||
|               } | ||||
|         Vty.EvKey (Vty.KLeft) []     -> continue $ popScreen st' | ||||
|         Vty.EvKey (k) [] | k `elem` [Vty.KRight, Vty.KEnter] -> do | ||||
|           let st'' = screenEnter d RS.screen{rsAcct=selacct'} st' | ||||
|           let | ||||
|             scr = setRegisterScreenCurrentAccount selacct' RS.screen | ||||
|             st'' = screenEnter d scr st' | ||||
|           vScrollToBeginning $ viewportScroll "register" | ||||
|           continue st'' | ||||
| 
 | ||||
|  | ||||
| @ -94,7 +94,7 @@ runBrickUi uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}} j = do | ||||
|       -- with --register, start on the register screen, and also put | ||||
|       -- the accounts screen on the prev screens stack so you can exit | ||||
|       -- to that as usual. | ||||
|       Just apat -> (RS.screen{rsAcct=acct}, [ascr']) | ||||
|       Just apat -> (setRegisterScreenCurrentAccount acct RS.screen, [ascr']) | ||||
|         where | ||||
|           acct = headDef | ||||
|                  (error' $ "--register "++apat++" did not match any account") | ||||
| @ -106,12 +106,9 @@ runBrickUi uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}} j = do | ||||
|                   AppState{ | ||||
|                     aopts=uopts' | ||||
|                    ,ajournal=j | ||||
|                    ,aScreen=setAccountsScreenSelection acct AS.screen | ||||
|                    ,aScreen=setAccountsScreenSelectedAccount acct AS.screen | ||||
|                    ,aPrevScreens=[] | ||||
|                    } | ||||
|           -- ugh | ||||
|           setAccountsScreenSelection a scr@AccountsScreen{asState=(l,_)} = scr{asState=(l,a)} | ||||
|           setAccountsScreenSelection _ scr = scr | ||||
|    | ||||
|     st = (sInitFn scr) d | ||||
|          AppState{ | ||||
|  | ||||
| @ -31,16 +31,15 @@ import Hledger.UI.UIUtils | ||||
| import qualified Hledger.UI.ErrorScreen as ES (screen) | ||||
| 
 | ||||
| screen = RegisterScreen{ | ||||
|    rsState  = list "register" V.empty 1 | ||||
|   ,rsAcct   = "" | ||||
|    rsState   = (list "register" V.empty 1, "") | ||||
|   ,sInitFn   = initRegisterScreen | ||||
|   ,sDrawFn   = drawRegisterScreen | ||||
|   ,sHandleFn = handleRegisterScreen | ||||
|   } | ||||
| 
 | ||||
| initRegisterScreen :: Day -> AppState -> AppState | ||||
| initRegisterScreen d st@AppState{aopts=opts, ajournal=j, aScreen=s@RegisterScreen{rsAcct=acct}} = | ||||
|   st{aScreen=s{rsState=l}} | ||||
| initRegisterScreen d st@AppState{aopts=opts, ajournal=j, aScreen=s@RegisterScreen{rsState=(_,acct)}} = | ||||
|   st{aScreen=s{rsState=(l,acct)}} | ||||
|   where | ||||
|     -- gather arguments and queries | ||||
|     ropts = (reportopts_ $ cliopts_ opts) | ||||
| @ -87,7 +86,7 @@ initRegisterScreen _ _ = error "init function called with wrong screen type, sho | ||||
| 
 | ||||
| drawRegisterScreen :: AppState -> [Widget] | ||||
| drawRegisterScreen AppState{ -- aopts=_uopts@UIOpts{cliopts_=_copts@CliOpts{reportopts_=_ropts@ReportOpts{query_=querystr}}}, | ||||
|                              aScreen=RegisterScreen{rsState=l,rsAcct=acct}} = [ui] | ||||
|                              aScreen=RegisterScreen{rsState=(l,acct)}} = [ui] | ||||
|   where | ||||
|     toplabel = withAttr ("border" <> "bold") (str acct) | ||||
|             <+> str " transactions" | ||||
| @ -184,7 +183,7 @@ drawRegisterItem (datewidth,descwidth,acctswidth,changewidth,balwidth) selected | ||||
| 
 | ||||
| handleRegisterScreen :: AppState -> Vty.Event -> EventM (Next AppState) | ||||
| handleRegisterScreen st@AppState{ | ||||
|    aScreen=s@RegisterScreen{rsState=is} | ||||
|    aScreen=s@RegisterScreen{rsState=(l,acct)} | ||||
|   ,aopts=UIOpts{cliopts_=_copts} | ||||
|   ,ajournal=j | ||||
|   } e = do | ||||
| @ -203,7 +202,7 @@ handleRegisterScreen st@AppState{ | ||||
|     -- Vty.EvKey (Vty.KRight) []    -> error (show curItem) where curItem = listSelectedElement is | ||||
|     -- fall through to the list's event handler (handles [pg]up/down) | ||||
|     ev                       -> do | ||||
|                                  is' <- handleEvent ev is | ||||
|                                  continue st{aScreen=s{rsState=is'}} | ||||
|                                  l' <- handleEvent ev l | ||||
|                                  continue st{aScreen=s{rsState=(l',acct)}} | ||||
|                                  -- continue =<< handleEventLensed st someLens ev | ||||
| handleRegisterScreen _ _ = error "event handler called with wrong screen type, should not happen" | ||||
|  | ||||
| @ -26,15 +26,14 @@ data AppState = AppState { | ||||
| data Screen = | ||||
|     AccountsScreen { | ||||
|      asState :: (List (Int,String,String,[String]), AccountName)  -- ^ list widget holding (indent level, full account name, full or short account name to display, rendered amounts); | ||||
|                                                                   --   the currently selected account's full name (or "") | ||||
|                                                                   --   the full name of the currently selected account (or "") | ||||
|     ,sInitFn :: Day -> AppState -> AppState                       -- ^ function to initialise the screen's state on entry | ||||
|     ,sHandleFn :: AppState -> V.Event -> EventM (Next AppState)   -- ^ brick event handler to use for this screen | ||||
|     ,sDrawFn :: AppState -> [Widget]                              -- ^ brick renderer to use for this screen | ||||
|     } | ||||
|   | RegisterScreen { | ||||
|      rsState :: List (String,String,String,String,String) -- ^ list widget holding (date, description, other accts, change amt, balance amt) | ||||
|      -- XXX move into rsState ? | ||||
|     ,rsAcct :: AccountName              -- ^ the account we are showing a register for | ||||
|      rsState :: (List (String,String,String,String,String), AccountName) -- ^ list widget holding (date, description, other accts, change amt, balance amt); | ||||
|                                                                          --   the full name of the account we are showing a register for | ||||
|     ,sInitFn :: Day -> AppState -> AppState | ||||
|     ,sHandleFn :: AppState -> V.Event -> EventM (Next AppState) | ||||
|     ,sDrawFn :: AppState -> [Widget] | ||||
| @ -48,3 +47,10 @@ data Screen = | ||||
|   deriving (Show) | ||||
| 
 | ||||
| instance Show (List a) where show _ = "<List>" | ||||
| 
 | ||||
| -- ugh | ||||
| setAccountsScreenSelectedAccount a scr@AccountsScreen{asState=(l,_)} = scr{asState=(l,a)} | ||||
| setAccountsScreenSelectedAccount _ scr = scr | ||||
| 
 | ||||
| setRegisterScreenCurrentAccount a scr@RegisterScreen{rsState=(l,_)} = scr{rsState=(l,a)} | ||||
| setRegisterScreenCurrentAccount _ scr = scr | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user