如何在我的Elm应用程序中构建键盘组合,例如。 " shift + alt +输入"?你会做这样的事情来对按下的一个键做出反应(例如回车键):
import Keyboard
type Msg
= KeyDown Keyboard.KeyCode
type alias Model =
...
update msg model =
case msg of
KeyDown key ->
handleKeyDown key model
subscriptions model =
Sub.batch
[
Keyboard.downs KeyDown
]
handleKeyDown key model =
case key of
13 -> -- Enter key
Debug.log "Other key"
model
_ -> -- Any other key
Debug.log "Other key"
model
view model =
...
但是如何按下多个按键呢?
答案 0 :(得分:4)
您可以使用Keyboard.downs
作为pdoherty926以及Set
来跟踪按下的键。您还需要查看Keyboard.ups
以了解密钥何时发布。
这是一个有效的例子:
import Html exposing (..)
import Html.App exposing (program)
import Keyboard exposing (..)
import Set exposing (Set)
import Char
main =
program { init = (initialModel, Cmd.none), view = view, update = update, subscriptions = subscriptions }
initialModel =
{ keysDown = Set.empty
}
view : Model -> Html Msg
view model =
text <| toString <| Set.map Char.fromCode model.keysDown
type Msg
= KeyDown KeyCode
| KeyUp KeyCode
type alias Model =
{ keysDown : Set KeyCode
}
update msg model =
case msg of
KeyDown key ->
({ model | keysDown = Set.insert key model.keysDown }, Cmd.none)
KeyUp key ->
({ model | keysDown = Set.remove key model.keysDown }, Cmd.none)
subscriptions _ =
Sub.batch
[ Keyboard.downs KeyDown
, Keyboard.ups KeyUp
]
答案 1 :(得分:1)
从长远来看,帮助跟踪组合键和其他几种常见方案是有意义的。如果您遇到特定问题,您认为此库可以更直接地解决,请在问题中将其描述为SSCCE。请不要建议解决方案。只是描述一下场景。一旦人们更加清楚,那么就应该以一致的方式为这些案例添加支持。
所以,至少它意味着它现在不受支持。我不完全确定这是否也意味着你应该开启一个问题来鼓励以后加入。
现在,Chad的答案看起来对我来说是一个很好的临时解决方案。使用Swelet建议仅跟踪几个修改键时,它看起来更好。请注意,如果你采用这种方法,你不需要依赖任何List
或Set
,但你可以用4个布尔值来记录。
最后,如果您因某些原因需要跟踪所有键(例如,如果您希望用户能够将[F1]链接到某个操作,那么在性能方面,使用更有效的表示是有意义的例如,有限集的任何子集都可以定义为单个数字,每个位都是布尔意味着缺少或存在一个特定元素。您可以使用Bitwise库执行此类操作。