2015-08-31 3 views
2

Я пытаюсь в первый раз использовать Reactive Banana (WX) для отображения текста типа «Нажатая кнопка« Один »,« Нажатая кнопка Два »и т. Д. На пяти кнопках:Reactive Banana: Альтернативные события кнопок

{-# LANGUAGE ScopedTypeVariables #-} 

import Graphics.UI.WX hiding (Event) 
import Reactive.Banana 
import Reactive.Banana.WX 

data Buttons = One | Two | Three | Four | Five deriving (Show) 

main :: IO() 
main = start $ do 
    f  <- frame [text := “Five Buttons“] 
    bone <- button f [text := “One”] 
    btwo <- button f [text := “Two”] 
    bthree <- button f [text := “Three”] 
    bfour <- button f [text := “Four”] 
    bfive <- button f [text := “Five”] 
    out <- staticText f [] 

    set f [layout := margin 10 $ 
      column 5 [row 5 [widget bone, widget btwo, widget bthree, widget bfour, widget bfive], 
        grid 5 5 [[label “Output:” , widget out] 
           ]]] 

    let networkDescription :: forall t. Frameworks t => Moment t() 
     networkDescription = do 
     eone <- event0 bone command 
     etwo <- event0 btwo command 
     ethree <- event0 bthree command 
     efour <- event0 bfour command 
     efive <- event0 bfive command 

     let 
      somethinghere::Behaviour t Buttons 
      somethinghere = .... 
     sink out [text :== "Pressed button " ++ show <$> somethinghere] 

    network <- compile networkDescription  
    actuate network 

Код - только основной скелет. То, что я не могу сделать в данный момент, заключается в заполнении метода somethinghere. Как сказано, если, например, нажата кнопка «Один», то somethinghere должен вернуться со ссылкой на Buttons Данные ADT One и так далее. Я пробовал с accumB и unionWith, но я не думаю, что получаю право на механизм. Любая помощь?

ответ

3

Я считаю, что вы хотите что-то вроде:

let eChangeSelection :: Event t Buttons 
    eChangeSelection = unions 
     [ One <$ eone 
     , Two <$ etwo 
     , Three <$ ethree 
     , Four <$ efour 
     , Five <$ efive 
     ] 

    -- Your `somethinghere`: 
    bSelection :: Behavior t Buttons 
    bSelection = stepper One eChangeSelection 

bSelection представляет выбранную кнопку, и eChangeSelection это поток обновлений к нему. unions объединяет пять потоков событий, а (<$) теги каждого отдельного потока с соответствующим значением. Обратите внимание, что я произвольно выбрал One в качестве начального значения выбора; вы, возможно, предпочтете сделать что-то другое (например, с помощью Behavior t (Maybe Buttons), чтобы можно было не выбрать кнопку).