ui: --watch date tracking fixes
- move the period only if it's "current" (contains the old "today" date) - make it work on all screens, not just accounts
This commit is contained in:
		
							parent
							
								
									e3a7f6697e
								
							
						
					
					
						commit
						9952f93e97
					
				| @ -34,6 +34,7 @@ module Hledger.Data.Dates ( | ||||
|   getCurrentYear, | ||||
|   nulldate, | ||||
|   spanContainsDate, | ||||
|   periodContainsDate, | ||||
|   parsedateM, | ||||
|   parsedate, | ||||
|   showDate, | ||||
| @ -212,6 +213,11 @@ spanContainsDate (DateSpan Nothing (Just e))  d = d < e | ||||
| spanContainsDate (DateSpan (Just b) Nothing)  d = d >= b | ||||
| spanContainsDate (DateSpan (Just b) (Just e)) d = d >= b && d < e | ||||
| 
 | ||||
| -- | Does the period include the given date ? | ||||
| -- (Here to avoid import cycle). | ||||
| periodContainsDate :: Period -> Day -> Bool | ||||
| periodContainsDate p = spanContainsDate (periodAsDateSpan p) | ||||
| 
 | ||||
| -- | Calculate the intersection of a number of datespans. | ||||
| spansIntersect [] = nulldatespan | ||||
| spansIntersect [d] = d | ||||
|  | ||||
| @ -289,9 +289,10 @@ asHandle ui0@UIState{ | ||||
|         -- EvKey (KChar 'l') [MCtrl] -> do | ||||
|         VtyEvent (EvKey KEsc        []) -> continue $ resetScreens d ui | ||||
|         VtyEvent (EvKey (KChar c)   []) | c `elem` ['?'] -> continue $ setMode Help ui | ||||
|         -- XXX handles FileChange/DateChange events only in Normal mode ? | ||||
|         -- XXX AppEvents currently handled only in Normal mode | ||||
|         -- XXX be sure we don't leave unconsumed events piling up | ||||
|         AppEvent DateChange             -> continue $ regenerateScreens j d $ setReportPeriod (DayPeriod d) ui | ||||
|         AppEvent (DateChange old _) | periodContainsDate (reportPeriod ui) old -> | ||||
|           continue $ regenerateScreens j d $ setReportPeriod (DayPeriod d) ui | ||||
|         e | e `elem` [VtyEvent (EvKey (KChar 'g') []), AppEvent FileChange] -> | ||||
|           liftIO (uiReloadJournal copts d ui) >>= continue | ||||
|         VtyEvent (EvKey (KChar 'I') []) -> continue $ uiCheckBalanceAssertions d (toggleIgnoreBalanceAssertions ui) | ||||
|  | ||||
| @ -92,7 +92,6 @@ esHandle ui@UIState{ | ||||
|             (pos,f) = case parsewithString hledgerparseerrorpositionp esError of | ||||
|                         Right (f,l,c) -> (Just (l, Just c),f) | ||||
|                         Left  _       -> (endPos, journalFilePath j) | ||||
| --         AppEvent DateChange             -> continue $ regenerateScreens j d ui | ||||
|         e | e `elem` [VtyEvent (EvKey (KChar 'g') [])] -> | ||||
|           liftIO (uiReloadJournal copts d (popScreen ui)) >>= continue . uiCheckBalanceAssertions d | ||||
| --           (ej, _) <- liftIO $ journalReloadIfChanged copts d j | ||||
|  | ||||
| @ -161,13 +161,14 @@ runBrickUi uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}} j = do | ||||
|     -- start a background thread reporting changes in the current date | ||||
|     -- use async for proper child termination in GHCI | ||||
|     let | ||||
|       watchDate lastd = do | ||||
|       watchDate old = do | ||||
|         threadDelay 1000000 -- 1s | ||||
|         d <- getCurrentDay | ||||
|         when (d /= lastd) $ do | ||||
|           -- dbg1IO "datechange" DateChange -- XXX don't uncomment until dbg*IO fixed to use traceIO, GHC may block/end thread | ||||
|           writeChan eventChan DateChange | ||||
|         watchDate d | ||||
|         new <- getCurrentDay | ||||
|         when (new /= old) $ do | ||||
|           let dc = DateChange old new | ||||
|           -- dbg1IO "datechange" dc -- XXX don't uncomment until dbg*IO fixed to use traceIO, GHC may block/end thread | ||||
|           writeChan eventChan dc | ||||
|         watchDate new | ||||
| 
 | ||||
|     withAsync | ||||
|       (getCurrentDay >>= watchDate) | ||||
|  | ||||
| @ -267,7 +267,8 @@ rsHandle ui@UIState{ | ||||
|         VtyEvent (EvKey (KChar 'q') []) -> halt ui | ||||
|         VtyEvent (EvKey KEsc        []) -> continue $ resetScreens d ui | ||||
|         VtyEvent (EvKey (KChar c)   []) | c `elem` ['?'] -> continue $ setMode Help ui | ||||
|         AppEvent DateChange             -> continue $ regenerateScreens j d ui | ||||
|         AppEvent (DateChange old _) | periodContainsDate (reportPeriod ui) old -> | ||||
|           continue $ regenerateScreens j d $ setReportPeriod (DayPeriod d) ui | ||||
|         e | e `elem` [VtyEvent (EvKey (KChar 'g') []), AppEvent FileChange] -> | ||||
|           liftIO (uiReloadJournal copts d ui) >>= continue | ||||
|         VtyEvent (EvKey (KChar 'I') []) -> continue $ uiCheckBalanceAssertions d (toggleIgnoreBalanceAssertions ui) | ||||
|  | ||||
| @ -129,7 +129,8 @@ tsHandle ui@UIState{aScreen=s@TransactionScreen{tsTransaction=(i,t) | ||||
|         VtyEvent (EvKey (KChar 'E') []) -> suspendAndResume $ void (runEditor pos f) >> uiReloadJournalIfChanged copts d j ui | ||||
|           where | ||||
|             (pos,f) = let GenericSourcePos f l c = tsourcepos t in (Just (l, Just c),f) | ||||
|         AppEvent DateChange             -> continue $ regenerateScreens j d ui | ||||
|         AppEvent (DateChange old _) | periodContainsDate (reportPeriod ui) old -> | ||||
|           continue $ regenerateScreens j d $ setReportPeriod (DayPeriod d) ui | ||||
|         e | e `elem` [VtyEvent (EvKey (KChar 'g') []), AppEvent FileChange] -> do | ||||
|           d <- liftIO getCurrentDay | ||||
|           ej <- liftIO $ journalReload copts | ||||
|  | ||||
| @ -104,6 +104,11 @@ moveReportPeriodToDate :: Day -> UIState -> UIState | ||||
| moveReportPeriodToDate d ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts@ReportOpts{period_=p}}}} = | ||||
|   ui{aopts=uopts{cliopts_=copts{reportopts_=ropts{period_=periodMoveTo d p}}}} | ||||
| 
 | ||||
| -- | Get the report period. | ||||
| reportPeriod :: UIState -> Period | ||||
| reportPeriod UIState{aopts=UIOpts{cliopts_=CliOpts{reportopts_=ReportOpts{period_=p}}}} = | ||||
|   p | ||||
| 
 | ||||
| -- | Set the report period. | ||||
| setReportPeriod :: Period -> UIState -> UIState | ||||
| setReportPeriod p ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}} = | ||||
|  | ||||
| @ -83,8 +83,8 @@ data Name = | ||||
|   deriving (Ord, Show, Eq) | ||||
| 
 | ||||
| data AppEvent = | ||||
|     FileChange | ||||
|   | DateChange | ||||
|     FileChange          -- one of the Journal's files has been added/modified/removed | ||||
|   | DateChange Day Day  -- the current date has changed since last checked (with the old and new values) | ||||
|   deriving (Eq, Show) | ||||
| 
 | ||||
| -- | hledger-ui screen types & instances. | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user