hledger-ui 1.0.2 → 1.0.3
raw patch · 9 files changed
+123/−107 lines, 9 filesdep ~brick
Dependency ranges changed: brick
Files
- CHANGES +5/−0
- Hledger/UI/AccountsScreen.hs +49/−42
- Hledger/UI/ErrorScreen.hs +8/−8
- Hledger/UI/Main.hs +1/−2
- Hledger/UI/RegisterScreen.hs +35/−29
- Hledger/UI/TransactionScreen.hs +11/−11
- Hledger/UI/UITypes.hs +6/−7
- Hledger/UI/UIUtils.hs +5/−5
- hledger-ui.cabal +3/−3
CHANGES view
@@ -2,6 +2,11 @@ See also the hledger and project change logs. +# 1.0.3 (2016/10/31)++- use brick 0.12++ # 1.0.2 (2016/10/27) - use latest brick 0.11
Hledger/UI/AccountsScreen.hs view
@@ -247,7 +247,7 @@ sel | selected = (<> "selected") | otherwise = id -asHandle :: UIState -> Event -> EventM Name (Next UIState)+asHandle :: UIState -> BrickEvent Name Event -> EventM Name (Next UIState) asHandle ui0@UIState{ aScreen=scr@AccountsScreen{..} ,aopts=UIOpts{cliopts_=copts}@@ -269,55 +269,58 @@ case mode of Minibuffer ed -> case ev of- EvKey KEsc [] -> continue $ closeMinibuffer ui- EvKey KEnter [] -> continue $ regenerateScreens j d $ setFilter s $ closeMinibuffer ui+ VtyEvent (EvKey KEsc []) -> continue $ closeMinibuffer ui+ VtyEvent (EvKey KEnter []) -> continue $ regenerateScreens j d $ setFilter s $ closeMinibuffer ui where s = chomp $ unlines $ map strip $ getEditContents ed- ev -> do ed' <- handleEditorEvent ev ed- continue $ ui{aMode=Minibuffer ed'}+ VtyEvent ev -> do ed' <- handleEditorEvent ev ed+ continue $ ui{aMode=Minibuffer ed'}+ AppEvent _ -> continue ui+ MouseDown _ _ _ _ -> continue ui+ MouseUp _ _ _ -> continue ui Help -> case ev of- EvKey (KChar 'q') [] -> halt ui+ VtyEvent (EvKey (KChar 'q') []) -> halt ui _ -> helpHandle ui ev Normal -> case ev of- EvKey (KChar 'q') [] -> halt ui+ VtyEvent (EvKey (KChar 'q') []) -> halt ui -- EvKey (KChar 'l') [MCtrl] -> do- EvKey KEsc [] -> continue $ resetScreens d ui- EvKey (KChar c) [] | c `elem` ['?'] -> continue $ setMode Help ui- EvKey (KChar 'g') [] -> liftIO (uiReloadJournalIfChanged copts d j ui) >>= continue- EvKey (KChar 'I') [] -> continue $ uiCheckBalanceAssertions d (toggleIgnoreBalanceAssertions ui)- EvKey (KChar 'a') [] -> suspendAndResume $ clearScreen >> setCursorPosition 0 0 >> add copts j >> uiReloadJournalIfChanged copts d j ui- EvKey (KChar 'E') [] -> suspendAndResume $ void (runEditor endPos (journalFilePath j)) >> uiReloadJournalIfChanged copts d j ui- EvKey (KChar '0') [] -> continue $ regenerateScreens j d $ setDepth (Just 0) ui- EvKey (KChar '1') [] -> continue $ regenerateScreens j d $ setDepth (Just 1) ui- EvKey (KChar '2') [] -> continue $ regenerateScreens j d $ setDepth (Just 2) ui- EvKey (KChar '3') [] -> continue $ regenerateScreens j d $ setDepth (Just 3) ui- EvKey (KChar '4') [] -> continue $ regenerateScreens j d $ setDepth (Just 4) ui- EvKey (KChar '5') [] -> continue $ regenerateScreens j d $ setDepth (Just 5) ui- EvKey (KChar '6') [] -> continue $ regenerateScreens j d $ setDepth (Just 6) ui- EvKey (KChar '7') [] -> continue $ regenerateScreens j d $ setDepth (Just 7) ui- EvKey (KChar '8') [] -> continue $ regenerateScreens j d $ setDepth (Just 8) ui- EvKey (KChar '9') [] -> continue $ regenerateScreens j d $ setDepth (Just 9) ui- EvKey (KChar '-') [] -> continue $ regenerateScreens j d $ decDepth ui- EvKey (KChar '_') [] -> continue $ regenerateScreens j d $ decDepth ui- EvKey (KChar c) [] | c `elem` ['+','='] -> continue $ regenerateScreens j d $ incDepth ui- EvKey (KChar 't') [] -> continue $ regenerateScreens j d $ setReportPeriod (DayPeriod d) ui- EvKey (KChar 'H') [] -> continue $ regenerateScreens j d $ toggleHistorical ui- EvKey (KChar 'F') [] -> continue $ regenerateScreens j d $ toggleFlat ui- EvKey (KChar 'Z') [] -> scrollTop >> (continue $ regenerateScreens j d $ toggleEmpty ui)- EvKey (KChar 'C') [] -> scrollTop >> (continue $ regenerateScreens j d $ toggleCleared ui)- EvKey (KChar 'U') [] -> scrollTop >> (continue $ regenerateScreens j d $ toggleUncleared ui)- EvKey (KChar 'R') [] -> scrollTop >> (continue $ regenerateScreens j d $ toggleReal ui)- EvKey (KDown) [MShift] -> continue $ regenerateScreens j d $ shrinkReportPeriod d ui- EvKey (KUp) [MShift] -> continue $ regenerateScreens j d $ growReportPeriod d ui- EvKey (KRight) [MShift] -> continue $ regenerateScreens j d $ nextReportPeriod journalspan ui- EvKey (KLeft) [MShift] -> continue $ regenerateScreens j d $ previousReportPeriod journalspan ui- EvKey (KChar '/') [] -> continue $ regenerateScreens j d $ showMinibuffer ui- EvKey k [] | k `elem` [KBS, KDel] -> (continue $ regenerateScreens j d $ resetFilter ui)- EvKey k [] | k `elem` [KLeft, KChar 'h'] -> continue $ popScreen ui- EvKey k [] | k `elem` [KRight, KChar 'l'] -> scrollTopRegister >> continue (screenEnter d scr ui)+ VtyEvent (EvKey KEsc []) -> continue $ resetScreens d ui+ VtyEvent (EvKey (KChar c) []) | c `elem` ['?'] -> continue $ setMode Help ui+ VtyEvent (EvKey (KChar 'g') []) -> liftIO (uiReloadJournalIfChanged copts d j ui) >>= continue+ VtyEvent (EvKey (KChar 'I') []) -> continue $ uiCheckBalanceAssertions d (toggleIgnoreBalanceAssertions ui)+ VtyEvent (EvKey (KChar 'a') []) -> suspendAndResume $ clearScreen >> setCursorPosition 0 0 >> add copts j >> uiReloadJournalIfChanged copts d j ui+ VtyEvent (EvKey (KChar 'E') []) -> suspendAndResume $ void (runEditor endPos (journalFilePath j)) >> uiReloadJournalIfChanged copts d j ui+ VtyEvent (EvKey (KChar '0') []) -> continue $ regenerateScreens j d $ setDepth (Just 0) ui+ VtyEvent (EvKey (KChar '1') []) -> continue $ regenerateScreens j d $ setDepth (Just 1) ui+ VtyEvent (EvKey (KChar '2') []) -> continue $ regenerateScreens j d $ setDepth (Just 2) ui+ VtyEvent (EvKey (KChar '3') []) -> continue $ regenerateScreens j d $ setDepth (Just 3) ui+ VtyEvent (EvKey (KChar '4') []) -> continue $ regenerateScreens j d $ setDepth (Just 4) ui+ VtyEvent (EvKey (KChar '5') []) -> continue $ regenerateScreens j d $ setDepth (Just 5) ui+ VtyEvent (EvKey (KChar '6') []) -> continue $ regenerateScreens j d $ setDepth (Just 6) ui+ VtyEvent (EvKey (KChar '7') []) -> continue $ regenerateScreens j d $ setDepth (Just 7) ui+ VtyEvent (EvKey (KChar '8') []) -> continue $ regenerateScreens j d $ setDepth (Just 8) ui+ VtyEvent (EvKey (KChar '9') []) -> continue $ regenerateScreens j d $ setDepth (Just 9) ui+ VtyEvent (EvKey (KChar '-') []) -> continue $ regenerateScreens j d $ decDepth ui+ VtyEvent (EvKey (KChar '_') []) -> continue $ regenerateScreens j d $ decDepth ui+ VtyEvent (EvKey (KChar c) []) | c `elem` ['+','='] -> continue $ regenerateScreens j d $ incDepth ui+ VtyEvent (EvKey (KChar 't') []) -> continue $ regenerateScreens j d $ setReportPeriod (DayPeriod d) ui+ VtyEvent (EvKey (KChar 'H') []) -> continue $ regenerateScreens j d $ toggleHistorical ui+ VtyEvent (EvKey (KChar 'F') []) -> continue $ regenerateScreens j d $ toggleFlat ui+ VtyEvent (EvKey (KChar 'Z') []) -> scrollTop >> (continue $ regenerateScreens j d $ toggleEmpty ui)+ VtyEvent (EvKey (KChar 'C') []) -> scrollTop >> (continue $ regenerateScreens j d $ toggleCleared ui)+ VtyEvent (EvKey (KChar 'U') []) -> scrollTop >> (continue $ regenerateScreens j d $ toggleUncleared ui)+ VtyEvent (EvKey (KChar 'R') []) -> scrollTop >> (continue $ regenerateScreens j d $ toggleReal ui)+ VtyEvent (EvKey (KDown) [MShift]) -> continue $ regenerateScreens j d $ shrinkReportPeriod d ui+ VtyEvent (EvKey (KUp) [MShift]) -> continue $ regenerateScreens j d $ growReportPeriod d ui+ VtyEvent (EvKey (KRight) [MShift]) -> continue $ regenerateScreens j d $ nextReportPeriod journalspan ui+ VtyEvent (EvKey (KLeft) [MShift]) -> continue $ regenerateScreens j d $ previousReportPeriod journalspan ui+ VtyEvent (EvKey (KChar '/') []) -> continue $ regenerateScreens j d $ showMinibuffer ui+ VtyEvent (EvKey k []) | k `elem` [KBS, KDel] -> (continue $ regenerateScreens j d $ resetFilter ui)+ VtyEvent (EvKey k []) | k `elem` [KLeft, KChar 'h'] -> continue $ popScreen ui+ VtyEvent (EvKey k []) | k `elem` [KRight, KChar 'l'] -> scrollTopRegister >> continue (screenEnter d scr ui) where scr = rsSetAccount selacct isdepthclipped registerScreen isdepthclipped = case getDepth ui of@@ -325,7 +328,8 @@ Nothing -> False -- fall through to the list's event handler (handles up/down)- ev -> do+ VtyEvent ev ->+ do let ev' = case ev of EvKey (KChar 'k') [] -> EvKey (KUp) [] EvKey (KChar 'j') [] -> EvKey (KDown) []@@ -335,6 +339,9 @@ & asSelectedAccount .~ selacct } -- continue =<< handleEventLensed ui someLens ev+ AppEvent _ -> continue ui+ MouseDown _ _ _ _ -> continue ui+ MouseUp _ _ _ -> continue ui where -- Encourage a more stable scroll position when toggling list items.
Hledger/UI/ErrorScreen.hs view
@@ -68,7 +68,7 @@ esDraw _ = error "draw function called with wrong screen type, should not happen" -esHandle :: UIState -> Event -> EventM Name (Next UIState)+esHandle :: UIState -> BrickEvent Name Event -> EventM Name (Next UIState) esHandle ui@UIState{ aScreen=ErrorScreen{..} ,aopts=UIOpts{cliopts_=copts}@@ -78,26 +78,26 @@ case mode of Help -> case ev of- EvKey (KChar 'q') [] -> halt ui+ VtyEvent (EvKey (KChar 'q') []) -> halt ui _ -> helpHandle ui ev _ -> do d <- liftIO getCurrentDay case ev of- EvKey (KChar 'q') [] -> halt ui- EvKey KEsc [] -> continue $ uiCheckBalanceAssertions d $ resetScreens d ui- EvKey (KChar c) [] | c `elem` ['h','?'] -> continue $ setMode Help ui- EvKey (KChar 'E') [] -> suspendAndResume $ void (runEditor pos f) >> uiReloadJournalIfChanged copts d j (popScreen ui)+ VtyEvent (EvKey (KChar 'q') []) -> halt ui+ VtyEvent (EvKey KEsc []) -> continue $ uiCheckBalanceAssertions d $ resetScreens d ui+ VtyEvent (EvKey (KChar c) []) | c `elem` ['h','?'] -> continue $ setMode Help ui+ VtyEvent (EvKey (KChar 'E') []) -> suspendAndResume $ void (runEditor pos f) >> uiReloadJournalIfChanged copts d j (popScreen ui) where (pos,f) = case parsewithString hledgerparseerrorpositionp esError of Right (f,l,c) -> (Just (l, Just c),f) Left _ -> (endPos, journalFilePath j)- EvKey (KChar 'g') [] -> liftIO (uiReloadJournalIfChanged copts d j (popScreen ui)) >>= continue . uiCheckBalanceAssertions d+ VtyEvent (EvKey (KChar 'g') []) -> liftIO (uiReloadJournalIfChanged copts d j (popScreen ui)) >>= continue . uiCheckBalanceAssertions d -- (ej, _) <- liftIO $ journalReloadIfChanged copts d j -- case ej of -- Left err -> continue ui{aScreen=s{esError=err}} -- show latest parse error -- Right j' -> continue $ regenerateScreens j' d $ popScreen ui -- return to previous screen, and reload it- EvKey (KChar 'I') [] -> continue $ uiCheckBalanceAssertions d (popScreen $ toggleIgnoreBalanceAssertions ui)+ VtyEvent (EvKey (KChar 'I') []) -> continue $ uiCheckBalanceAssertions d (popScreen $ toggleIgnoreBalanceAssertions ui) _ -> continue ui esHandle _ _ = error "event handler called with wrong screen type, should not happen"
Hledger/UI/Main.hs view
@@ -137,8 +137,7 @@ brickapp :: App (UIState) V.Event Name brickapp = App {- appLiftVtyEvent = id- , appStartEvent = return+ appStartEvent = return , appAttrMap = const theme , appChooseCursor = showFirstCursor , appHandleEvent = \ui ev -> sHandle (aScreen ui) ui ev
Hledger/UI/RegisterScreen.hs view
@@ -236,7 +236,7 @@ sel | selected = (<> "selected") | otherwise = id -rsHandle :: UIState -> Event -> EventM Name (Next UIState)+rsHandle :: UIState -> BrickEvent Name Event -> EventM Name (Next UIState) rsHandle ui@UIState{ aScreen=s@RegisterScreen{..} ,aopts=UIOpts{cliopts_=copts}@@ -248,45 +248,48 @@ case mode of Minibuffer ed -> case ev of- EvKey KEsc [] -> continue $ closeMinibuffer ui- EvKey KEnter [] -> continue $ regenerateScreens j d $ setFilter s $ closeMinibuffer ui+ VtyEvent (EvKey KEsc []) -> continue $ closeMinibuffer ui+ VtyEvent (EvKey KEnter []) -> continue $ regenerateScreens j d $ setFilter s $ closeMinibuffer ui where s = chomp $ unlines $ map strip $ getEditContents ed- ev -> do ed' <- handleEditorEvent ev ed- continue $ ui{aMode=Minibuffer ed'}+ VtyEvent ev -> do ed' <- handleEditorEvent ev ed+ continue $ ui{aMode=Minibuffer ed'}+ AppEvent _ -> continue ui+ MouseDown _ _ _ _ -> continue ui+ MouseUp _ _ _ -> continue ui Help -> case ev of- EvKey (KChar 'q') [] -> halt ui+ VtyEvent (EvKey (KChar 'q') []) -> halt ui _ -> helpHandle ui ev Normal -> case ev of- EvKey (KChar 'q') [] -> halt ui- EvKey KEsc [] -> continue $ resetScreens d ui- EvKey (KChar c) [] | c `elem` ['?'] -> continue $ setMode Help ui- EvKey (KChar 'g') [] -> liftIO (uiReloadJournalIfChanged copts d j ui) >>= continue- EvKey (KChar 'I') [] -> continue $ uiCheckBalanceAssertions d (toggleIgnoreBalanceAssertions ui)- EvKey (KChar 'a') [] -> suspendAndResume $ clearScreen >> setCursorPosition 0 0 >> add copts j >> uiReloadJournalIfChanged copts d j ui- EvKey (KChar 't') [] -> continue $ regenerateScreens j d $ setReportPeriod (DayPeriod d) ui- EvKey (KChar 'E') [] -> suspendAndResume $ void (runEditor pos f) >> uiReloadJournalIfChanged copts d j ui+ VtyEvent (EvKey (KChar 'q') []) -> halt ui+ VtyEvent (EvKey KEsc []) -> continue $ resetScreens d ui+ VtyEvent (EvKey (KChar c) []) | c `elem` ['?'] -> continue $ setMode Help ui+ VtyEvent (EvKey (KChar 'g') []) -> liftIO (uiReloadJournalIfChanged copts d j ui) >>= continue+ VtyEvent (EvKey (KChar 'I') []) -> continue $ uiCheckBalanceAssertions d (toggleIgnoreBalanceAssertions ui)+ VtyEvent (EvKey (KChar 'a') []) -> suspendAndResume $ clearScreen >> setCursorPosition 0 0 >> add copts j >> uiReloadJournalIfChanged copts d j ui+ VtyEvent (EvKey (KChar 't') []) -> continue $ regenerateScreens j d $ setReportPeriod (DayPeriod d) ui+ VtyEvent (EvKey (KChar 'E') []) -> suspendAndResume $ void (runEditor pos f) >> uiReloadJournalIfChanged copts d j ui where (pos,f) = case listSelectedElement rsList of Nothing -> (endPos, journalFilePath j) Just (_, RegisterScreenItem{rsItemTransaction=Transaction{tsourcepos=GenericSourcePos f l c}}) -> (Just (l, Just c),f)- EvKey (KChar 'H') [] -> continue $ regenerateScreens j d $ toggleHistorical ui- EvKey (KChar 'F') [] -> scrollTop >> (continue $ regenerateScreens j d $ toggleFlat ui)- EvKey (KChar 'Z') [] -> scrollTop >> (continue $ regenerateScreens j d $ toggleEmpty ui)- EvKey (KChar 'C') [] -> scrollTop >> (continue $ regenerateScreens j d $ toggleCleared ui)- EvKey (KChar 'U') [] -> scrollTop >> (continue $ regenerateScreens j d $ toggleUncleared ui)- EvKey (KChar 'R') [] -> scrollTop >> (continue $ regenerateScreens j d $ toggleReal ui)- EvKey (KChar '/') [] -> (continue $ regenerateScreens j d $ showMinibuffer ui)- EvKey (KDown) [MShift] -> continue $ regenerateScreens j d $ shrinkReportPeriod d ui- EvKey (KUp) [MShift] -> continue $ regenerateScreens j d $ growReportPeriod d ui- EvKey (KRight) [MShift] -> continue $ regenerateScreens j d $ nextReportPeriod journalspan ui- EvKey (KLeft) [MShift] -> continue $ regenerateScreens j d $ previousReportPeriod journalspan ui- EvKey k [] | k `elem` [KBS, KDel] -> (continue $ regenerateScreens j d $ resetFilter ui)- EvKey k [] | k `elem` [KLeft, KChar 'h'] -> continue $ popScreen ui- EvKey k [] | k `elem` [KRight, KChar 'l'] -> do+ VtyEvent (EvKey (KChar 'H') []) -> continue $ regenerateScreens j d $ toggleHistorical ui+ VtyEvent (EvKey (KChar 'F') []) -> scrollTop >> (continue $ regenerateScreens j d $ toggleFlat ui)+ VtyEvent (EvKey (KChar 'Z') []) -> scrollTop >> (continue $ regenerateScreens j d $ toggleEmpty ui)+ VtyEvent (EvKey (KChar 'C') []) -> scrollTop >> (continue $ regenerateScreens j d $ toggleCleared ui)+ VtyEvent (EvKey (KChar 'U') []) -> scrollTop >> (continue $ regenerateScreens j d $ toggleUncleared ui)+ VtyEvent (EvKey (KChar 'R') []) -> scrollTop >> (continue $ regenerateScreens j d $ toggleReal ui)+ VtyEvent (EvKey (KChar '/') []) -> (continue $ regenerateScreens j d $ showMinibuffer ui)+ VtyEvent (EvKey (KDown) [MShift]) -> continue $ regenerateScreens j d $ shrinkReportPeriod d ui+ VtyEvent (EvKey (KUp) [MShift]) -> continue $ regenerateScreens j d $ growReportPeriod d ui+ VtyEvent (EvKey (KRight) [MShift]) -> continue $ regenerateScreens j d $ nextReportPeriod journalspan ui+ VtyEvent (EvKey (KLeft) [MShift]) -> continue $ regenerateScreens j d $ previousReportPeriod journalspan ui+ VtyEvent (EvKey k []) | k `elem` [KBS, KDel] -> (continue $ regenerateScreens j d $ resetFilter ui)+ VtyEvent (EvKey k []) | k `elem` [KLeft, KChar 'h'] -> continue $ popScreen ui+ VtyEvent (EvKey k []) | k `elem` [KRight, KChar 'l'] -> do case listSelectedElement rsList of Just (_, RegisterScreenItem{rsItemTransaction=t}) -> let@@ -299,7 +302,7 @@ ,tsAccount=rsAccount} ui Nothing -> continue ui -- fall through to the list's event handler (handles [pg]up/down)- ev -> do+ VtyEvent ev -> do let ev' = case ev of EvKey (KChar 'k') [] -> EvKey (KUp) [] EvKey (KChar 'j') [] -> EvKey (KDown) []@@ -307,6 +310,9 @@ newitems <- handleListEvent ev' rsList continue ui{aScreen=s{rsList=newitems}} -- continue =<< handleEventLensed ui someLens ev+ AppEvent _ -> continue ui+ MouseDown _ _ _ _ -> continue ui+ MouseUp _ _ _ -> continue ui where -- Encourage a more stable scroll position when toggling list items (cf AccountsScreen.hs) scrollTop = vScrollToBeginning $ viewportScroll RegisterViewport
Hledger/UI/TransactionScreen.hs view
@@ -102,7 +102,7 @@ tsDraw _ = error "draw function called with wrong screen type, should not happen" -tsHandle :: UIState -> Event -> EventM Name (Next UIState)+tsHandle :: UIState -> BrickEvent Name Event -> EventM Name (Next UIState) tsHandle ui@UIState{aScreen=s@TransactionScreen{tsTransaction=(i,t) ,tsTransactions=nts ,tsAccount=acct}@@ -114,7 +114,7 @@ case mode of Help -> case ev of- EvKey (KChar 'q') [] -> halt ui+ VtyEvent (EvKey (KChar 'q') []) -> halt ui _ -> helpHandle ui ev _ -> do@@ -123,13 +123,13 @@ (iprev,tprev) = maybe (i,t) ((i-1),) $ lookup (i-1) nts (inext,tnext) = maybe (i,t) ((i+1),) $ lookup (i+1) nts case ev of- EvKey (KChar 'q') [] -> halt ui- EvKey KEsc [] -> continue $ resetScreens d ui- EvKey (KChar c) [] | c `elem` ['?'] -> continue $ setMode Help ui- EvKey (KChar 'E') [] -> suspendAndResume $ void (runEditor pos f) >> uiReloadJournalIfChanged copts d j ui+ VtyEvent (EvKey (KChar 'q') []) -> halt ui+ VtyEvent (EvKey KEsc []) -> continue $ resetScreens d ui+ VtyEvent (EvKey (KChar c) []) | c `elem` ['?'] -> continue $ setMode Help ui+ 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)- EvKey (KChar 'g') [] -> do+ VtyEvent (EvKey (KChar 'g') []) -> do d <- liftIO getCurrentDay (ej, _) <- liftIO $ journalReloadIfChanged copts d j case ej of@@ -157,14 +157,14 @@ ,tsTransactions=numberedts ,tsAccount=acct}} continue $ regenerateScreens j' d ui'- EvKey (KChar 'I') [] -> continue $ uiCheckBalanceAssertions d (toggleIgnoreBalanceAssertions ui)+ VtyEvent (EvKey (KChar 'I') []) -> continue $ uiCheckBalanceAssertions d (toggleIgnoreBalanceAssertions ui) -- if allowing toggling here, we should refresh the txn list from the parent register screen -- EvKey (KChar 'E') [] -> continue $ regenerateScreens j d $ stToggleEmpty ui -- EvKey (KChar 'C') [] -> continue $ regenerateScreens j d $ stToggleCleared ui -- EvKey (KChar 'R') [] -> continue $ regenerateScreens j d $ stToggleReal ui- EvKey k [] | k `elem` [KUp, KChar 'k'] -> continue $ regenerateScreens j d ui{aScreen=s{tsTransaction=(iprev,tprev)}}- EvKey k [] | k `elem` [KDown, KChar 'j'] -> continue $ regenerateScreens j d ui{aScreen=s{tsTransaction=(inext,tnext)}}- EvKey k [] | k `elem` [KLeft, KChar 'h'] -> continue ui''+ VtyEvent (EvKey k []) | k `elem` [KUp, KChar 'k'] -> continue $ regenerateScreens j d ui{aScreen=s{tsTransaction=(iprev,tprev)}}+ VtyEvent (EvKey k []) | k `elem` [KDown, KChar 'j'] -> continue $ regenerateScreens j d ui{aScreen=s{tsTransaction=(inext,tnext)}}+ VtyEvent (EvKey k []) | k `elem` [KLeft, KChar 'h'] -> continue ui'' where ui'@UIState{aScreen=scr} = popScreen ui ui'' = ui'{aScreen=rsSelect (fromIntegral i) scr}
Hledger/UI/UITypes.hs view
@@ -50,9 +50,6 @@ import Hledger import Hledger.UI.UIOptions -instance Show (List n e) where show _ = "<List>"-instance Show (Editor l n) where show _ = "<Editor>"- -- | hledger-ui's application state. This holds one or more stateful screens. -- As you navigate through screens, the old ones are saved in a stack. -- The app can be in one of several modes: normal screen operation,@@ -95,7 +92,7 @@ AccountsScreen { sInit :: Day -> Bool -> UIState -> UIState -- ^ function to initialise or update this screen's state ,sDraw :: UIState -> [Widget Name] -- ^ brick renderer for this screen- ,sHandle :: UIState -> Event -> EventM Name (Next UIState) -- ^ brick event handler for this screen+ ,sHandle :: UIState -> BrickEvent Name Event -> EventM Name (Next UIState) -- ^ brick event handler for this screen -- state fields.These ones have lenses: ,_asList :: List Name AccountsScreenItem -- ^ list widget showing account names & balances ,_asSelectedAccount :: AccountName -- ^ a backup of the account name from the list widget's selected item (or "")@@ -103,7 +100,7 @@ | RegisterScreen { sInit :: Day -> Bool -> UIState -> UIState ,sDraw :: UIState -> [Widget Name]- ,sHandle :: UIState -> Event -> EventM Name (Next UIState)+ ,sHandle :: UIState -> BrickEvent Name Event -> EventM Name (Next UIState) -- ,rsList :: List Name RegisterScreenItem -- ^ list widget showing transactions affecting this account ,rsAccount :: AccountName -- ^ the account this register is for@@ -114,7 +111,7 @@ | TransactionScreen { sInit :: Day -> Bool -> UIState -> UIState ,sDraw :: UIState -> [Widget Name]- ,sHandle :: UIState -> Event -> EventM Name (Next UIState)+ ,sHandle :: UIState -> BrickEvent Name Event -> EventM Name (Next UIState) -- ,tsTransaction :: NumberedTransaction -- ^ the transaction we are currently viewing, and its position in the list ,tsTransactions :: [NumberedTransaction] -- ^ list of transactions we can step through@@ -123,7 +120,7 @@ | ErrorScreen { sInit :: Day -> Bool -> UIState -> UIState ,sDraw :: UIState -> [Widget Name]- ,sHandle :: UIState -> Event -> EventM Name (Next UIState)+ ,sHandle :: UIState -> BrickEvent Name Event -> EventM Name (Next UIState) -- ,esError :: String -- ^ error message to show }@@ -136,6 +133,7 @@ ,asItemDisplayAccountName :: AccountName -- ^ full or short account name to display ,asItemRenderedAmounts :: [String] -- ^ rendered amounts }+ deriving (Show) -- | An item in the register screen's list of transactions in the current account. data RegisterScreenItem = RegisterScreenItem {@@ -146,6 +144,7 @@ ,rsItemBalanceAmount :: String -- ^ the balance or running total after this transaction ,rsItemTransaction :: Transaction -- ^ the full transaction }+ deriving (Show) type NumberedTransaction = (Integer, Transaction)
Hledger/UI/UIUtils.hs view
@@ -110,13 +110,13 @@ renderKey (key,desc) = withAttr (borderAttr <> "keys") (str key) <+> str " " <+> str desc -- | Event handler used when help mode is active.-helpHandle :: UIState -> Event -> EventM Name (Next UIState)+helpHandle :: UIState -> BrickEvent Name Event -> EventM Name (Next UIState) helpHandle ui ev = case ev of- EvKey k [] | k `elem` [KEsc, KLeft, KChar 'h', KChar '?'] -> continue $ setMode Normal ui- EvKey (KChar 't') [] -> suspendAndResume $ runHelp >> return ui'- EvKey (KChar 'm') [] -> suspendAndResume $ runMan >> return ui'- EvKey (KChar 'i') [] -> suspendAndResume $ runInfo >> return ui'+ VtyEvent (EvKey k []) | k `elem` [KEsc, KLeft, KChar 'h', KChar '?'] -> continue $ setMode Normal ui+ VtyEvent (EvKey (KChar 't') []) -> suspendAndResume $ runHelp >> return ui'+ VtyEvent (EvKey (KChar 'm') []) -> suspendAndResume $ runMan >> return ui'+ VtyEvent (EvKey (KChar 'i') []) -> suspendAndResume $ runInfo >> return ui' _ -> continue ui where ui' = setMode Normal ui
hledger-ui.cabal view
@@ -3,7 +3,7 @@ -- see: https://github.com/sol/hpack name: hledger-ui-version: 1.0.2+version: 1.0.3 stability: beta category: Finance, Console synopsis: Curses-style user interface for the hledger accounting tool@@ -55,7 +55,7 @@ hs-source-dirs: . ghc-options: -Wall -fno-warn-unused-do-bind -fno-warn-name-shadowing -fno-warn-missing-signatures -fno-warn-type-defaults -fno-warn-orphans- cpp-options: -DVERSION="1.0.2"+ cpp-options: -DVERSION="1.0.3" build-depends: hledger >= 1.0.1 && < 1.1 , hledger-lib >= 1.0.1 && < 1.1@@ -82,7 +82,7 @@ buildable: False else build-depends:- brick >= 0.11 && < 0.12+ brick >= 0.12 && < 0.13 , vty >= 5.5 && < 5.12 if flag(threaded) ghc-options: -threaded