使用Haskell和Glade的切换按钮

时间:2017-08-24 13:32:22

标签: haskell gtk togglebutton glade

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

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

我的模型是元组(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选择中导航。

任何帮助都将非常感谢:)

1 个答案:

答案 0 :(得分:0)

感谢格特纳德的评论和文档中的一些严肃的挖掘(尽管我仍然不明白为什么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