{-# 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.MySYB

data MyTree = Branch { left :: MyTree, right :: MyTree }
            | Leaf Int Double
              deriving Show

$(derive [''MyTree])
instance WxGen MyTree

data Person = Person { name :: String, age :: Int, children :: [Person] } deriving Show
-- data Person = Person { name :: String, children :: [String], age :: Int }

$(derive [''Person])
instance WxGen Person

main = listTest

someTree = Leaf 5 5.2

x :: Int
x = 17

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' = 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 = start $
         do f <- frame []
            p <- panel f []
            -- en <- genericWidget p (Person "Bob" [] 17)
            en <- genericWidget p (Person "Bob" 17 [])
            set f [ layout := container p $ fill $ widget en ]
          

anyInt = start $
         do f <- frame []
            intEntry <- genericWidget f x
            set intEntry [ on change := get intEntry widgetValue >>= print ]
            set f [ layout := widget intEntry ]

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 = start $
       do f <- frame []
          myEnum <- genericWidget f Enum1
          set myEnum [ on change := get myEnum widgetValue >>= print ]
          set f [ layout := widget myEnum ]

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 ]
          
data MyEnum = Enum1 | Enum2 | Enum3 deriving Show
$(derive [''MyEnum])
instance WxGen MyEnum