packages feed

Level0-1.0: src/Graphics/UI/SDL/Extra/Keys.hs

module Graphics.UI.SDL.Extra.Keys where
import Graphics.UI.SDL hiding (init)
import Data.Char (isAlphaNum, isSpace)

keyToChar :: SDLKey -> Maybe Char
keyToChar SDLK_a = Just 'a'
keyToChar SDLK_b = Just 'b'
keyToChar SDLK_c = Just 'c'
keyToChar SDLK_d = Just 'd'
keyToChar SDLK_e = Just 'e'
keyToChar SDLK_f = Just 'f'
keyToChar SDLK_g = Just 'g'
keyToChar SDLK_h = Just 'h'
keyToChar SDLK_i = Just 'i'
keyToChar SDLK_j = Just 'j'
keyToChar SDLK_k = Just 'k'
keyToChar SDLK_l = Just 'l'
keyToChar SDLK_m = Just 'm'
keyToChar SDLK_n = Just 'n'
keyToChar SDLK_o = Just 'o'
keyToChar SDLK_p = Just 'p'
keyToChar SDLK_q = Just 'q'
keyToChar SDLK_r = Just 'r'
keyToChar SDLK_s = Just 's'
keyToChar SDLK_t = Just 't'
keyToChar SDLK_u = Just 'u'
keyToChar SDLK_v = Just 'v'
keyToChar SDLK_w = Just 'w'
keyToChar SDLK_x = Just 'x'
keyToChar SDLK_y = Just 'y'
keyToChar SDLK_z = Just 'z' 
keyToChar SDLK_SPACE = Just ' '
keyToChar SDLK_BACKSPACE = Just '\DEL'
keyToChar SDLK_UNDERSCORE = Just '_'
keyToChar SDLK_RETURN = Just '\n'
keyToChar SDLK_MINUS = Just '-'
keyToChar _ = Nothing

getStringAndDo :: (String -> IO ()) -> IO (Maybe String)
getStringAndDo f = loop ""
  where
    good :: String -> Maybe String
    good "" = Nothing
    good s  = if all (\i -> isAlphaNum i || isSpace i) s then Just s else Nothing

    loop :: String -> IO (Maybe String)
    loop [] = f [] >> pollEvent >>= \event -> 
        case event of
            KeyDown (Keysym SDLK_RETURN _ _)    -> return Nothing
            KeyDown (Keysym key _ _)            -> loop $ maybe "" (:[]) (keyToChar key)
            _                                   -> loop []

    loop line = f line >> pollEvent >>= \event ->
        case event of
            KeyDown (Keysym SDLK_RETURN _ _)    -> return (good line)
            KeyDown (Keysym SDLK_BACKSPACE _ _) -> loop $ init line
            KeyDown (Keysym key _ _)            -> loop $ maybe line ((line ++) . (:[])) (keyToChar key)
            _                                   -> loop line