WxGeneric-0.5.2: examples/EventPropagation/AlarmEventPropagation.hs
{-# 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 ]