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