diff options
Diffstat (limited to 'src/Much/Core.hs')
| -rw-r--r-- | src/Much/Core.hs | 46 |
1 files changed, 25 insertions, 21 deletions
diff --git a/src/Much/Core.hs b/src/Much/Core.hs index 1c8daa7..b7f833a 100644 --- a/src/Much/Core.hs +++ b/src/Much/Core.hs @@ -1,38 +1,42 @@ -{-# LANGUAGE LambdaCase #-} -{-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} + module Much.Core where -import Blessings.String.WCWidth (Blessings(Plain,SGR),pp) +import Blessings (Blessings(SGR),pp) import Control.Concurrent import Control.Monad import Data.Aeson import Data.Functor import Data.Functor.Identity +import Data.Map qualified as M import Data.Maybe +import Data.MonoTraversable (ointercalate) +import Data.Sequences qualified as S +import Data.String (fromString) +import Data.Text qualified as T +import Data.Text.IO qualified as T import Data.Time +import Data.Tree.Zipper qualified as Z +import Data.WText (WText(unWText)) import Much.API import Much.Action +import Much.Config qualified as Config import Much.Event import Much.RenderTreeView (renderTreeView) import Much.Screen import Much.State import Much.TreeSearch import Much.TreeView -import Much.Utils +import Notmuch qualified import Options.Applicative import Scanner (scan,Scan(..)) +import System.Console.Terminal.Size qualified as Term import System.Environment import System.Exit import System.IO import System.Posix.Signals -import qualified Blessings.Internal as Blessings -import qualified Data.Map as M -import qualified Data.Tree.Zipper as Z -import qualified Much.Config as Config -import qualified Notmuch -import qualified System.Console.Terminal.Size as Term + importConfig :: Config.Config -> State -> State importConfig config state = state @@ -180,13 +184,13 @@ processEvent q = \case EResize w h -> return $ Right q { screenWidth = w, screenHeight = h - , flashMessage = Plain $ "resize " <> show (w,h) + , flashMessage = fromString $ "resize " <> show (w,h) } EStateGet f -> forkIO (f q) $> Right q ev -> return $ Right q - { flashMessage = SGR [31,1] $ Plain $ "unhandled event: " <> show ev + { flashMessage = SGR [31,1] $ fromString $ "unhandled event: " <> show ev } @@ -198,18 +202,18 @@ render q@State{..} = where newTreeBuf = renderTreeView q (Z.root cursor) newHeadBuf = - [ Plain (show screenWidth) <> "x" <> Plain (show screenHeight) - <> " " <> Plain (show $ linearPos cursor - yoffset) - <> " " <> Plain (show $ topOverrun q) - <> " " <> Plain (show $ botOverrun q) + [ fromString (show screenWidth) <> "x" <> fromString (show screenHeight) + <> " " <> fromString (show $ linearPos cursor - yoffset) + <> " " <> fromString (show $ topOverrun q) + <> " " <> fromString (show $ botOverrun q) <> " " <> flashMessage - <> " " <> Plain (show (xoffset, yoffset)) + <> " " <> fromString (show (xoffset, yoffset)) ] -render0 :: State -> [Blessings String] +render0 :: State -> [Blessings WText] render0 _q@State{..} = do let buffer = - map (Blessings.take screenWidth . Blessings.drop xoffset) $ + map (S.take screenWidth . S.drop xoffset) $ take screenHeight $ headBuffer ++ drop yoffset treeBuffer buffer ++ replicate (screenHeight - length buffer) "~" @@ -217,11 +221,11 @@ render0 _q@State{..} = do redraw :: State -> IO () redraw q@State{..} = do - hPutStr stdout $ map (sub '\t' ' ') $ "\ESC[H" ++ pp (mintercalate "\n" $ map eraseRight $ render0 q) + T.hPutStr stdout $ T.map (sub '\t' ' ') $ unWText $ "\ESC[H" <> pp (ointercalate "\n" $ map eraseRight $ render0 q) hFlush stdout where sub x x' c = if c == x then x' else c eraseRight s = - if Blessings.length s < screenWidth + if S.lengthIndex s < screenWidth then s <> "\ESC[K" else s |
