grapefruit-ui-gtk-0.0.0.0: src/Graphics/UI/Grapefruit/GTK/Connector.hs
{-|
This module provides convenience functions for constructing connectors specific to the
GTK+-based backend.
-}
module Graphics.UI.Grapefruit.GTK.Connector (
attrConsumer,
eventProducer
) where
-- FRP.Grapefruit
import FRP.Grapefruit.Setup as Setup
import FRP.Grapefruit.Signal as Signal
import FRP.Grapefruit.Signal.Discrete as DSignal
import FRP.Grapefruit.Signal.Segmented as SSignal
-- Graphics.UI.Gtk
import qualified Graphics.UI.Gtk as Gtk
{-|
Constructs a consumer for segmented signals which makes a Gtk2Hs attribute of a Gtk2Hs
widget being updated on every update point of the consumed signal.
-}
attrConsumer :: (Gtk.WidgetClass gtkWidget) =>
Gtk.Attr gtkWidget val -> gtkWidget -> Consumer SSignal val
attrConsumer attr gtkWidget = SSignal.consumer $ \val -> Gtk.set gtkWidget [attr Gtk.:= val]
-- |Constructs a producer of discrete signals that represent sequences of Gtk2Hs events.
eventProducer :: (Gtk.WidgetClass gtkWidget)
=> (gtkWidget -> IO () -> IO (Gtk.ConnectId gtkWidget))
{-^
an @on/EventType/@ function of Gtk2Hs, representing a certain kind of
event
-}
-> gtkWidget
-- ^a Gtk2Hs widget which provides the events
-> Producer DSignal ()
eventProducer onEvent gtkWidget = DSignal.producer $
\handler -> setup $
do
connectID <- onEvent gtkWidget (handler ())
return (Gtk.signalDisconnect connectID)