使用 Haskell 和 Glade 的切换按钮

Use toggle button with Haskell and Glade

我在理解如何使用切换按钮进行 GTK+ 与 Haskell 绑定时遇到了一些问题。

我想要做的是显示一个包含两列的 treeView:一列包含字符串,另一列包含切换按钮。用户必须勾选切换按钮 select 他想在程序的另一部分中使用的输入。

我的模型是一个元组列表 (String,Bool),布尔值应该反映切换按钮的状态。最初,都是假的。

这是我的代码:

treeview <- builderGetObject builder castToTreeView "diffDisplayTreeView"
treeviewselect <- treeViewGetSelection difftreeview
dcolumn <- builderGetObject builder castToTreeViewColumn "dcolumn"
selcolumn <- builderGetObject builder castToTreeViewColumn "selcolumn"
dcell <- builderGetObject builder castToCellRendererText "dcell"
selcell <- builderGetObject builder castToCellRendererToggle "selcell"
[...]
store <- listStoreNew modelFromSomewhereElse
cellLayoutSetAttributes dcolumn dcell store $ \x -> [cellText := fst(x)]
cellLayoutSetAttributes selcolumn selcell store $ \x -> [cellToggleActivate := snd(x)]
treeViewSetModel treeview store

它在初始化 treeView 时运行良好,但是当我单击切换按钮时,它仍保持初始化状态。我想捕获特定单元格的 cellToggled 并正确更改模型,但我不太了解如何在 treeView selection.

中导航

任何帮助将不胜感激:)

感谢 theGtknerd 的评论和文档中的一些认真挖掘(尽管我仍然不明白为什么 lambda 表达式:http://hackage.haskell.org/package/glib-0.13.4.1/docs/System-Glib-Signals.html#t:Signal):

toggleStuff t m = do
    tvwS <- treeViewGetSelection t
    tvwP <- treeSelectionGetSelectedRows tvwS
    if tvwP == []
        then return()
    else
        do let s = Prelude.head (Prelude.head tvwP)
           v <- listStoreGetValue m s
           listStoreSetValue m s (fst v, not (snd v))
[...]
a <- treeViewGetSelection treeview
b <- treeSelectionGetSelectedRows a

on celltg cellToggled $ \(b::[Char]) -> do toggleStuff treeview store