packages feed

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)