Пользовательская реализация для класса Widget в gtkhs - PullRequest
6 голосов
/ 28 июня 2011

Gtk2hs имеет различные типы данных виджетов, которые реализуют класс Widget.Можно ли написать пользовательский тип данных, который делает то же самое?

Скажем, я хочу иметь виджет для отображения и запуска кода Lua, как это.

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

Возможно ли это на уровне Haskell?

1 Ответ

4 голосов
/ 29 июня 2011

Невозможно создать новые классы виджетов с помощью Haskell в gtk.

Что вы можете сделать, это присвоить пользовательские атрибуты существующему типу виджета.Например, в пакете plot-gtk к виджету drawingArea добавлено поле пользовательских данных (System.Glib.GObject):

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