{-# LANGUAGE FlexibleContexts, FlexibleInstances , MultiParamTypeClasses, TemplateHaskell, UndecidableInstances #-} -- Why is UndecidableInstances neccesary? as derive requires it. -- Otherwise we get "Constraint is no smaller than the instance head"-error. -- This is a general problem with using SYB. module Examples where import Graphics.UI.WxGeneric import Graphics.UI.XTC import Graphics.UI.WX import Graphics.UI.WXCore import Graphics.UI.SybWidget.PriLabel import Graphics.UI.SybWidget.MySYB data MyTree = Branch { left :: MyTree, right :: MyTree } | Leaf Int Double deriving Show $(derive [''MyTree]) instance WxGen MyTree data Age = Age { unAge :: Int } deriving Show data Person = Person { name :: String, age :: Age, children :: [Person] } deriving Show aPerson :: Person aPerson = Person "Bob" (Age 17) [] $(derive [''Person,''Age]) instance WxGen Person instance WxGen Age where mkWid x = mapValue Age (const unAge) $ setOuterLabel (userDefinedLabel "Line one\nLine two\nLine Three") $ mkWid (unAge x) main :: IO () main = setOuterLabelTest someTree :: MyTree someTree = Leaf 5 5.2 someInt :: Int someInt = 17 tree :: IO () tree = start $ do f <- frame [] p <- panel f [] en <- genericWidget p someTree set en [ on change := get en widgetValue >>= print ] b1 <- button p [ text := "&Make simple tree" , on command := set en [ widgetValue := someTree ] ] b2 <- button p [ text := "&Show tree" , on command := get en widgetValue >>= print ] set f [ layout := container p $ column 10 [ fill $ widget en , row 10 [ glue, widget b1, widget b2 ] ] ] tree' :: IO () tree' = start $ do f <- frame [] -- p <- panel f [] scWin <- scrolledWindow f [ scrollRate := sz 10 10, virtualSize := sz 500 500, fullRepaintOnResize := False ] scrolledWindowEnableScrolling scWin True True b1 <- button f [ text := "&Do stuff" , on command := set scWin [ virtualSize := sz 1000 1000 ] ] en <- genericWidget scWin someTree set scWin [ layout := fill $ widget en ] set f [ layout := column 1 [ hfill $ hrule 1 , fill (widget scWin) , widget b1 ] ] person :: IO () person = start $ do f <- frame [] p <- panel f [] -- en <- genericWidget p aPerson en <- genericWidget p aPerson set f [ layout := container p $ fill $ widget en ] anyInt :: IO () anyInt = start $ do f <- frame [] intEntry <- genericWidget f someInt set intEntry [ on change := get intEntry widgetValue >>= print ] set f [ layout := widget intEntry ] mai3 :: IO () mai3 = start $ do f <- frame [] p <- panel f [] en <- textEntry p [] set f [ layout := widget p ] -- must also have fill set p [ layout := fill $ widget en ] enum :: IO () enum = start $ do f <- frame [] myEnum <- genericWidget f Enum1 set myEnum [ on change := get myEnum widgetValue >>= print ] set f [ layout := widget myEnum ] listTest :: IO () listTest = start $ do f <- frame [] p <- panel f [] listWid <- genericWidget p [1::Int, 2, 8] set listWid [ on change := get listWid widgetValue >>= print ] set f [ layout := container p $ fill $ widget listWid ] setOuterLabelTest :: IO () setOuterLabelTest = start $ do f <- frame [] p <- panel f [] en <- genericWidgetEx id (setOuterLabel (userDefinedLabel "User-set label")) p aPerson set f [ layout := container p $ fill $ widget en ] data MyEnum = Enum1 | Enum2 | Enum3 deriving Show $(derive [''MyEnum]) instance WxGen MyEnum