diff options
-rw-r--r-- | Notmuch.hs | 13 | ||||
-rw-r--r-- | ThreadView.hs | 56 | ||||
-rw-r--r-- | env.nix | 1 | ||||
-rw-r--r-- | test3.hs | 25 |
4 files changed, 72 insertions, 23 deletions
@@ -89,15 +89,14 @@ notmuch args = do -- BS.hGetContents hout -search :: String -> IO () -search term = do - c <- notmuch [ "search", "--format=json", "--format-version=2", term ] +search :: String -> IO (Either String [SearchResult]) +search term = + notmuch [ "search", "--format=json", "--format-version=2", term ] + >>= return . eitherDecode' - let results = case eitherDecode' c :: Either String [SearchResult] of - Left err -> error err - Right x -> x - mapM_ (T.putStrLn . drawSearchResult) results +putSearchResults :: [SearchResult] -> IO () +putSearchResults = mapM_ (T.putStrLn . drawSearchResult) showThread :: String -> IO () diff --git a/ThreadView.hs b/ThreadView.hs index d9bf4a1..1c908bb 100644 --- a/ThreadView.hs +++ b/ThreadView.hs @@ -29,9 +29,8 @@ import qualified Data.Text as T --import System.IO --import qualified Data.Map as M ---import Notmuch.SearchResult import Notmuch.Message ---import Notmuch +import Notmuch.SearchResult import Safe @@ -42,6 +41,8 @@ data ThreadView = TVMessage Message | TVMessagePart Message MessagePart | TVMessageLine Message MessagePart LineNr String + | TVSearch String + | TVSearchResult SearchResult deriving (Show) instance Eq ThreadView where @@ -54,13 +55,21 @@ instance Eq ThreadView where TVMessageLine m1 mp1 ln1 _s1 == TVMessageLine m2 mp2 ln2 _s2 = m1 == m2 && mp1 == mp2 && ln1 == ln2 + TVSearch s1 == TVSearch s2 = + s1 == s2 + + TVSearchResult s1 == TVSearchResult s2 = + s1 == s2 + _ == _ = False describe :: ThreadView -> String -describe (TVMessage m) = "TVMessage" <> unMessageID (messageId m) +describe (TVMessage m) = "TVMessage " <> unMessageID (messageId m) describe (TVMessagePart m p) = "TVMessagePart " <> (unMessageID $ messageId m) <> " " <> show (partID p) describe (TVMessageLine _ _ _ s) = "TVMessageLine " <> show s +describe (TVSearch s) = "TVSearch " <> show s +describe (TVSearchResult sr) = "TVSearchResult " <> show (searchTotal sr) focusPrev :: Tree ThreadView -> Maybe ThreadView -> Maybe ThreadView @@ -92,6 +101,11 @@ findTV x = find (==x) . flatten +fromSearchResults :: String -> [SearchResult] -> Tree ThreadView +fromSearchResults query = + Node (TVSearch query) . map (\r -> Node (TVSearchResult r) []) + + fromMessageTree :: Tree Message -> Tree ThreadView fromMessageTree (Node m ms) = Node m' ms' @@ -157,6 +171,27 @@ threadViewImage hasFocus = \case TVMessageLine _ _ _ s -> string ml s + TVSearch s -> + string sColor s + + TVSearchResult sr -> do + let ThreadID tid = searchThread sr + --string srColor tid + -- <|> + --translateX 1 + (string srColor $ padl 11 ' ' $ T.unpack $ searchDateRel sr) + <|> + string srColor " (" + <|> + (string srColor $ show $ searchMatched sr) + <|> + string srColor ")" + <|> + string srColor " " + -- <|> + -- (string srColor $ show $ searchTime sr) + <|> + (string srColor $ T.unpack $ searchSubject sr) where --c1 = if hasFocus then c1_focus else c1_nofocus --c1_nofocus = withForeColor def $ Color240 $ -16 + 238 @@ -188,4 +223,19 @@ threadViewImage hasFocus = \case mp_y = withForeColor def $ color 199 mp_n = withForeColor def $ color 162 + sColor = if hasFocus then sColor_y else sColor_n + sColor_y = withForeColor def $ color 196 + sColor_n = withForeColor def $ color 88 + + srColor = if hasFocus then srColor_y else srColor_n + srColor_y = withForeColor def $ color 197 + srColor_n = withForeColor def $ color 89 + color i = Color240 $ -16 + i + + + +padl n c s = + if length s < n + then padl n c (c:s) + else s @@ -29,6 +29,7 @@ let #conduit #conduitExtra process + rosezipper safe ] ); @@ -18,6 +18,7 @@ import Graphics.Vty --import Data.String --import Data.Traversable import Data.Tree +import qualified Data.Tree.Zipper as Z --import qualified Data.ByteString as BS import qualified Data.ByteString.Lazy as LBS --import qualified Data.ByteString.Char8 as BS8 @@ -30,15 +31,16 @@ import qualified Data.Text as T --import System.IO --import qualified Data.Map as M ---import Notmuch.SearchResult +import Notmuch import Notmuch.Message -import Notmuch -- hiding (focusPrev, focusNext) +import Notmuch.SearchResult --import Safe import Control.Exception import ThreadView +import TreeSearch @@ -67,18 +69,15 @@ import ThreadView -- msgs = flatten t -toggleTag :: T.Text -> ThreadView -> IO () -toggleTag tag = \case - TVMessage m -> f m - _ -> return () +toggleTag :: T.Text -> Message -> IO () +toggleTag tag m = do + _ <- if tag `elem` messageTags m + then + unsetTag tagString (unMessageID $ messageId m) + else + setTag tagString (unMessageID $ messageId m) + return () where - f m = do - _ <- if tag `elem` messageTags m - then - unsetTag tagString (unMessageID $ messageId m) - else - setTag tagString (unMessageID $ messageId m) - return () tagString = T.unpack tag |