2017-08-24 60 views
4

我在理解如何使用與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選擇內導航。

任何幫助,將不勝感激:)

+2

對不起,我沒有Haskell代碼來顯示你。無論如何,您必須連接到渲染器的「切換」信號並自行更改商店。渲染器將​​自動顯示當前狀態。 – theGtknerd

+0

看來它工作時,我將商店更改綁定到一個'clicked'按鈕,但'切換'信號是有點兒車(這裏有一些混亂的類型) –

回答

0

解決由於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