{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses , TemplateHaskell, UndecidableInstances #-} {- | Shows event propagation in a generically (SYB) constructed widget -} module AlarmEventPropagation where import Graphics.UI.WxGeneric import Graphics.UI.SybWidget.MySYB import Graphics.UI.WX import Graphics.UI.WXCore hiding (Event) data Minutes = Minutes Int | Hours Double deriving (Show, Eq) data Alarm = Alarm { name :: String , tupleField :: (String, String) , listField :: [String] , timeOfDay :: Minutes } deriving (Show, Eq) $(derive [''Minutes,''Alarm]) instance WxGen Alarm instance WxGen Minutes main :: IO () main = start $ do f <- frame [ text := "Alarm Example" ] p <- panel f [] en <- genericWidget p (Alarm "My alarm" ("X", "Y") ["one", "two", "three"] $ Minutes 117) setOnEvent en keyboard "Keyboard" setOnEvent en mouse "Mouse" b <- button p [ text := "&Print alarm" , on command := get en widgetValue >>= print ] set f [ layout := container p $ row 10 [ widget en, widget b ] ] setOnEvent :: (Show a) => w -> Event w (a -> IO ()) -> [Char] -> IO () setOnEvent w evt evtName = set w [ on evt := \e -> putStrLn (evtName ++ ": " ++ show e) >> propagateEvent ]