Chapter 3. GtkTreeModels for Data Storage: GtkListStore and GtkTreeStore
model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
g_object_ref(model); /
*
Make sure the model stays with us after the tree view unrefs it
*
/
gtk_tree_view_set_model(GTK_TREE_VIEW(view), NULL); /
*
Detach model from view
*
/
... insert a couple of thousand rows ...
gtk_tree_view_set_model(GTK_TREE_VIEW(view), model); /
*
Re-attach model to view
*
/
g_object_unref(model);
...
Secondly, you should make sure that sorting is disabled while you are doing your mass insertions, otherwise your
store might be resorted after each and every single row insertion, which is going to be everything but fast.
Thirdly, you should not keep around a lot of tree row references if you have so many rows, because with each
insertion (or removal) every single tree row reference will check whether its path needs to be updated or not.
3.4. Manipulating Row Data
Adding empty rows to a data store is not terribly exciting, so let’s see how we can add or change data in the store.
gtk_list_store_set and gtk_tree_store_set are used to manipulate a given row’s data. There is also
gtk_list_store_set_value and gtk_tree_store_set_value, but those should only be used by people
familiar with GLib’s GValue system.
Both gtk_list_store_set and gtk_tree_store_set take a variable number of arguments, and must be termi-
nated with a -1 argument. The first two arguments are a pointer to the model, and the iter pointing to the row
whose data we want to change. They are followed by a variable number of (column, data) argument pairs, termi-
nated by a -1. The column refers to the model column number and is usually an enum value (to make the code
more readable and to make changes easier). The data should be of the same data type as the model column.
Here is an example where we create a store that stores two strings and one integer for each row:
enum
{
COL_FIRST_NAME = 0,
COL_LAST_NAME,
COL_YEAR_BORN,
NUM_COLS
};
GtkListStore
*
liststore;
GtkTreeIter iter;
liststore = gtk_list_store_new(NUM_COLS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT);
/
*
Append an empty row to the list store. Iter will point to the new row
*
/
gtk_list_store_append(liststore, &iter);
/
*
Fill fields with some data
*
/
gtk_list_store_set (liststore, &iter,
COL_FIRST_NAME, "Joe",
COL_LAST_NAME, "Average",
COL_YEAR_BORN, (guint) 1970,
-1);
You do not need to worry about allocating and freeing memory for the data to store. The model (or more precisely:
the GLib/GObject GType and GValue system) will take care of that for you. If you store a string, for example, the
model will make a copy of the string and store that. If you then set the field to a new string later on, the model
will automatically free the old string and again make a copy of the new string and store the copy. This applies to
almost all types, be it G_TYPE_STRING or GDK_TYPE_PIXBUF.
The exception to note is G_TYPE_POINTER. If you allocate a chunk of data or a complex structure and store it
in a G_TYPE_POINTER field, only the pointer value is stored. The model does not know anything about the size
or content of the data your pointer refers to, so it could not even make a copy if it wanted to, so you need to
11