2017-08-24 10 views
4

HaskellとのGTK +バインディングのトグルボタンの使い方を理解する上で問題があります。HaskellとGladeのトグルボタンを使用

私がしたいことは、treeViewを2つの列、つまりストリングを含むものとトグルボタンを含むものとで表示することです。ユーザは、トグルボタンをチェックして、プログラムの別の部分で使用したい入力を選択しなければならない。

私のモデルは、トグルボタン(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 

それは、ツリービュー複製を開始でうまく動作しますが、私はトグルボタンをクリックしたときに、それがinitalizedた状態で残る:

は、ここに私のコードです。特定のセルのcellToggledをキャッチして、モデルを適切に変更したいのですが、ツリービューの選択範囲内をナビゲートする方法がわかりません。

任意の助けいただければ幸いです:) theGtknerdのコメントやドキュメントのいくつかの深刻な掘削に

+2

申し訳ありませんが、あなたに表示するためのHaskellコードはありません。とにかくレンダラの 'toggled'シグナルに接続して自分で店舗を変更する必要があります。レンダラーは自動的に現在の状態を表示します。 – theGtknerd

+0

店舗の変更を「クリックされた」ボタンにバインドしたときに動作していたようですが、「トグルされた」信号はややバグがあります。 –

答えて

0

解決のおかげで(なぜラムダ式、私はまだ理解していないaltough: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 
関連する問題