Re: user-defined data types & GtkListStore



On Thu, 2003-04-10 at 20:01, Bryan Kubishta wrote:

Hi, I'm brand new to the list, but didn't see anything about this while
searching the archives.  It looks like the core GTK developers monitor
this
list, which must be an incredible asset!

I want to store DBDATETIME structs in a column of GtkListStore, because
it
has the full date/time representation that our database has, instead of
requiring me to muck with GTime or GDate conversions and possible loss
of
data.  Customizing the text renderer for my TreeView was no problem
because
I had customized them before, so displaying would be simple.

So much for foresight!  The approach I took was to define a new
fundamental
GType (G_USER_TYPE_DBDATETIME), and register it.  It seemed simple,
because
my struct type easily fits in the data field of GValue.  I based my
setup &
registration code after what was done in gvaluetypes.c, and it
successfully
registers to the next fundamental type (196) without warnings.  But then
when I try to pass this new GType value into gtk_list_store_new() and
traced
into that code, it was glaringly obvious that  it relies on
gtktreedatalist.c->_gtk_tree_data_list_check_type (type), which has all
the
fundamental types hardcoded!  Why why why?  Wouldn't it be better to
have
the check_type function loop through a range of registered fundamental
types, instead of explicitly switching

The problem with supporting custom fundamental types, is that there
is no way of extracting the "data" from a GValue in a generic and public
way, so you'd have to store a full GValue structure for every data
items. Which would be a lot of overhead. (24 bytes per item as compared
to the current.)


I saw the suggestion in the archives about puting everything in a single
column, and even considered it for the sake of efficiency.  But the
convenience of having GTK handle sorting by specific columns is so nice, so
I dropped the idea.  The GTypes of my columns can be different every time
the program runs, (each column maps to whatever type happens to be in the
database table currently being viewed) so I didn't want to tackle the
sorting using my own structure.  TreeViews and ListStores _almost_ gave a
perfect framework for this.

But along the same lines of performance, I noticed that each column of data
is stored in an individual linked list.  I've got all my data stored
row-by-row instead of column-by-column.  Can anyone here verify that there's
a significant speedup by storing data grouped by column instead of row?

Also I noticed that the renderer gets called for all tree_view cells,
regardless of whether they are visible to the user or outside the bounds of
the tree_view.  Is there a simple way to eliminate this waste, or am I doing
something wrong?

-Bryan
So there's my dilemma.  Is there a better way to achieve my goal than
creating a new user type?  Can I make my current approach work without
modifying the core gtk code?

The approach I always seem to be advocating here for doing TreeViews is:

 - Put only a single column in the store, of type G_TYPE_POINTER,
   or if you want to get a little fancier, of a boxed type you register,
   and in that column, store a pointer to the application data structure
   that each row corresponds to.

 - Use gtk_tree_view_column_set_cell_data_func() to set the attributes
   on the cell renderers for display.

It's a little more complex than the more common usage of direct
cell renderer attribute => module column mapping.

But:

 - You can frequently avoid copying application data into the
   model, which is a nuisance, especially if your app data types
   don't map well onto GLib types.

 - It's more flexible in what you can store and how you can format
   it for display.

 - It can be more efficient. There is a distinct overhead for
   extra columns.

Regards,
                                             Owen






[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]