module Graphics.UI.Gtk.Reactive.Widget where

import Control.Monad.IO.Class (liftIO)
import Control.Monad (void, when)
import Data.ReactiveValue
import Graphics.UI.Gtk

widgetVisibleReactive :: WidgetClass self => self -> ReactiveFieldReadWrite IO Bool
widgetVisibleReactive e = ReactiveFieldReadWrite setter getter notifier
 where getter     = get e widgetVisible
       setter v   = postGUIAsync $ do
                      p <- getter
                      when (p /= v) $ set e [ widgetVisible := v ]
       notifier p = void (e `on` mapEvent $ liftIO p >> return False)

widgetSensitiveReactive :: WidgetClass self => self -> ReactiveFieldReadWrite IO Bool
widgetSensitiveReactive e = ReactiveFieldReadWrite setter getter notifier
 where getter     = get e widgetSensitive
       setter v   = postGUIAsync $ do
                      p <- getter
                      when (p /= v) $ set e [ widgetSensitive := v ]
       notifier p = void (e `on` mapEvent $ liftIO p >> return False)