2011-06-28 18 views
5

Gtk2hs, Widget sınıfını uygulayan çeşitli widget veri türlerine sahiptir. Aynı şeyi yapan özel veri türü yazmak mümkün mü?gtkhs'de Widget sınıfı için özel uygulama

Bu şekilde Lua kodunu görüntülemek ve çalıştırmak için widget'a sahip olmak istediğimi varsayalım.

data LuaWidget = LuaWidget { text :: TextView, package :: HBox } deriving Eq 
instance Widget LuaWidget where 
    .... 

Haskell seviyesinde kullanılabilir mi?

cevap

3

gtk içinde Haskell ile yeni widget 'sınıfları' oluşturmak mümkün değildir.

Yapabilecekleriniz varolan bir parçacık türüne özel nitelikler vermektir.

import System.Glib.GObject 
import Graphics.UI.Gtk 

-- | create a new 'Figure' plot 
plotNew :: FigureHandle -> IO DrawingArea 
plotNew f = do 
    canvas <- drawingAreaNew 

    set canvas [maybeFigure := (Just f)] 

    _ <- on canvas exposeEvent $ tryEvent $ liftIO $ do 
      s <- widgetGetSize canvas 
      drw <- widgetGetDrawWindow canvas 
      fig <- get canvas figure 
      renderWithDrawable drw (renderFigureState fig s) 

    return canvas 

-- | the figure attribute 
figure :: Attr DrawingArea FigureState 
figure = newAttr getFigure setFigure 
    where getFigure o = do 
       Just f <- get o maybeFigure 
       readMVar f 
     setFigure o f = set o [maybeFigure :~> (\(Just h) -> do 
       modifyMVar_ h (\_ -> return f) 
       return $ Just h)] 

maybeFigure :: Attr DrawingArea (Maybe FigureHandle) 
maybeFigure = unsafePerformIO $ objectCreateAttribute 
{-# NOINLINE maybeFigure #-} 
Örneğin, paket plot-gtk özel bir veri alanı ( System.Glib.GObject) ve drawingArea aracının ilave edilir