Gtk2hs TreeView plusieurs colonnes avec le numéro ListStore
Question
I ne peut pas forcer GTK pour rendre les données dans TreeView avec le modèle ListStore avec plusieurs colonnes à travers Haskell. J'ai le code suivant
addTextColumn view name =
do
col <- treeViewColumnNew
rend <- cellRendererTextNew
treeViewColumnSetTitle col name
treeViewColumnPackStart col rend True
treeViewColumnSetExpand col True
treeViewAppendColumn view col
prepareTreeView view =
do
addTextColumn view "column1"
addTextColumn view "column2"
--adding data here
Alors je tente d'ajouter des données, et il y a des problèmes. J'ai essayé ces:
--variant 1 (data TRow = TRow {one::String, two::String}
model <- listStoreNew ([] :: [TRow])
listStoreAppend model $ TRow { one = "Foo", two = "Boo" }
treeViewSetModel view model
--variant 2
model <- listStoreNew ([] :: [[String]])
listStoreAppend model ["foo","boo"]
treeViewSetModel view model
--variant 3
model <- listStoreNew ([] :: [(String, String)])
listStoreAppend model ("foo", "boo")
treeViewSetModel view model
Mais dans tous les cas, je vois la table avec en-tête de la colonne et une ligne vide insérée. Toute aide sera appréciée.
La solution
J'ai manqué une chose importante. Étant donné que le modèle ListStore est polymorphique, vous devez décrire comment le modèle doit extraire des données à partir d'objets qui lui sont données. Chaque fois que vous ajoutez la nouvelle colonne, vous devez écrire le code comme celui-ci (texte exemple renderer):
cellLayoutSetAttributes yourColumn yourRenderer model (\row -> [ cellText := yourPowerfulValueExtractionFunction row ])
où est row
vos données.
C'est donc le code de la solution avec les données mises en œuvre avec "variante 1" (voir la question):
prepareTreeView view =
do
model <- listStoreNew ([] :: [TRow])
addTextColumn view model one "one"
addTextColumn view model two "two"
listStoreAppend model $ TRow { one = "foo", two = "boo" }
treeViewSetModel view model
--
addTextColumn view model f name =
do
col <- treeViewColumnNew
rend <- cellRendererTextNew
treeViewColumnSetTitle col name
treeViewColumnPackStart col rend True
-- LOOK HERE:
cellLayoutSetAttributes col rend model (\row -> [ cellText := f row ])
treeViewColumnSetExpand col True
treeViewAppendColumn view col