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