module Reactive.Banana.WX (
event1, event0, behavior,
Prop'(..), sink,
module Reactive.Banana.Frameworks,
eventText, behaviorText, eventSelection,
mouseMotion, mouseEnter, mouseLeave,
leftDown, leftUp, leftDClick, leftDrag,
rightDown, rightUp, rightDClick, rightDrag,
middleDown, middleUp, middleDClick, middleDrag,
mouseWheel, mouseWheelDown, mouseWheelUp,
event1ToAddHandler, event0ToEvent1,
) where
import Reactive.Banana
import Reactive.Banana.Frameworks
import qualified Graphics.UI.WX as WX
import Graphics.UI.WX hiding (Event, Attr)
import qualified Graphics.UI.WXCore as WXCore
event1 :: w -> WX.Event w (a -> IO ()) -> MomentIO (Event a)
event1 widget e = do
addHandler <- liftIO $ event1ToAddHandler widget e
fromAddHandler addHandler
event0 :: w -> WX.Event w (IO ()) -> MomentIO (Event ())
event0 widget = event1 widget . event0ToEvent1
behavior :: w -> WX.Attr w a -> MomentIO (Behavior a)
behavior widget attr = fromPoll $ get widget attr
data Prop' w = forall a. (WX.Attr w a) :== Behavior a
infixr 0 :==
sink :: w -> [Prop' w] -> MomentIO ()
sink widget = mapM_ sink1
where
sink1 (attr :== b) = do
x <- valueBLater b
liftIOLater $ set widget [attr := x]
e <- changes b
reactimate' $ (fmap $ \x -> set widget [attr := x]) <$> e
sinkPaint :: Paint w => w -> Behavior (DC () -> Rect -> IO ()) -> MomentIO ()
sinkPaint w b = do
sink w [on paint :== b]
e <- changes b
reactimate $ repaint w <$ e
eventText :: TextCtrl w -> MomentIO (Event String)
eventText w = do
addHandler <- liftIO $ event1ToAddHandler w (event0ToEvent1 onText)
fromAddHandler
$ filterIO (const $ WXCore.textCtrlIsModified w)
$ mapIO (const $ get w text) addHandler
onText :: WX.Event (WXCore.Control a) (IO ())
onText = WX.newEvent "onText" WXCore.controlGetOnText WXCore.controlOnText
behaviorText :: TextCtrl w -> String -> MomentIO (Behavior String)
behaviorText w s = stepper s =<< eventText w
eventSelection :: SingleListBox b -> MomentIO (Event Int)
eventSelection w = do
liftIO $ fixSelectionEvent w
addHandler <- liftIO $ event1ToAddHandler w (event0ToEvent1 select)
fromAddHandler $ mapIO (const $ get w selection) addHandler
fixSelectionEvent :: (Selecting w, Reactive w, Selection w) => w -> IO ()
fixSelectionEvent listbox =
set listbox [ on unclick := handler ]
where
handler _ = do
propagateEvent
s <- get listbox selection
when (s == 1) $ get listbox (on select) >>= id
mouseMotion :: WX.EventMouse -> Maybe (WX.Point, WX.Modifiers)
mouseMotion (MouseMotion point mod) = Just (point, mod)
mouseMotion _ = Nothing
mouseEnter :: WX.EventMouse -> Maybe (WX.Point, WX.Modifiers)
mouseEnter (MouseEnter point mod) = Just (point, mod)
mouseEnter _ = Nothing
mouseLeave :: WX.EventMouse -> Maybe (WX.Point, WX.Modifiers)
mouseLeave (MouseLeave point mod) = Just (point, mod)
mouseLeave _ = Nothing
leftDown :: WX.EventMouse -> Maybe (WX.Point, WX.Modifiers)
leftDown (MouseLeftDown point mod) = Just (point, mod)
leftDown _ = Nothing
leftUp :: WX.EventMouse -> Maybe (WX.Point, WX.Modifiers)
leftUp (MouseLeftUp point mod) = Just (point, mod)
leftUp _ = Nothing
leftDClick :: WX.EventMouse -> Maybe (WX.Point, WX.Modifiers)
leftDClick (MouseLeftDClick point mod) = Just (point, mod)
leftDClick _ = Nothing
leftDrag :: WX.EventMouse -> Maybe (WX.Point, WX.Modifiers)
leftDrag (MouseLeftDrag point mod) = Just (point, mod)
leftDrag _ = Nothing
rightDown :: WX.EventMouse -> Maybe (WX.Point, WX.Modifiers)
rightDown (MouseRightDown point mod) = Just (point, mod)
rightDown _ = Nothing
rightUp :: WX.EventMouse -> Maybe (WX.Point, WX.Modifiers)
rightUp (MouseRightUp point mod) = Just (point, mod)
rightUp _ = Nothing
rightDClick :: WX.EventMouse -> Maybe (WX.Point, WX.Modifiers)
rightDClick (MouseRightDClick point mod) = Just (point, mod)
rightDClick _ = Nothing
rightDrag :: WX.EventMouse -> Maybe (WX.Point, WX.Modifiers)
rightDrag (MouseRightDrag point mod) = Just (point, mod)
rightDrag _ = Nothing
middleDown :: WX.EventMouse -> Maybe (WX.Point, WX.Modifiers)
middleDown (MouseMiddleDown point mod) = Just (point, mod)
middleDown _ = Nothing
middleUp :: WX.EventMouse -> Maybe (WX.Point, WX.Modifiers)
middleUp (MouseMiddleUp point mod) = Just (point, mod)
middleUp _ = Nothing
middleDClick :: WX.EventMouse -> Maybe (WX.Point, WX.Modifiers)
middleDClick (MouseMiddleDClick point mod) = Just (point, mod)
middleDClick _ = Nothing
middleDrag :: WX.EventMouse -> Maybe (WX.Point, WX.Modifiers)
middleDrag (MouseMiddleDrag point mod) = Just (point, mod)
middleDrag _ = Nothing
mouseWheel :: WX.EventMouse -> Maybe (Bool, WX.Point, WX.Modifiers)
mouseWheel (MouseWheel down point mod) = Just (down, point, mod)
mouseWheel _ = Nothing
mouseWheelDown :: WX.EventMouse -> Maybe (WX.Point, WX.Modifiers)
mouseWheelDown (MouseWheel True point mod) = Just (point, mod)
mouseWheelDown _ = Nothing
mouseWheelUp :: WX.EventMouse -> Maybe (WX.Point, WX.Modifiers)
mouseWheelUp (MouseWheel False point mod) = Just (point, mod)
mouseWheelUp _ = Nothing
event1ToAddHandler :: w -> WX.Event w (a -> IO ()) -> IO (AddHandler a)
event1ToAddHandler widget e = do
(addHandler, runHandlers) <- newAddHandler
set widget [on e :~ \h x -> h x >> runHandlers x]
return addHandler
event0ToEvent1 :: WX.Event w (IO ()) -> WX.Event w (() -> IO ())
event0ToEvent1 = mapEvent const (\_ e -> e ())