packages feed

LambdaHack-0.1.20110117: src/Display/Vty.hs

module Display.Vty
  (displayId, startup, shutdown,
   display, nextEvent, setBold, setBG, setFG, Session,
   white, black, yellow, blue, magenta, red, green, attr, Attr) where

import Graphics.Vty as V
import Data.List as L
import Data.Char
import qualified Data.ByteString as BS

import Geometry
import Keys as K

displayId = "vty"

type Session = V.Vty

startup :: (Session -> IO ()) -> IO ()
startup k = V.mkVty >>= k

display :: Area -> Session -> (Loc -> (Attr, Char)) -> String -> String -> IO ()
display ((y0,x0),(y1,x1)) vty f msg status =
    let img = (foldr (<->) V.empty_image .
               L.map (foldr (<|>) V.empty_image .
                      L.map (\ (x,y) -> let (a,c) = f (y,x) in char a c)))
              [ [ (x,y) | x <- [x0..x1] ] | y <- [y0..y1] ]
    in  V.update vty (pic_for_image
         (utf8_bytestring attr (BS.pack (L.map (fromIntegral . ord) (toWidth (x1 - x0 + 1) msg))) <->
          img <-> 
          utf8_bytestring attr (BS.pack (L.map (fromIntegral . ord) (toWidth (x1 - x0 + 1) status)))))

toWidth :: Int -> String -> String
toWidth n x = take n (x ++ repeat ' ')

keyTranslate :: V.Event -> Maybe K.Key
keyTranslate e =
  case e of
    V.EvKey KEsc []         -> Just K.Esc
    V.EvKey KEnter []       -> Just K.Return
    V.EvKey KUp []          -> Just K.Up
    V.EvKey KDown []        -> Just K.Down
    V.EvKey KLeft []        -> Just K.Left
    V.EvKey KRight []       -> Just K.Right
    V.EvKey KHome []        -> Just K.Home
    V.EvKey KPageUp []      -> Just K.PgUp
    V.EvKey KEnd []         -> Just K.End
    V.EvKey KPageDown []    -> Just K.PgDn
    V.EvKey KBegin []       -> Just K.Begin
    V.EvKey (KASCII c) []   -> Just (K.Char c)
    _                       -> Nothing

nextEvent :: Session -> IO K.Key
nextEvent session =
  do
    e <- V.next_event session
    maybe (nextEvent session) return (keyTranslate e)

attr = def_attr

setBold a = with_style a bold

setBG c a = with_back_color a c

setFG c a = with_fore_color a c