packages feed

binding-wx-0.2: demo/lists.hs

import Control.Monad
import Data.IORef
import Data.List
import Graphics.UI.WX

import Data.Binding.List
import Graphics.UI.WX.Binding

data Person = Person {name::String, age::Int, active::Bool} deriving (Read, Show)

main = do --read the input
          f <- readFile "in.txt"
          bl <- toBindingList $ read f :: IO (BindingList IORef Person)
          start $ do --create widgits
                     window <- frame [text := "Data Binding with WxHaskell"]
                     name' <- entry window []
                     age' <- spinCtrl window 0 120 []
                     active' <- checkBox window []
                     --bind them
                     nav <- navigation window bl $ Person "" 0 False
                     bindControl bl name name' text (\p n -> p {name = n})
                     bindControl bl (fromIntegral . age) age' selection (\p a -> p {age = a})
                     bindControl bl active active' checked (\p a -> p {active = a})
                     --arrange the widgits
                     let labels = map (floatRight . label) ["Name:", "Age:", "Active:"]
                     let widgets = map floatLeft [widget name', widget age', widget active']
                     --start the application
                     set window [layout := column 10 [grid 10 10 $ transpose [labels, widgets], nav]
                                ,on closing := fromBindingList bl >>= \l -> writeFile "out.txt" (show l) >> propagateEvent]