Pregunta

No puedo obligar a GTK a representar datos en TreeView con el modelo ListStore con múltiples columnas a través de Haskell. Tengo el siguiente código

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

Luego trato de agregar algunos datos y hay problemas. Intenté estos:

    --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

Pero en todos los casos veo la tabla con encabezado de columna y una fila en blanco insertada. Cualquier ayuda será apreciada.

¿Fue útil?

Solución

Me han extrañado algo importante. Dado que el modelo ListStore es Polymorphic, debe describir cómo el modelo debe extraer datos de los objetos que se le dan. Cada vez que agrega la nueva columna, debe escribir el código así (ejemplo de renderizador de texto):

cellLayoutSetAttributes yourColumn yourRenderer model (\row -> [ cellText := yourPowerfulValueExtractionFunction row ])

dónde row son sus datos.

Entonces, este es el código de la solución con datos implementados con "Variante 1" (ver pregunta):

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top