packages feed

titan-1.0.2: src/Hails/Graphics/UI/Gtk/THBuilderAccessor.hs

module Hails.Graphics.UI.Gtk.THBuilderAccessor where

import Language.Haskell.TH.Syntax
import Language.Haskell.TH.Lib

gtkBuilderAccessor :: String -> String -> Q [Dec]
gtkBuilderAccessor name kind = sequenceQ
 -- Signature: <accessor> :: Builder -> IO <WidgetType>
 [ sigD (mkName name)
        (appT (appT arrowT (conT (mkName "Builder")))
              (appT (conT (mkName "IO")) (conT (mkName kind)))
        )
 -- Implementation: <accessor> :: fromBuilder castTo<WidgetType> "<accessor>"
 , funD (mkName name)
        [ clause [] 
                 -- Just apply the casting operation and the name to the
                 -- builder accessor
                 (normalB
                   (appE                                         
                     (appE (varE (mkName "fromBuilder"))           
                           (varE (mkName ("castTo" ++ kind))))   
                     (litE (stringL name))                       
                   )                                             
                 )                                               
                 []
        ]
 ]

-- | Accessor for Glade objects from Gtk Builders encapsulated in
-- Views, by name and -- type.
gtkViewAccessor :: String -> String -> String -> String -> Q [Dec]
gtkViewAccessor builderModule uiAccessor name kind = sequenceQ
  -- Declaration
  [ sigD funcName
         -- Builder -> IO Kind
         (appT (appT arrowT (conT (mkName "View")))           
               (appT (conT (mkName "IO")) (conT (mkName kind))))
  -- Implementation
  , funD funcName                                                 
         -- castedOnBuilder objectName
         [clause [varP builderName]
                 (normalB (appE (varE funcNameInBuilder)
                                (appE (varE (mkName uiAccessor))
                                      (varE builderName)
                                )
                          )) []]
  ]

  where castedAccess      = appE (varE (mkName "fromBuilder")) casting
        casting           = varE (mkName ("castTo" ++ kind))
        funcName          = mkName name
        funcNameInBuilder = mkName $ builderModule ++ ('.' : name) 
        builderName       = mkName "b"