使用 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
我在理解如何使用切换按钮进行 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