packages feed

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 ]