2011-06-28 29 views
5

Gtk2hs có các kiểu dữ liệu widget khác nhau triển khai lớp Widget. Có thể viết datatype tùy chỉnh mà không giống nhau?Triển khai tùy chỉnh cho lớp Widget trong gtkhs

Giả sử tôi muốn có tiện ích con để hiển thị và chạy mã Lua như thế này.

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

Có thể ở cấp Haskell không?

Trả lời

3

Không thể tạo tiện ích con mới 'lớp học' với Haskell trong gtk.

Những gì bạn có thể làm là cung cấp các thuộc tính tùy chỉnh cho loại tiện ích con hiện có. Ví dụ: trong gói plot-gtk trường dữ liệu tùy chỉnh (System.Glib.GObject) được thêm vào tiện ích drawingArea:

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 #-} 
Các vấn đề liên quan