On 23.08.2012, at 18:37, Rouan van Dalen wrote:
> Hi everyone,
> I am having some trouble with the TreeView in gtk2hs.
> (I am using gtk2hs 0.12.3 with ghc 7.4.2 on windows 7 x64.)
> I would like to achieve the following: in 1 set up the TreeView and
> its columns and
> renderers, and in a different function set the model for the
> TreeView control so
> the data can be displayed. I have the following code:
> populateTreeView :: TreeView -> IO ()
> populateTreeView tv = do
> list <- listStoreNew [["Vince", "1"], ["Jhen", "2"], ["Chris",
> "3"], ["Sharon", "4"]]
> treeViewSetModel tv list -- this call throws warnings saying
> that the model is different from the
> -- one that was used in the function
> setupTreeView :: TreeView -> IO ()
> setupTreeView treeview = do
> model <- treeStoreNew ( :: [Tree String])
> widgetSetSizeRequest treeview 300 (-1)
> renderer <- Model.cellRendererTextNew
> col <- Model.treeViewColumnNew
> Model.treeViewColumnSetTitle col "Upcoming Birtdays"
> Model.cellLayoutPackStart col renderer False
> Model.cellLayoutSetAttributes col renderer model -- My
> problem is here I need to supply a model.
> $ \l -> [Model.cellText := l] -- Is there
> a function I can use to define how
> -- a cell is
> rendered without supplying the model?
> Model.treeViewAppendColumn treeview col
> After looking at the source code, it seems that the
> function is not exposed in gtk2hs because of variable argument list
> FFI restriction.
The CellLayout is an interface that a TreeViewColumn implements since
TreeViewColumn is an instance of CellLayoutClass. As such, the C
function you mention is just the implementation of this interface.
Using the functions in CellLayout has exactly the same effect.
> Is there a way to work around this problem?
Not really. Replacing the model after setting up the attributes of the
renderers is in principle possible in C since it's then up to you to
supply a model with exactly the same column names and types. Since we
tried to get some type safety into the Haskell binding, you have to
create the model first and then setup attributes of cell renderers
using this model. Replacing the model after setting attributes will
never work since the Haskell implementation compares the pointer of
the model with which attributes were set against the model pointer in
the TreeView before running the Haskell function on it (since it has
to coerce a pointer to a C model to a Haskell model with the correct
Why do you need to replace the whole model? Is it to quickly replace
the data of a tree view? It would be possible to add a function that
simply replaced the contents of a ListStore with a new list (of the
> Live Security Virtual Conference
> Exclusive live event will cover all the ways today's security and
> threat landscape has changed and how IT managers can respond.
> will include endpoint security, mobile security and the latest in
> threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/_______________________________________________
> Gtk2hs-devel mailing list