packages feed

zwirn-0.2.3.1: app/zwirnmill/EnvBrowser/Event.hs

module EnvBrowser.Event where

import Brick (BrickEvent (..), EventM, modify, vScrollBy, viewportScroll)
import Brick.Types (gets)
import Control.Monad (when)
import qualified Data.Map as Map
import qualified Data.Text as T
import qualified Data.Vector as V
import qualified Graphics.Vty as V
import UI.Core (AppState (..), Content (..), EnvBrowser (..), Name (..), Window (..))
import Zwirn.Language.Compiler (Environment (..))
import Zwirn.Language.Environment (InterpreterEnv (..))

handleEnvBrowserEvent :: EnvBrowser -> BrickEvent Name e -> EventM Name AppState EnvBrowser
handleEnvBrowserEvent s (VtyEvent (V.EvKey (V.KChar '\t') _)) = return s
handleEnvBrowserEvent (EnvB search vs) (VtyEvent (V.EvKey (V.KChar x) _)) = return (EnvB (T.snoc search x) vs)
handleEnvBrowserEvent (EnvB search vs) (VtyEvent (V.EvKey V.KBS _)) = case T.unsnoc search of
  Just (rest, _) -> return (EnvB rest vs)
  Nothing -> return (EnvB T.empty vs)
handleEnvBrowserEvent s (MouseDown name V.BScrollUp _ _) = when (isEnv name) (vScrollBy (viewportScroll EnvBrowserViewport) (-1)) >> return s
handleEnvBrowserEvent s (MouseDown name V.BScrollDown _ _) = when (isEnv name) (vScrollBy (viewportScroll EnvBrowserViewport) 1) >> return s
handleEnvBrowserEvent s _ = return s

isEnv :: Name -> Bool
isEnv EnvBrowser = True
isEnv EnvBrowserViewport = True
isEnv _ = False

updateEnvBrowser :: EventM Name AppState ()
updateEnvBrowser = do
  newenv <- gets $ V.fromList . Map.keys . eExpressions . intEnv . asEnvironment
  let alt (Just (Window x y (EnvBrowserContent (EnvB search _)) z l)) = Just $ Window x y (EnvBrowserContent $ EnvB search newenv) z l
      alt _ = Nothing
  modify $ \as -> as {asWindows = Map.alter alt EnvBrowser $ asWindows as}