GTK2HS Multiple Column TreeView con problema di ListStore
Domanda
Non riesco a forzare GTK a rendere i dati in TreeView con il modello ListStore con più colonne tramite Haskell. Ho il codice seguente
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
Quindi provo ad aggiungere alcuni dati e ci sono problemi. Ho provato questi:
--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
Ma in tutti i casi vedo la tabella con l'intestazione della colonna e una riga vuota inserita. Qualsiasi aiuto sarà apprezzato.
Soluzione
Mi è stato perso una cosa importante. Poiché il modello di ListStore è polimorfico, è necessario descrivere come il modello dovrebbe estrarre dati da oggetti forniti. Ogni volta che aggiungi la nuova colonna, dovresti scrivere il codice come questo (esempio di rendering di testo):
cellLayoutSetAttributes yourColumn yourRenderer model (\row -> [ cellText := yourPowerfulValueExtractionFunction row ])
dove row
sono i tuoi dati.
Quindi questo è il codice della soluzione con i dati implementati con "variante 1" (vedi domanda):
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