From c6e2784eeb00928468f9007ed54d13720c31cfb2 Mon Sep 17 00:00:00 2001 From: Simon Michael Date: Mon, 31 Oct 2016 08:06:29 -0700 Subject: [PATCH] ui: use brick 0.12, bump version to 1.0.3 --- hledger-ui/CHANGES | 5 ++ hledger-ui/Hledger/UI/AccountsScreen.hs | 91 ++++++++++++---------- hledger-ui/Hledger/UI/ErrorScreen.hs | 16 ++-- hledger-ui/Hledger/UI/Main.hs | 3 +- hledger-ui/Hledger/UI/RegisterScreen.hs | 64 ++++++++------- hledger-ui/Hledger/UI/TransactionScreen.hs | 22 +++--- hledger-ui/Hledger/UI/UITypes.hs | 13 ++-- hledger-ui/Hledger/UI/UIUtils.hs | 10 +-- hledger-ui/hledger-ui.cabal | 6 +- hledger-ui/package.yaml | 6 +- stack-ghc7.10.yaml | 2 +- stack.yaml | 2 +- 12 files changed, 128 insertions(+), 112 deletions(-) diff --git a/hledger-ui/CHANGES b/hledger-ui/CHANGES index 100793f44..f5309258a 100644 --- a/hledger-ui/CHANGES +++ b/hledger-ui/CHANGES @@ -2,6 +2,11 @@ User-visible changes in hledger-ui. 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 diff --git a/hledger-ui/Hledger/UI/AccountsScreen.hs b/hledger-ui/Hledger/UI/AccountsScreen.hs index 6ee6b32dc..953e17d35 100644 --- a/hledger-ui/Hledger/UI/AccountsScreen.hs +++ b/hledger-ui/Hledger/UI/AccountsScreen.hs @@ -247,7 +247,7 @@ asDrawItem (acctwidth, balwidth) selected AccountsScreenItem{..} = 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 @@ asHandle ui0@UIState{ 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 @@ asHandle ui0@UIState{ 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 @@ asHandle ui0@UIState{ & 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. diff --git a/hledger-ui/Hledger/UI/ErrorScreen.hs b/hledger-ui/Hledger/UI/ErrorScreen.hs index b0cea4fda..59a942dd7 100644 --- a/hledger-ui/Hledger/UI/ErrorScreen.hs +++ b/hledger-ui/Hledger/UI/ErrorScreen.hs @@ -68,7 +68,7 @@ esDraw UIState{ --aopts=UIOpts{cliopts_=copts@CliOpts{}} 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 @@ esHandle ui@UIState{ 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" diff --git a/hledger-ui/Hledger/UI/Main.hs b/hledger-ui/Hledger/UI/Main.hs index 4e8b650d3..6684ad788 100644 --- a/hledger-ui/Hledger/UI/Main.hs +++ b/hledger-ui/Hledger/UI/Main.hs @@ -137,8 +137,7 @@ runBrickUi uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}} j = do 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 diff --git a/hledger-ui/Hledger/UI/RegisterScreen.hs b/hledger-ui/Hledger/UI/RegisterScreen.hs index f5138ffba..141995764 100644 --- a/hledger-ui/Hledger/UI/RegisterScreen.hs +++ b/hledger-ui/Hledger/UI/RegisterScreen.hs @@ -236,7 +236,7 @@ rsDrawItem (datewidth,descwidth,acctswidth,changewidth,balwidth) selected Regist 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 @@ rsHandle ui@UIState{ 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 @@ rsHandle ui@UIState{ ,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 @@ rsHandle ui@UIState{ 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 diff --git a/hledger-ui/Hledger/UI/TransactionScreen.hs b/hledger-ui/Hledger/UI/TransactionScreen.hs index f0c810146..332ada3c3 100644 --- a/hledger-ui/Hledger/UI/TransactionScreen.hs +++ b/hledger-ui/Hledger/UI/TransactionScreen.hs @@ -102,7 +102,7 @@ tsDraw UIState{aopts=UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}} 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 @@ tsHandle ui@UIState{aScreen=s@TransactionScreen{tsTransaction=(i,t) 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 @@ tsHandle ui@UIState{aScreen=s@TransactionScreen{tsTransaction=(i,t) (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 @@ tsHandle ui@UIState{aScreen=s@TransactionScreen{tsTransaction=(i,t) ,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} diff --git a/hledger-ui/Hledger/UI/UITypes.hs b/hledger-ui/Hledger/UI/UITypes.hs index 02f6225cb..008cb3e9d 100644 --- a/hledger-ui/Hledger/UI/UITypes.hs +++ b/hledger-ui/Hledger/UI/UITypes.hs @@ -50,9 +50,6 @@ import Text.Show.Functions () import Hledger import Hledger.UI.UIOptions -instance Show (List n e) where show _ = "" -instance Show (Editor l n) where show _ = "" - -- | 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 @@ data Screen = 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 @@ data Screen = | 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 @@ data Screen = | 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 @@ data Screen = | 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 @@ data AccountsScreenItem = AccountsScreenItem { ,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 @@ data RegisterScreenItem = RegisterScreenItem { ,rsItemBalanceAmount :: String -- ^ the balance or running total after this transaction ,rsItemTransaction :: Transaction -- ^ the full transaction } + deriving (Show) type NumberedTransaction = (Integer, Transaction) diff --git a/hledger-ui/Hledger/UI/UIUtils.hs b/hledger-ui/Hledger/UI/UIUtils.hs index ed2cb4e48..66664a908 100644 --- a/hledger-ui/Hledger/UI/UIUtils.hs +++ b/hledger-ui/Hledger/UI/UIUtils.hs @@ -110,13 +110,13 @@ helpDialog = 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 diff --git a/hledger-ui/hledger-ui.cabal b/hledger-ui/hledger-ui.cabal index afa0adde9..971318622 100644 --- a/hledger-ui/hledger-ui.cabal +++ b/hledger-ui/hledger-ui.cabal @@ -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 @@ executable hledger-ui 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 @@ executable hledger-ui 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 diff --git a/hledger-ui/package.yaml b/hledger-ui/package.yaml index cbd70e4f6..60ebdf4f3 100644 --- a/hledger-ui/package.yaml +++ b/hledger-ui/package.yaml @@ -1,5 +1,5 @@ name : hledger-ui -version : '1.0.2' +version : '1.0.3' synopsis : Curses-style user interface for the hledger accounting tool description : | This is hledger's curses-style interface. @@ -35,7 +35,7 @@ flags: description: If building with time < 1.5, also depend on old-locale. Set automatically by cabal. manual: false default: false -cpp-options: -DVERSION="1.0.2" +cpp-options: -DVERSION="1.0.3" executables: hledger-ui: source-dirs: . @@ -85,7 +85,7 @@ executables: buildable: false else: dependencies: - - brick >= 0.11 && < 0.12 + - brick >= 0.12 && < 0.13 - vty >= 5.5 && < 5.12 - condition: flag(threaded) ghc-options: -threaded diff --git a/stack-ghc7.10.yaml b/stack-ghc7.10.yaml index 86191a202..dfc6879b6 100644 --- a/stack-ghc7.10.yaml +++ b/stack-ghc7.10.yaml @@ -11,6 +11,6 @@ packages: - hledger-api extra-deps: -- brick-0.11 +- brick-0.12 - text-zipper-0.8.1 - megaparsec-5.1.2 diff --git a/stack.yaml b/stack.yaml index cf2990701..3d8403312 100644 --- a/stack.yaml +++ b/stack.yaml @@ -12,7 +12,7 @@ packages: extra-deps: # for hledger-ui: -- brick-0.11 +- brick-0.12 - text-zipper-0.8.1 - vty-5.11.3 # for hledger-web: