mirror of
https://github.com/simonmichael/hledger.git
synced 2024-12-27 12:24:43 +03:00
imp: ui: Display an error message on invalid regexp, rather than
silently ignoring. (#1394)
This commit is contained in:
parent
e0dc028374
commit
59b4968929
@ -180,7 +180,7 @@ asDraw UIState{aopts=_uopts@UIOpts{uoCliOpts=copts@CliOpts{reportspec_=rspec}}
|
||||
nonblanks = V.takeWhile (not . T.null . asItemAccountName) $ s ^. asList . listElementsL
|
||||
|
||||
bottomlabel = case mode of
|
||||
Minibuffer ed -> minibuffer ed
|
||||
Minibuffer label ed -> minibuffer label ed
|
||||
_ -> quickhelp
|
||||
where
|
||||
quickhelp = borderKeysStr' [
|
||||
@ -242,15 +242,18 @@ asHandle ui0@UIState{
|
||||
ui = ui0{aScreen=scr & asSelectedAccount .~ selacct}
|
||||
|
||||
case mode of
|
||||
Minibuffer ed ->
|
||||
Minibuffer _ ed ->
|
||||
case ev of
|
||||
VtyEvent (EvKey KEsc []) -> continue $ closeMinibuffer ui
|
||||
VtyEvent (EvKey KEnter []) -> continue $ regenerateScreens j d $ setFilter s $ closeMinibuffer ui
|
||||
VtyEvent (EvKey KEnter []) -> continue $ regenerateScreens j d $
|
||||
case setFilter s $ closeMinibuffer ui of
|
||||
Left bad -> showMinibuffer "Cannot compile regular expression" (Just bad) ui
|
||||
Right ui' -> ui'
|
||||
where s = chomp $ unlines $ map strip $ getEditContents ed
|
||||
VtyEvent (EvKey (KChar 'l') [MCtrl]) -> redraw ui
|
||||
VtyEvent (EvKey (KChar 'z') [MCtrl]) -> suspend ui
|
||||
VtyEvent ev -> do ed' <- handleEditorEvent ev ed
|
||||
continue $ ui{aMode=Minibuffer ed'}
|
||||
continue $ ui{aMode=Minibuffer "filter" ed'}
|
||||
AppEvent _ -> continue ui
|
||||
MouseDown{} -> continue ui
|
||||
MouseUp{} -> continue ui
|
||||
@ -311,7 +314,7 @@ asHandle ui0@UIState{
|
||||
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 (KChar '/') []) -> continue $ regenerateScreens j d $ showMinibuffer "filter" Nothing ui
|
||||
VtyEvent (EvKey k []) | k `elem` [KBS, KDel] -> (continue $ regenerateScreens j d $ resetFilter ui)
|
||||
VtyEvent e | e `elem` moveLeftEvents -> continue $ popScreen ui
|
||||
VtyEvent (EvKey (KChar 'l') [MCtrl]) -> scrollSelectionToMiddle _asList >> redraw ui
|
||||
|
@ -227,7 +227,7 @@ rsDraw UIState{aopts=_uopts@UIOpts{uoCliOpts=copts@CliOpts{reportspec_=rspec}}
|
||||
-- query = query_ $ reportopts_ $ cliopts_ opts
|
||||
|
||||
bottomlabel = case mode of
|
||||
Minibuffer ed -> minibuffer ed
|
||||
Minibuffer label ed -> minibuffer label ed
|
||||
_ -> quickhelp
|
||||
where
|
||||
quickhelp = borderKeysStr' [
|
||||
@ -288,15 +288,19 @@ rsHandle ui@UIState{
|
||||
lastnonblankidx = max 0 (length nonblanks - 1)
|
||||
|
||||
case mode of
|
||||
Minibuffer ed ->
|
||||
Minibuffer _ ed ->
|
||||
case ev of
|
||||
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
|
||||
VtyEvent (EvKey KEnter []) -> continue $ regenerateScreens j d $
|
||||
case setFilter s $ closeMinibuffer ui of
|
||||
Left bad -> showMinibuffer "Cannot compile regular expression" (Just bad) ui
|
||||
Right ui' -> ui'
|
||||
where s = chomp . unlines . map strip $ getEditContents ed
|
||||
-- VtyEvent (EvKey (KChar '/') []) -> continue $ regenerateScreens j d $ showMinibuffer ui
|
||||
VtyEvent (EvKey (KChar 'l') [MCtrl]) -> redraw ui
|
||||
VtyEvent (EvKey (KChar 'z') [MCtrl]) -> suspend ui
|
||||
VtyEvent ev -> do ed' <- handleEditorEvent ev ed
|
||||
continue $ ui{aMode=Minibuffer ed'}
|
||||
continue $ ui{aMode=Minibuffer "filter" ed'}
|
||||
AppEvent _ -> continue ui
|
||||
MouseDown{} -> continue ui
|
||||
MouseUp{} -> continue ui
|
||||
@ -342,7 +346,7 @@ rsHandle ui@UIState{
|
||||
VtyEvent (EvKey (KChar 'C') []) -> rsCenterAndContinue $ regenerateScreens j d $ toggleCleared ui
|
||||
VtyEvent (EvKey (KChar 'F') []) -> rsCenterAndContinue $ regenerateScreens j d $ toggleForecast d ui
|
||||
|
||||
VtyEvent (EvKey (KChar '/') []) -> continue $ regenerateScreens j d $ showMinibuffer ui
|
||||
VtyEvent (EvKey (KChar '/') []) -> continue $ regenerateScreens j d $ showMinibuffer "filter" Nothing 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
|
||||
|
@ -7,9 +7,11 @@ module Hledger.UI.UIState
|
||||
where
|
||||
|
||||
import Brick.Widgets.Edit
|
||||
import Data.Bifunctor (first)
|
||||
import Data.Foldable (asum)
|
||||
import Data.Either (fromRight)
|
||||
import Data.List ((\\), foldl', sort)
|
||||
import Data.Maybe (fromMaybe)
|
||||
import Data.Semigroup (Max(..))
|
||||
import qualified Data.Text as T
|
||||
import Data.Text.Zipper (gotoEOL)
|
||||
@ -205,11 +207,9 @@ updateReportPeriod :: (Period -> Period) -> UIState -> UIState
|
||||
updateReportPeriod updatePeriod = fromRight err . overEither period updatePeriod -- PARTIAL:
|
||||
where err = error "updateReportPeriod: updating period should not result in an error"
|
||||
|
||||
-- | Apply a new filter query.
|
||||
setFilter :: String -> UIState -> UIState
|
||||
setFilter s = over reportSpec update
|
||||
where
|
||||
update rspec = fromRight rspec $ setEither querystring (words'' prefixes $ T.pack s) rspec -- XXX silently ignores an error
|
||||
-- | Apply a new filter query, or return the failing query.
|
||||
setFilter :: String -> UIState -> Either String UIState
|
||||
setFilter s = first (const s) . setEither querystring (words'' prefixes $ T.pack s)
|
||||
|
||||
-- | Reset some filters & toggles.
|
||||
resetFilter :: UIState -> UIState
|
||||
@ -264,11 +264,11 @@ updateReportDepth updateDepth ui = over reportSpec update ui
|
||||
| otherwise = Just d
|
||||
|
||||
-- | Open the minibuffer, setting its content to the current query with the cursor at the end.
|
||||
showMinibuffer :: UIState -> UIState
|
||||
showMinibuffer ui = setMode (Minibuffer e) ui
|
||||
showMinibuffer :: T.Text -> Maybe String -> UIState -> UIState
|
||||
showMinibuffer label moldq ui = setMode (Minibuffer label e) ui
|
||||
where
|
||||
e = applyEdit gotoEOL $ editor MinibufferEditor (Just 1) oldq
|
||||
oldq = T.unpack . T.unwords . map textQuoteIfNeeded $ ui^.querystring
|
||||
oldq = fromMaybe (T.unpack . T.unwords . map textQuoteIfNeeded $ ui^.querystring) moldq
|
||||
|
||||
-- | Close the minibuffer, discarding any edit in progress.
|
||||
closeMinibuffer :: UIState -> UIState
|
||||
|
@ -69,7 +69,7 @@ data UIState = UIState {
|
||||
data Mode =
|
||||
Normal
|
||||
| Help
|
||||
| Minibuffer (Editor String Name)
|
||||
| Minibuffer Text (Editor String Name)
|
||||
deriving (Show,Eq)
|
||||
|
||||
-- Ignore the editor when comparing Modes.
|
||||
|
@ -176,11 +176,11 @@ helpHandle ui ev = do
|
||||
ui' = setMode Normal ui
|
||||
closeHelpEvents = moveLeftEvents ++ [EvKey KEsc [], EvKey (KChar '?') [], EvKey (KChar 'q') []]
|
||||
|
||||
-- | Draw the minibuffer.
|
||||
minibuffer :: Editor String Name -> Widget Name
|
||||
minibuffer ed =
|
||||
-- | Draw the minibuffer with the given label.
|
||||
minibuffer :: T.Text -> Editor String Name -> Widget Name
|
||||
minibuffer string ed =
|
||||
forceAttr ("border" <> "minibuffer") $
|
||||
hBox [txt "filter: ", renderEditor (str . unlines) True ed]
|
||||
hBox [txt $ string <> ": ", renderEditor (str . unlines) True ed]
|
||||
|
||||
borderQueryStr :: String -> Widget Name
|
||||
borderQueryStr "" = str ""
|
||||
|
Loading…
Reference in New Issue
Block a user