{-# LANGUAGE FlexibleContexts, FlexibleInstances , MultiParamTypeClasses, TemplateHaskell, UndecidableInstances #-} module MVCExample where import Graphics.UI.AF.WxFormAll import Graphics.UI.WX as Wx data Minutes = Minutes Int deriving (Show, Eq) data Alarm = Alarm { name :: String , time :: Minutes } deriving (Show, Eq) data UserTime = UserTime { hour :: Int , minute :: Int } deriving (Show, Eq) $(derive [''Minutes,''UserTime,''Alarm]) -- Should not be neccesary, but GHC 6.6 requires it. Remove when we stop support for GHC 6.6. instance ECCreator Alarm instance (TypePresentation UserTime action comH builder satCxt com, Sat(satCxt UserTime)) => TypePresentation Minutes action comH builder satCxt com where mkCom m' = let minutes2UserTime (Minutes m) = UserTime (m `div` 60) (m `mod` 60) userTime2Minutes (UserTime h m) = Minutes (60*h + m) in mapValue userTime2Minutes (const minutes2UserTime) (mkCom (minutes2UserTime m')) main = startWx "Alarm MVC Example" $ do {- blockingSettingsDialog (mkCom -} builderCom (Alarm "My alarm" $ Minutes 117) return ()