packages feed

AutoForms-0.4.0: src/Examples/Misc/WxEmbedded.hs

{-# LANGUAGE FlexibleContexts, FlexibleInstances
  , MultiParamTypeClasses, TemplateHaskell, UndecidableInstances #-}

module WxEmbedded where

import Graphics.UI.WX
import Graphics.UI.AF.AFWx as AF   -- cannot do qualified as `derive` then complains


data Counter = Counter Int     deriving (Show, Eq)
$(derive [''Counter])

-- Should not be neccesary, but GHC 6.6 requires it. Remove when we stop support for GHC 6.6.
instance ECCreator Counter

main :: IO ()
main = start $
    do w <- frame [text := "Counter"]
       p <- panel w []
       
       wid <- AF.makeWidget (Counter 117) p []
       upButton            <- button p [ text := "Up", enabled := True
                                       , on command := set wid [ value :~ \(Counter val) -> Counter $ val + 1 ]
                                       ]
       downButton          <- button p [ text := "Down", enabled := True
                                       , on command := set wid [ value :~ \(Counter val) -> Counter $ val - 1 ]
                                       ]
       restoreButton       <- button p [ text := "Restore", enabled := True
                                       , on command := set wid [ value := Counter 117 ]
                                       ]
       disableButton       <- button p [ text := "Disable", enabled := True
                                       , on command := set wid [ enabled := False ]
                                       ]
       enableButton        <- button p [ text := "Enable", enabled := True
                                       , on command := set wid [ enabled := True ]
                                       ]
       set wid [ on command := do val <- get wid value
                                  putStr $ "Direct input by user: " ++ show val ++ "\n"
                 ]
       
       set p [ layout := column 10 [ widget wid
                                   , row 5 [glue, widget upButton, widget downButton]
                                   , row 5 [glue, widget restoreButton]
                                   , row 5 [glue, widget disableButton, widget enableButton]
                                   ]
             ]
       set w [ layout := fill $ widget p ]