packages feed

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