Reactive Banana:备用按钮事件
Reactive Banana: Alternate buttons events
我第一次尝试使用 Reactive Banana (WX) 在五个按钮顶部显示 "Pressed button One"、"Pressed button Two" 等文本:
{-# 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
方法。如前所述,如果按下按钮 "One",那么 somethinghere
应该 return 引用 Buttons
ADT 数据 One
等等。
我尝试使用 accumB
and unionWith
,但我认为我的机制不正确。有帮助吗?
我相信你想要这样的东西:
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)
这样就可以不选择按钮)。
我第一次尝试使用 Reactive Banana (WX) 在五个按钮顶部显示 "Pressed button One"、"Pressed button Two" 等文本:
{-# 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
方法。如前所述,如果按下按钮 "One",那么 somethinghere
应该 return 引用 Buttons
ADT 数据 One
等等。
我尝试使用 accumB
and unionWith
,但我认为我的机制不正确。有帮助吗?
我相信你想要这样的东西:
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)
这样就可以不选择按钮)。