hbro-1.3.0.0: library/Hbro/Gui/Builder.hs
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
module Hbro.Gui.Builder
( FromGObject(..)
, getWidget
, getMainWindow
) where
-- {{{ Imports
import Hbro.Prelude
import qualified Graphics.UI.Gtk.Builder as Gtk
import qualified Graphics.UI.Gtk.Display.Label as Gtk
import qualified Graphics.UI.Gtk.Entry.Entry as Gtk
import Graphics.UI.Gtk.General.General.Extended (gSync)
import qualified Graphics.UI.Gtk.Layout.HBox as Gtk
import qualified Graphics.UI.Gtk.Scrolling.ScrolledWindow as Gtk
import qualified Graphics.UI.Gtk.Windows.Window as Gtk
import System.Glib.Types
-- }}}
-- | UI elements that can be built from a @GtkBuilder@ object (that is: an XML file)
class (GObjectClass a) => FromGObject a where
cast :: GObject -> a
instance FromGObject Gtk.Entry where cast = Gtk.castToEntry
instance FromGObject Gtk.HBox where cast = Gtk.castToHBox
instance FromGObject Gtk.Label where cast = Gtk.castToLabel
instance FromGObject Gtk.ScrolledWindow where cast = Gtk.castToScrolledWindow
instance FromGObject Gtk.Window where cast = Gtk.castToWindow
-- | Return the casted 'GObject' corresponding to the given name (set in the builder's XML file)
getWidget :: (MonadIO m, FromGObject a) => Gtk.Builder -> Text -> m a
getWidget builder name = gSync $ Gtk.builderGetObject builder cast name
getMainWindow :: (MonadIO m, MonadReader r m, Has Gtk.Builder r) => m Gtk.Window
getMainWindow = (`getWidget` "mainWindow") =<< ask