2017-08-24 4 views
4

J'ai quelques difficultés à comprendre comment utiliser les boutons à bascule pour la liaison GTK + avec Haskell.Utiliser le bouton bascule avec Haskell et Glade

Ce que je veux faire est d'afficher un treeView avec deux colonnes: l'une contenant des chaînes et l'autre contenant des boutons à bascule. L'utilisateur doit cocher les boutons à bascule pour sélectionner les entrées qu'il veut utiliser dans une autre partie du programme.

Mon modèle est une liste de tuples (String,Bool), le booléen censé refléter l'état du bouton bascule. Initialement, tous sont faux.

Voici mon code:

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 

Il fonctionne bien à initating TreeView, mais quand je clique sur un bouton à bascule, il reste à l'état dans lequel il a été initalized. Je voudrais attraper le cellToggled pour une cellule spécifique et changer le modèle correctement, mais je ne comprends pas très bien comment naviguer dans une sélection TreeView.

Toute aide serait grandement appréciée :)

+2

Désolé, je n'ai pas le code Haskell pour vous montrer. En tout cas, vous devez vous connecter au signal de rendu 'toggled' et changer le magasin vous-même. Le moteur de rendu affichera automatiquement l'état actuel. – theGtknerd

+0

Semble que cela a fonctionné quand je lie le changement de magasin à un bouton «cliqué», mais le signal «toggled» est quelque peu bogué (ayant quelques types de déconner ici) –

Répondre

0

résolus grâce au commentaire de theGtknerd et quelques recherches sérieuses dans la documentation (barbante je ne comprends toujours pas pourquoi l'expression 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