Elm 0.17及更高版本中的键盘组合

时间:2016-08-24 14:23:40

标签: elm

如何在我的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 =
    ...

但是如何按下多个按键呢?

2 个答案:

答案 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)

来自the documentation

  

从长远来看,帮助跟踪组合键和其他几种常见方案是有意义的。如果您遇到特定问题,您认为此库可以更直接地解决,请在问题中将其描述为SSCCE。请不要建议解决方案。只是描述一下场景。一旦人们更加清楚,那么就应该以一致的方式为这些案例添加支持。

所以,至少它意味着它现在不受支持。我不完全确定这是否也意味着你应该开启一个问题来鼓励以后加入。

现在,Chad的答案看起来对我来说是一个很好的临时解决方案。使用Swelet建议仅跟踪几个修改键时,它看起来更好。请注意,如果你采用这种方法,你不需要依赖任何ListSet,但你可以用4个布尔值来记录。

最后,如果您因某些原因需要跟踪所有键(例如,如果您希望用户能够将[F1]链接到某个操作,那么在性能方面,使用更有效的表示是有意义的例如,有限集的任何子集都可以定义为单个数字,每个位都是布尔意味着缺少或存在一个特定元素。您可以使用Bitwise库执行此类操作。