gpt4 book ai didi

haskell - gtkhs 中 Widget 类的自定义实现

转载 作者:行者123 更新时间:2023-12-04 15:26:33 24 4
gpt4 key购买 nike

Gtk2hs 有各种实现 Widget 类的小部件数据类型。是否可以编写具有相同功能的自定义数据类型?

假设我想要一个小部件来显示和运行这样的 Lua 代码。

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

在 Haskell 级别上可能吗?

最佳答案

在 gtk 中无法使用 Haskell 创建新的小部件“类”。

您可以做的是为现有的小部件类型提供自定义属性。例如,在包 plot-gtk 中自定义数据字段 ( System.Glib.GObject ) 被添加到 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 #-}

关于haskell - gtkhs 中 Widget 类的自定义实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6511907/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com