Gtk2hs множественный столбец TreeView с проблемой ListStore

Я не могу заставить GTK визуализировать данные в TreeView с моделью ListStore с несколькими столбцами через Haskell. У меня есть следующий код

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

Затем я пытаюсь добавить некоторые данные, и возникают проблемы. Я попробовал это:

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

Но во всех случаях я вижу таблицу со вставленным заголовком столбца и одной пустой строкой. Любая помощь будет оценена.

1 ответ

Решение

Я пропустил важную вещь. Поскольку модель ListStore является полиморфной, вы должны описать, КАК модель должна извлекать данные из данных ей объектов. Каждый раз, когда вы добавляете новый столбец, вы должны написать код, подобный этому (пример рендера текста):

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

где row это ваши данные.

Итак, это код решения с данными, реализованными с помощью "варианта 1" (см. Вопрос):

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
Другие вопросы по тегам