2016-08-24 4 views
3

Elmアプリケーションにキーボードの組み合わせを組み込むにはどうすればいいですか? "shift + alt + enter"?あなたは、このような何かが(エンターキーなど)を押す1つのキーに反応するだろう: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 IDと私は最終的にはそれを行うことを恐れていると思う、私はちょうどそれが間違っていると思うちょうど間違っていると思う集中的に書くkeypressesの多くを受信するアプリでキーを押すたびにシステムを "税"。すべてのキーアップで「リスト内のキーを見つけて削除する」のように?しかし、私はこの種のものがいかに効率的か、あまりにもピーナッツだとは知らないと言わなければなりません。 – swelet

+0

私はあなたの懸念が有効だと思う、私はちょうど利用可能なAPIを使用して別のアプローチを認識していない。最初の提案をフォローアップするだけで、おそらくリストの代わりにセットを使用したいと思うでしょう。 – pdoherty926

答えて

3

上記のpdoherty926とSetとしてKeyboard.downsを使用して、どのキーが押されたかを把握できます。キーがリリースされた時期を知るには、Keyboard.upsを参照する必要があります。ここで

は実施例である:the documentationから

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

同じことを達成したいと思う他の人のために、私はAlexlewからSlackで良いアイデアを得ました。修飾子キーはセット内にあり、残りは無視されます。ほとんどの場合、追跡したいキーは3〜4つしかありません(ctrl、shift、alt、cmd)、昇順または降順に特定のキーのセットをチェックするだけで済みます。 – swelet

1

長期的には、キーの組み合わせやカップルの他の一般的なシナリオを追跡するために理にかなっています。このライブラリがより直接的に対処できると思われる特定の問題がある場合は、その問題をSSCCEとして記述してください。解決策を提案しないでください。シナリオを説明するだけです。人々が何をしているかが明確になると、一貫した方法でそれらのケースのサポートを追加する時が来ます。

少なくとも、現在サポートされていないことを意味します。この後の追加を奨励するために問題を開くべきかどうかも十分にはわかっていません。

チャドの答えは、私にとっては一時的な解決策のようです。スウレットの提案では、いくつかの修飾キーのみをトラッキングするほうが優れています。この手法をとった場合、ListまたはSetに頼る必要はありませんが、代わりに4ブール値の小さなレコードを持つことができます。

最後に、すべてのキーを追跡する理由がある場合(たとえば、ユーザーが[F1]を何らかのアクションにリンクできるようにするには、パフォーマンス面でより効率的な方法例えば、有限集合の任意の部分集合は、単一の数として定義することができ、各ビットはある特定の要素の存在または不存在を意味するブール値である。Bitwiseライブラリでこのようなことを行うことができる。

+0

物事をより効率的にすることについての良い洞察をありがとう! – swelet