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.

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top