{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses , TemplateHaskell, UndecidableInstances #-} 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 p = do changeVar <- varCreate (return ()) hours <- hslider p True 0 23 [ selection := fst $ minutes2Clock m' ] minutes <- hslider p True 0 23 [ selection := snd $ minutes2Clock m' ] let setChangeVar x = do set hours [ on command := x ] set minutes [ on command := x ] lay = grid 10 10 [ [ label "Hours: ", fill $ widget hours ] , [ label "Minutes: ", fill $ widget minutes ] ] 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 ) 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 ] set f [ layout := container p $ row 10 [ fill $ widget en, widget b ] , size := Size 550 165 ]