{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses , TemplateHaskell, UndecidableInstances #-} {- | The example shows two things. 1) How to specialize a widget. See instance WxGen Minutes. 2) Show that WxGeneric (and Composite) behaves nicely with respect to enabledness. That is it remembers the enabledness of the minutes-widget, even if we disable/enbale of the hole generic widget. But of cause, 'minutes' is only enabled when both the hole generic widget is enbaled and when the minutes-widget itself is enabled. -} module AlarmSpecialized where import Graphics.UI.WxGeneric import Graphics.UI.SybWidget.MySYB import Graphics.UI.WX import Graphics.UI.WXCore import Control.Monad data Minutes = Minutes Int deriving (Show, Eq) data Alarm = Alarm { name :: String , timeOfDay :: Minutes } deriving (Show, Eq) $(derive [''Minutes,''Alarm]) instance WxGen Alarm instance WxGen Minutes where mkWid m' = toOuter (valuedCompose helper) where helper genWidParms = do let p = getParent genWidParms changeVar <- varCreate (return ()) hours <- hslider p True 0 23 [ selection := fst $ minutes2Clock m' ] minutes <- hslider p True 0 59 [ selection := snd $ minutes2Clock m' ] ableMinutes <- button p [ text := "(Dis/En)able minutes" , on command := set minutes [ enabled :~ not ] ] let setChangeVar x = do set hours [ on command := x ] set minutes [ on command := x ] lay = column 5 [ grid 10 10 [ [ label "Hours: ", fill $ widget hours ] , [ label "Minutes: ", fill $ widget minutes ] ] , hfloatCenter $ widget ableMinutes ] getVal = liftM2 clock2Minutes (get hours selection) (get minutes selection) setVal ys = do let (h, m) = minutes2Clock ys set hours [selection := h] set minutes [selection := m] return ( lay, getVal, setVal , varGet changeVar, setChangeVar , leafWidTree [WxWindow hours, WxWindow minutes] ) minutes2Clock (Minutes m) = (m `div` 60, m `mod` 60) clock2Minutes h m = Minutes (60*h + m) main :: IO () main = start $ do f <- frame [ text := "Alarm Specialized Example" ] p <- panel f [] en <- genericWidget p (Alarm "My alarm" $ Minutes 117) b <- button p [ text := "&Print alarm" , on command := get en widgetValue >>= print ] ableAll <- button p [ text := "(Dis/En)able all" , on command := set en [ enabled :~ not ] ] let lay = row 10 [ fill $ widget en , vfloatCenter $ column 10 [ widget b, widget ableAll ] ] set f [ layout := container p lay , size := Size 550 165 ]