module Graphics.UI.Gtk.Reactive.Property where
import Control.Monad (void, when)
import Graphics.UI.Gtk
import Data.ReactiveValue
reactiveProperty :: Eq b
=> self
-> Signal self (IO ()) -> Attr self b
-> ReactiveFieldReadWrite IO b
reactiveProperty e sig attr =
ReactiveFieldReadWrite setter getter notifier
where getter = get e attr
setter v = postGUIAsync $ do
p <- getter
when (p /= v) $ set e [ attr := v ]
notifier p = void (on e sig p)
reactivePropertyNE :: self
-> Signal self (IO ()) -> Attr self b
-> ReactiveFieldReadWrite IO b
reactivePropertyNE e sig attr =
ReactiveFieldReadWrite setter getter notifier
where getter = get e attr
setter v = postGUIAsync $ set e [ attr := v ]
notifier p = void (on e sig p)
reactivePropertyH :: Eq b
=> self
-> (self -> IO () -> IO (ConnectId self)) -> Attr self b
-> ReactiveFieldReadWrite IO b
reactivePropertyH e sig attr =
ReactiveFieldReadWrite setter getter notifier
where getter = get e attr
setter v = postGUIAsync $ do
p <- getter
when (p /= v) $ set e [ attr := v ]
notifier p = void (e `sig` p)
passiveProperty :: Eq b
=> self
-> Attr self b
-> ReactiveFieldReadWrite IO b
passiveProperty e attr =
ReactiveFieldReadWrite setter getter notifier
where getter = get e attr
setter v = postGUIAsync $ do
p <- getter
when (p /= v) $ set e [ attr := v ]
notifier _ = return ()
passivePropertyNE :: self
-> Attr self b
-> ReactiveFieldReadWrite IO b
passivePropertyNE e attr =
ReactiveFieldReadWrite setter getter notifier
where getter = get e attr
setter v = postGUIAsync $ set e [ attr := v ]
notifier _ = return ()