2011-06-28 9 views
5

Gtk2hs ma różne typy danych widgetów, które implementują klasę widżetów. Czy można napisać niestandardowy typ danych, który robi to samo?Własna implementacja klasy Widget w gtkhs

Powiedz, że chcę mieć widżet do wyświetlania i uruchamiania kodu Lua w ten sposób.

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

Czy to możliwe na poziomie Haskell?

Odpowiedz

3

Nie jest możliwe utworzenie nowych klas widżetów z Haskell w gtk.

Co można zrobić, to podać niestandardowe atrybuty do istniejącego typu widgetu. Na przykład, w opakowania plot-gtk polu danych niestandardowych (System.Glib.GObject) dodano do drawingArea widget:

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 #-}