2016-08-24 4 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 id, и я как бы боюсь, что в конечном итоге прибегнув к этому, я просто думаю, что это неправильно неправильно «налагать» систему на каждое нажатие клавиш в приложениях, которые интенсивно пишут и получат много нажатий клавиш. Как «найти ключ в списке и удалить его» в КАЖДОЙ клавиатуре? Однако я должен сказать, что я не очень-то знаю о том, насколько эффективен такой материал, может быть, это арахис. – 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

Для всех, кто хочет достичь того же, я получил хорошую идею от Alexlew на Slack, которая сводится к добавлению и удалению только модификаторы в наборе и игнорирование остальных. В большинстве случаев вам нужно всего три или четыре ключа, которые вы хотите отслеживать (ctrl, shift, alt, cmd), и вам нужно только выполнить любую проверку набора на этих специальных ключах, которые увеличиваются или сбрасываются. – swelet

1

От the documentation:

В долгосрочной перспективе, это имеет смысл, чтобы помочь отслеживать ключевые комбинации и пару других распространенных сценариев. Если у вас есть какая-то особая проблема, вы думаете, что эта библиотека может обращаться более непосредственно, пожалуйста, опишите ее как SSCCE в проблеме. Пожалуйста, не предлагайте решение. Просто опишите сценарий. Как только становится понятнее, что делают люди, настало время добавить поддержку этих случаев согласованным образом.

Таким образом, по крайней мере, это означает, что оно не поддерживается прямо сейчас. Я не совсем уверен, означает ли это также, что вы должны открыть проблему, чтобы поддержать это позднее дополнение или нет.

Теперь ответ Чада выглядит хорошим временным решением для меня. Это выглядит еще лучше с предложением swelet отслеживать только несколько клавиш-модификаторов. Обратите внимание, что если вы примете такой подход, вам не нужно полагаться на любые List или Set, но вместо этого вы можете записать небольшую запись с 4 булевыми.

Наконец, если вы хотите по каким-либо причинам отследить все ключи (если, например, вы хотели бы, чтобы пользователь мог связать [F1] с некоторыми действиями, то с точки зрения производительности было бы целесообразно использовать более эффективные представление множеств. Любое подмножество конечного множества, например, может быть определено как одно число, каждый бит является логическим значением отсутствия или наличием одного конкретного элемента. Вы можете делать такие вещи с помощью библиотеки Bitwise.

+0

Благодарим вас за то, что вы сделали что-то еще более эффективным! – swelet

Смежные вопросы