packages feed

grapefruit-ui-gtk-0.0.0.0: src/Graphics/UI/Grapefruit/GTK/Item.hs

-- |This module provides convenience functions for creating GTK+-based bricks and boxes.
module Graphics.UI.Grapefruit.GTK.Item (

    widgetBrick,
    windowBrick,
    widgetBox,
    windowBox

) where

    -- FRP.Grapefruit
    import FRP.Grapefruit.Signal.Segmented   as SSignal
    import FRP.Grapefruit.Record             as Record
    import FRP.Grapefruit.Record.Optionality as OptionalityRecord
    import FRP.Grapefruit.Record.Context     as ContextRecord

    -- Graphics.UI.Grapefruit
    import           Graphics.UI.Grapefruit.Comp    as UIComp
    import           Graphics.UI.Grapefruit.Item    as UIItem
    import qualified Graphics.UI.Grapefruit.Item    as UIItem
    import           Graphics.UI.Grapefruit.Backend as UIBackend

    -- Graphics.UI.Gtk
    import qualified Graphics.UI.Gtk as Gtk

    -- Graphics.UI.Grapefruit.GTK
    import {-# SOURCE #-} Graphics.UI.Grapefruit.GTK         as GTK
    import                Graphics.UI.Grapefruit.GTK.Backend as GTKUIBackend

    -- |Constructs a GTK+-based widget brick.
    widgetBrick :: (Gtk.WidgetClass gtkWidget, OptRecord iOptRecord, Record oRecord)
                => IO gtkWidget
                   -- ^an action which creates a Gtk2Hs widget
                -> ContextConsumerRecord gtkWidget (All iOptRecord)
                   -- ^consumers of those inputs which are specific to this brick
                -> ContextProducerRecord gtkWidget oRecord
                   -- ^producers of those outputs which are specific to this brick
                -> Brick Widget GTK iOptRecord oRecord
    widgetBrick = brick commonWidgetConsumerRecord commonWidgetProducerRecord Gtk.widgetShow .
                  newWidget

    -- |Constructs a GTK+-based window brick.
    windowBrick :: (Gtk.WindowClass gtkWindow, OptRecord iOptRecord, Record oRecord)
                => IO gtkWindow
                   -- ^an action which creates a Gtk2Hs window
                -> ContextConsumerRecord gtkWindow (All iOptRecord)
                   -- ^consumers of those inputs which are specific to this brick
                -> ContextProducerRecord gtkWindow oRecord
                   -- ^producers of those outputs which are specific to this brick
                -> Brick Window GTK iOptRecord oRecord
    windowBrick = brick commonWindowConsumerRecord commonWindowProducerRecord Gtk.widgetShow .
                  newWindow

    -- |Constructs a GTK+-based widget box.
    widgetBox :: (Gtk.WidgetClass gtkWidget,
                  UIComp innerUIComp,
                  OptRecord iOptRecord,
                  Record oRecord)
              => IO gtkWidget
                 -- ^an action which creates a Gtk2Hs widget
              -> (gtkWidget -> Placement innerItem GTK)
                 -- ^conversion from a Gtk2Hs widget into the placement for its inner items
              -> ContextConsumerRecord gtkWidget (All iOptRecord)
                 -- ^consumers of those inputs which are specific to this box
              -> ContextProducerRecord gtkWidget oRecord
                 -- ^producers of those outputs which are specific to this box
              -> Box innerUIComp innerItem Widget GTK iOptRecord oRecord
    widgetBox = box commonWidgetConsumerRecord commonWidgetProducerRecord Gtk.widgetShow . newWidget

    -- |Constructs a GTK+-based window box.
    windowBox :: (Gtk.WindowClass gtkWindow,
                  UIComp innerUIComp,
                  OptRecord iOptRecord,
                  Record oRecord)
              => IO gtkWindow
                 -- ^an action which creates a Gtk2Hs window
              -> (gtkWindow -> Placement innerItem GTK)
                 -- ^conversion from a Gtk2Hs window into the placement for its inner items
              -> ContextConsumerRecord gtkWindow (All iOptRecord)
                 -- ^consumers of those inputs which are specific to this box
              -> ContextProducerRecord gtkWindow oRecord
                 -- ^producers of those outputs which are specific to this box
              -> Box innerUIComp innerItem Window GTK iOptRecord oRecord
    windowBox = box commonWindowConsumerRecord commonWindowProducerRecord Gtk.widgetShow . newWindow

    newWidget :: (Gtk.WidgetClass gtkWidget)
              => IO gtkWidget
              -> Placement Widget GTK
              -> IO gtkWidget
    newWidget = newItem Gtk.toWidget

    newWindow :: (Gtk.WindowClass gtkWindow)
              => IO gtkWindow
              -> Placement Window GTK
              -> IO gtkWindow
    newWindow = newItem Gtk.toWindow

    newItem :: (specificItem -> genericItem)
            -> IO specificItem
            -> (genericItem -> IO ())
            -> IO specificItem
    newItem genericItem newSpecificItem placement = do
                                                        specificItem <- newSpecificItem
                                                        placement (genericItem specificItem)
                                                        return specificItem

    commonWidgetConsumerRecord :: (Gtk.WidgetClass gtkWidget)
                               => ContextConsumerRecord gtkWidget
                                                        (All (CommonInputOptRecord Widget))
    commonWidgetConsumerRecord = X :& IsEnabled ::~~ SSignal.consumer . Gtk.widgetSetSensitivity

    commonWidgetProducerRecord :: (Gtk.WidgetClass gtkWidget)
                               => ContextProducerRecord gtkWidget (CommonOutputRecord Window)
    commonWidgetProducerRecord = X

    commonWindowConsumerRecord :: (Gtk.WindowClass gtkWindow)
                               => ContextConsumerRecord gtkWindow
                                                        (All (CommonInputOptRecord Window))
    commonWindowConsumerRecord = X

    commonWindowProducerRecord :: (Gtk.WindowClass gtkWindow)
                               => ContextProducerRecord gtkWindow (CommonOutputRecord Window)
    commonWindowProducerRecord = X