Nice keyboard inputs in Elm.
It is quite tedious to find out the currently pressed down keys with just the Keyboard module, so this package aims to make it easier.
You can use Keyboard.Extra in two ways:
If you use the "Intelligent Helper" way, you will get the most help, such as:
Key type, such as ArrowUp, CharA and EnterShift is pressed down when any kind of a Msg happens in your program{ x : Int, y : Int } or as a union type (e.g. South, NorthEast)When using the library like this, it follows The Elm Architecture.
There is a full example module in the source repository.
In essence, Keyboard.Extra is just another component in your program. It has a model (called State), an update function and some subscriptions. Below are the necessary parts to wire things up. Once that is done, you can get useful information using the numerous helper functions such as isPressed, arrows and arrowsDirection.
Include the Keyboard.Extra state in your program's model
type alias Model =
{ keyboardState : Keyboard.Extra.State
, otherThing : Int
-- ...
}
init : ( Model, Cmd Msg )
init =
( { keyboardState = Keyboard.Extra.initialState
, otherThing = 0
-- ...
}
, Cmd.none
)Add the message type in your messages
type Msg
= KeyboardExtraMsg Keyboard.Extra.Msg
-- ...Include the subscriptions for the events to come through
subscriptions : Model -> Sub Msg
subscriptions model =
Sub.batch
[ Sub.map KeyboardExtraMsg Keyboard.Extra.subscriptions
-- ...
]And finally, let it update its model
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
KeyboardExtraMsg keyMsg ->
( { model | keyboardState = Keyboard.Extra.update keyMsg model.keyboardState }
, Cmd.none
)
-- ...Now you can get all the information anywhere where you have access to the model, for example like so:
calculateSpeed : Model -> Float
calculateSpeed model =
let
arrows =
Keyboard.Extra.arrows model.keyboardState
in
model.currentSpeed + arrows.xHave fun! :)
PS. The Tracking Key Changes example shows how to use updateWithKeyChange to find out exactly which key was pressed down / released on that update cycle.
With the "plain subscriptions" way, you get the bare minimum:
Key type, such as ArrowUp, CharA and EnterSetting up is very straight-forward, though:
type Msg
= KeyDown Key
| KeyUp Key
-- ...
subscriptions : Model -> Sub Msg
subscriptions model =
Sub.batch
[ Keyboard.Extra.downs KeyDown
, Keyboard.Extra.ups KeyUp
-- ...
]There's an example for this, too: Plain Subscriptions