-- |AutoForm functions closely integrated with WxHaskell. module Graphics.UI.AF.AFWx ( -- * Example -- $example -- * Creating widgets makeWidget, makeWidget', AFWx , module Graphics.UI.AF.General.MySYB -- * 'AF.EC' , AF.EC, AF.ECCreator , AF.limit, AF.giveFocus , AF.mapValue -- ** GUI-layout of 'AF.EC' types , AF.layoutAs, AF.singleColumn, AF.dualColumn, AF.singleRow , AF.finalDepth ) where import qualified Graphics.UI.AF.WxFormAll as AF import qualified Graphics.UI.AF.WxForm.EditorComponent as AF import qualified Graphics.UI.AF.WxForm.ComIO as ComIO import Graphics.UI.WX hiding (parent) import Graphics.UI.WXCore import Graphics.UI.AF.General.MySYB import Control.Monad(liftM) -- |Contains a widget representing an arbitrary type. data AFWx a = AFWx { pickComIO :: ComIO.ComIO a , pickLayout :: Layout } instance Widget (AFWx a) where widget = pickLayout instance Commanding (AFWx a) where command = newEvent "Commanding" getter setter where getter w = get (pickComIO w) (on command) setter w action = set (pickComIO w) [ on command := action ] instance Able (AFWx a) where enabled = mapToAFWx "Able" enabled instance Valued AFWx where value = mapToAFWx "Value" value mapToAFWx :: String -> Attr (ComIO.ComIO a) a1 -> Attr (AFWx a) a1 mapToAFWx name attribute = newAttr name getter setter where getter w = get (pickComIO w) attribute setter w val = set (pickComIO w) [ attribute := val ] -- |A more constrained version of 'makeWidget''. makeWidget :: (AF.ECCreator a) => a -> Window w -> [Prop (AFWx a)] -> IO (AFWx a) makeWidget x parent props = makeWidget' id x parent props -- |Creating a widget for any type, which is an instance of ECCreator. makeWidget' :: (AF.ECCreator a) => (AF.EC a -> AF.EC a) -- ^Used to transform the created widget. See 'AF.limit', 'AF.giveFocus' -- and the functions in "AF.AutoForm". -- Also see the EmbeddedTree example. -> a -- ^The value to represent in a GUI. -> Window w -- ^The window (or panel) to represent the value in. -> [Prop (AFWx a)] -- ^Initial properties to set. -> IO (AFWx a) makeWidget' ecToEC x parent props = do (comIO, widAndGui) <- AF.runWxM (AF.runEC $ ecToEC $ AF.mkCom x) parent (return ()) parent (lay, _) <- maybe AF.nonEditableLayout AF.unboxedLayout (liftM snd widAndGui) let afwx = AFWx comIO lay set afwx props return $ AFWx comIO lay {- $example An example of using AutoForm and WxHaskell together: >import Graphics.UI.WX >import Graphics.UI.AF.AFWx > >main :: IO () >main = start $ > do w <- frame [text := "Small example"] > p <- panel w [] > > wid <- makeWidget (0.96::Double, 123::Int, "asdf") p [ ] > setWidButton <- button p [ text := "Set widget" > , on command := set wid [ value := (0.32, 456, "New Value") ] > ] > > set w [ layout := container p $ fill $ column 10 > [ widget wid, widget setWidButton ] > ] -}