mpvguihs-0.1.1: MpvPlayer/Frontend/GUITemplates.hs
{-# LANGUAGE TemplateHaskell #-}
module MpvPlayer.Frontend.GUITemplates (
module MpvPlayer.Frontend.GUITemplates,
module Graphics.UI.Gtk,
module Graphics.UI.Gtk.Builder,
module Graphics.UI.Gtk.Windows.Window,
module Graphics.UI.Gtk.MenuComboToolbar.ToolButton,
module Graphics.UI.Gtk.MenuComboToolbar.MenuToolButton,
module Graphics.UI.Gtk.MenuComboToolbar.ToggleToolButton,
module Graphics.UI.Gtk.Entry.HScale,
module Graphics.UI.Gtk.Buttons.VolumeButton,
module Graphics.UI.Gtk.Display.Statusbar,
module Graphics.UI.Gtk.Misc.DrawingArea,
module Graphics.UI.Gtk.Layout.VBox
) where
import Graphics.UI.Gtk
import Graphics.UI.Gtk.Builder
import Graphics.UI.Gtk.Windows.Window
import Graphics.UI.Gtk.MenuComboToolbar.ToolButton
import Graphics.UI.Gtk.MenuComboToolbar.MenuToolButton
import Graphics.UI.Gtk.MenuComboToolbar.ToggleToolButton
import Graphics.UI.Gtk.Entry.HScale
import Graphics.UI.Gtk.Buttons.VolumeButton
import Graphics.UI.Gtk.Display.Statusbar
import Graphics.UI.Gtk.Misc.DrawingArea
import Graphics.UI.Gtk.Layout.VBox
import Graphics.UI.Gtk.Display.Image
import Control.Monad
import Data.Char
import Data.List
import Language.Haskell.TH
data Handles = Handles {
mainWindow :: Window,
mainBox :: VBox,
background :: EventBox,
backgroundImage :: Image,
openButton :: ToolButton,
settingsButton :: MenuToolButton,
aboutButton :: MenuToolButton,
playButton :: ToggleToolButton,
scale :: HScale,
volumeButton :: VolumeButton,
fullscreenButton :: ToolButton,
statusbar :: Statusbar,
aboutDialog :: AboutDialog,
settingsDialog :: Dialog,
cmdLineEntry :: Entry,
fullscreenWindow :: Window
}
getHandlesExp :: Q Exp -> Q Exp
getHandlesExp builder = do
(TyConI (DataD _ _ _ [RecC _ vars] _)) <- reify ''Handles
objs <- forM vars $ \(n,_,t) -> do
let widgetName' = (toUpper $ head $ nameBase n):(tail $ nameBase n)
let tStr = reverse $ takeWhile (/= '.') $ reverse $ show t
let castStr = "castTo" ++ tStr
(Just castTo) <- lookupValueName castStr
return (widgetName', castTo, t)
let bind n w castTo = bindS (varP $ mkName n)
[| builderGetObject $builder $(varE castTo) w |]
let stmts = map (\(w,castTo,_) -> bind ("var" ++ w) w castTo) objs
let retExp = foldl' appE [| Handles |] (map (\(w,_,_) -> dyn ("var" ++ w)) objs)
doE (stmts ++ [ noBindS [| return $(retExp) |] ])