packages feed

zwirn-0.2.3.1: app/zwirnmill/UI.hs

module UI where

import Brick hiding (on)
import Control.Monad (when)
import Control.Monad.RWS
import EnvBrowser.Event (updateEnvBrowser)
import qualified Graphics.Vty as V
import qualified Graphics.Vty.CrossPlatform as VCP
import System.IO (hFlush, stdout)
import UI.Attributes
import UI.Core
import UI.Draw
import UI.Event

app :: App AppState AppEvent Name
app =
  App
    { appDraw = drawUI,
      appChooseCursor = showFirstCursor,
      appHandleEvent = handleEvent,
      appStartEvent = setLineCursor >> updateEnvBrowser,
      appAttrMap = const attributeMap
    }

runUI :: AppState -> IO AppState
runUI initialState = do
  let buildVty = VCP.mkVty V.defaultConfig {V.configInputMap = [(Nothing, "\ESC[13;5u", V.EvKey V.KEnter [V.MCtrl])]}
  vty <- buildVty
  let output = V.outputIface vty
  when (V.supportsMode output V.Mouse) $
    V.setMode output V.Mouse True
  when (V.supportsMode output V.BracketedPaste) $
    V.setMode output V.BracketedPaste True
  customMain vty buildVty (Just $ asChan initialState) app initialState {asVtyOutput = Just output}

setLineCursor :: EventM n s ()
setLineCursor = liftIO $ do
  putStr "\ESC[5 q"
  hFlush stdout