fearOfView-0.1.0.3: KeyBindings.hs
module KeyBindings (KeyBindings, defaultBindings, findBindings, findBinding, showKey,
showKeyChar, showKeyFriendly, showKeyFriendlyShort, dvorakViBindings) where
import Data.Bits (xor)
import Data.Char
import Data.List
import Data.Maybe
import qualified Command as C
import qualified Inventory as I
import qualified Pos as P
type KeyBindings = [ (Char,C.Command) ]
ctrl, unctrl, meta, unmeta :: Char -> Char
ctrl = toEnum . xor 64 . fromEnum
meta = toEnum . xor 128 . fromEnum
unctrl = ctrl
unmeta = meta
lowerToo :: KeyBindings -> KeyBindings
lowerToo = concatMap addLower
where addLower b@(c, cmd) = [ b, (toLower c, cmd) ]
quitBindings, qwertyViBindings, wasdBindings, dvorakViBindings, cursorBindings, actionBindings, basicBindings, defaultBindings :: KeyBindings
quitBindings = lowerToo
[ ('Q', C.Quit)
, (ctrl '[', C.Quit)
, (ctrl 'C', C.Quit) ]
qwertyViBindings = lowerToo
[ ('H', C.Dir P.DLeft)
, ('J', C.Dir P.DDown)
, ('K', C.Dir P.DUp)
, ('L', C.Dir P.DRight)
]
dvorakViBindings =
[ ('h', C.Dir P.DLeft)
, ('t', C.Dir P.DDown)
, ('n', C.Dir P.DUp)
, ('s', C.Dir P.DRight)
]
wasdBindings = lowerToo
[ ('A', C.Dir P.DLeft)
, ('Z', C.Dir P.DLeft) -- for AZERTY
, ('S', C.Dir P.DDown)
, ('W', C.Dir P.DUp)
, ('D', C.Dir P.DRight)
]
cursorBindings =
[ ('←', C.Dir P.DLeft)
, ('↓', C.Dir P.DDown)
, ('↑', C.Dir P.DUp)
, ('→', C.Dir P.DRight)
]
actionBindings = [ (chr $ ord '1' + (slot-1), C.UseInv slot) | slot <- I.slots ]
<> [ ('0', C.UsePower) ]
basicBindings =
[ (' ', C.Accept)
, ('\r', C.Accept)
, ('\n', C.Accept)
, ('\f', C.Redraw)
, (ctrl 'Z', C.Suspend)
, ('t', C.SkipTutorial)
, ('T', C.SkipTutorial)
, ('-', C.ToggleAscii)
]
debugBindings :: KeyBindings
debugBindings =
[ ('P', C.DebugAddPower)
, ('J', C.DebugAddJunk)
, ('I', C.DebugAddItems)
, ('E', C.DebugExit)
]
defaultBindings = quitBindings <> debugBindings <> wasdBindings <> qwertyViBindings <> cursorBindings <> actionBindings <> basicBindings
findBindings :: KeyBindings -> C.Command -> [Char]
findBindings bdgs cmd = nub
$ [ ch | (ch,cmd') <- bdgs, cmd'==cmd ]
findBinding :: KeyBindings -> C.Command -> Maybe Char
findBinding = (listToMaybe.) . findBindings
showKey :: Char -> String
showKey ch
| isAscii (unmeta ch) = 'M':'-':showKey (unmeta ch)
| isPrint ch = [ch]
| isPrint (unctrl ch) = '^':[unctrl ch]
| otherwise = "[?]"
showKeyFriendly, showKeyFriendlyShort :: Char -> String
showKeyFriendly ' ' = "space"
showKeyFriendly '\r' = "return"
showKeyFriendly '\n' = "newline"
showKeyFriendly '\t' = "tab"
showKeyFriendly '\b' = "bksp"
showKeyFriendly ch = showKey ch
showKeyFriendlyShort '\r' = "ret"
showKeyFriendlyShort '\t' = "tab"
showKeyFriendlyShort '\b' = "bksp"
showKeyFriendlyShort ch = showKey ch
showKeyChar :: Char -> Char
showKeyChar ch
| isAscii (unmeta ch) = '['
| isPrint ch = ch
| isPrint (unctrl ch) = '^'
| otherwise = '?'