与Haskell和Glade一起使用切换按钮
问题描述:
我在理解如何使用与Haskell绑定的GTK +切换按钮时遇到了一些麻烦。与Haskell和Glade一起使用切换按钮
我想要做的是显示一个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
它运作良好,在initating TreeView的,但是当我点击切换按钮,它仍然在它initalized的状态。我想赶上cellToggled
为特定的单元格,并正确地更改模型,但我不太明白如何在treeView选择内导航。
任何帮助,将不胜感激:)
答
解决由于theGtknerd的文档中的评论和一些严重的挖掘(altough我还是不明白,为什么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
对不起,我没有Haskell代码来显示你。无论如何,您必须连接到渲染器的“切换”信号并自行更改商店。渲染器将自动显示当前状态。 – theGtknerd
看来它工作时,我将商店更改绑定到一个'clicked'按钮,但'切换'信号是有点儿车(这里有一些混乱的类型) –