packages feed

tart-0.1: programs/Events/TextEntry.hs

module Events.TextEntry
  ( handleTextEntryEvent
  )
where

import Brick
import qualified Graphics.Vty as V
import Data.Monoid ((<>))
import Lens.Micro.Platform

import Types
import State
import Draw
import Events.Main

handleTextEntryEvent :: AppState -> BrickEvent Name AppEvent -> EventM Name (Next AppState)
handleTextEntryEvent s e = do
    result <- handleAttrEvent s e
    case result of
        Just s' -> continue s'
        Nothing -> handleEvent s e

handleEvent :: AppState -> BrickEvent Name AppEvent -> EventM Name (Next AppState)
handleEvent s (VtyEvent (V.EvKey V.KEnter [])) = do
    -- Commit the text to the drawing and return to main mode
    continue =<< drawTextAtPoint (s^.textEntryStart) (s^.textEntered) (popMode s)
handleEvent s (VtyEvent (V.EvKey V.KBS [])) = do
    continue $ s & textEntered %~ (\t -> if null t then t else init t)
handleEvent s (VtyEvent (V.EvKey V.KEsc [])) =
    -- Cancel
    continue $ popMode s
handleEvent s (VtyEvent (V.EvKey (V.KChar c) [])) | c /= '\t' = do
    -- Enter character
    let s' = s & textEntered %~ (<> [(c, currentPaletteAttribute s)])
    continue $ s' & textEntered .~ truncateText (s'^.textEntryStart) (s'^.textEntered) s'
handleEvent s _ =
    -- Ignore everything else
    continue s