2016-08-24 64 views
3

如何在我的Elm应用程序中构建键盘组合, “shift + alt + enter”?你会做这样的事情向按下一个键(例如回车键)反应:Elm 0.17及更高版本中的键盘组合

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

您是否考虑过使用['Keyboard.downs'和'Keyboard.ups'](https://github.com/elm-lang/keyboard/blob/master/src/Keyboard.elm)维护一个向下键列表?我会创建一个示例应用程序为你,但我还没有达成0.17。 – pdoherty926

+0

@ pdoherty926的突破变化的条款是我其实d身份证,我有点害怕最终不得不这样做,我只是觉得在编写密集型应用程序的每个按键上“扣税”系统感觉有点不对劲,并且会收到很多按键。像每个键盘上的“在列表中查找键并删除它”?但我必须说,我对这种东西的有效性并不了解,可能是花生。 – swelet

+0

我认为你的关注是有效的,我只是没有意识到使用可用API的替代方法。虽然,只是为了跟进我的最初建议,你可能想使用一个集合而不是一个列表。 – pdoherty926

回答

3

您可以使用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 
     ] 
+0

谢谢你的回答。你认为可能会有任何性能问题从跟踪和执行每一个关键和关闭的东西?只是出于好奇 - 为什么青睐设置而不是列表(与他们没有太大的关系) – swelet

+1

设置将提供更好的性能,列出在这种情况下。在列表中,每次需要添加或删除项目时,您都必须遍历列表 –

+2

对于想要实现相同目标的任何人,我从Slack上的Alexlew获得了一个好主意 - 这归结为仅添加和删除设置中的修饰键并忽略其余部分。在大多数情况下,您只需要追踪三个或四个键(ctrl,shift,alt,cmd),并且只需要对这些特定键上调或下调的集合执行任何检查。 – swelet

1

the documentation

从长期来看,这是有道理的,以帮助跟踪组合键和其他几个常见的场景。如果您遇到特殊问题,您认为该图书馆可以更直接地解决问题,请在问题中将其描述为SSCCE。请不要建议解决方案。只描述一下这个场景。一旦人们更加清楚了,就可以以一致的方式为这些案件提供支持。

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

现在,乍得的答案看起来像一个很好的临时解决方案给我。这看起来更好,因为swelet建议只跟踪几个修改键。请注意,如果采用这种方法,则不需要依赖任何ListSet,但是您可以使用4个布尔值来创建一个小记录。最后,如果您想由于某些原因来追踪所有的键(例如,如果您希望用户能够将[F1]链接到某个动作,那么在性能方面,使用更高效的例如,有限集合的任何子集都可以定义为一个单一数字,每一位都是一个布尔值,表示不存在或存在某个特定元素,您可以使用Bitwise库执行此操作

+0

谢谢您提高洞察力,让事情更有效率! – swelet

相关问题