El modelo GtkTreeStore

Es muy similar al modelo GtkListStore, pero este permite manejar jerarquías a través de un manejo más refinado de los iteradores. Este modelo es utilizado para almacenar los datos en forma de árbol. El prototipo de la función para crear un TreeStore es:

GtkTreeStore* gtk_tree_store_new(n_columns,  
 ...); 
gint  n_columns;
 ...;

El primer parámetro indica el número de columnas, los siguientes definen los tipos GTYPE que tendrán las columnas correspondientes. Consideremos la lista enumerada del Ejemplo 1, “Una lista enumerada típica” para el siguiente ejemplo:

Ejemplo 5. Creación de un modelo GtkTreeStore

	GtkTreeStore *model;

	model = gtk_tree_store_new (NUM_COLUMNS, G_TYPE_INT, G_TYPE_STRING,
				GDK_TYPE_PIXBUF, G_TYPE_BOOLEAN);

	g_object_unref (G_OBJECT (model))


Inserción de datos

Para insertar datos al modelo podemos utilizar varias funciones, dependiendo de la posición donde queramos insertar los datos.

void gtk_tree_store_insert(*tree_store,  
 *iter,  
 *parent,  
 position); 
GtkTreeStore  *tree_store;
GtkTreeIter  *iter;
GtkTreeIter  *parent;
gint  position;
void gtk_tree_store_insert_before(*tree_store,  
 *iter,  
 *parent,  
 *sibling); 
GtkTreeStore  *tree_store;
GtkTreeIter  *iter;
GtkTreeIter  *parent;
GtkTreeIter  *sibling;
void gtk_tree_store_insert_after(*tree_store,  
 *iter,  
 *parent,  
 *sibling); 
GtkTreeStore  *tree_store;
GtkTreeIter  *iter;
GtkTreeIter  *parent;
GtkTreeIter  *sibling;
void gtk_tree_store_append(*tree_store,  
 *iter,  
 *parent); 
GtkTreeStore  *tree_store;
GtkTreeIter  *iter;
GtkTreeIter  *parent;
void gtk_tree_store_prepend(*tree_store,  
 *iter,  
 *parent); 
GtkTreeStore  *tree_store;
GtkTreeIter  *iter;
GtkTreeIter  *parent;

Ejemplo 6. Inserción de una fila en un GtkTreeStore

		gtk_tree_store_append (model, &iter, NULL);

		gtk_tree_store_append (model, &iter, &parent);

A diferencia de las funciones equivalentes del ListStore, acá aparece un tercer parametro que nos permite asociar la nueva fila con otro elemento. Es asi, que para el primer caso, no asociamos la nueva fila a ningún elemento, caso contrario del segundo, en que si asociamos la nueva linea a un elemento identificado por parent. Cuando asociamos una nueva linea a algún elemento, esta nueva linea aparecerá debajo del elemento parent.

Asignar valores a la nueva fila

Ya hemos creado la nueva fila, ahora tenemos que asignarle los valores a las columnas, para ello podemos utilizar dos funciones, que son equivalentes a las utilizadas en GtkListStore.

	      gtk_tree_store_set_value(GtkTreeStore *tree_store, GtkTreeIter *iter, gint column, GValue *value);

	      gtk_tree_store_set(GtkTreeStore *tree_store, GtkTreeIter *iter, ...);

Para el caso de gtk_tree_store_set_value(), los valores deben ser ingresados uno por uno a las columnas, haciendo las llamadas a esta función por cada columna definida. En cambio con gtk_tree_store_set(), podemos asignar los datos de una sola ves a todas las columnas haciendo una sola llamada a esta función. Importante es no olvidar que el último parametro de esta función debe ser el valor -1, para indicar que se a terminado la lista de columnas.

Modificación de datos

Para modificar algún dato, debemos obtener la información necesaria para llegar a el, la fila y la columna que queremos modificar. Una ves obtenida esta información, modificamos los datos utilizando las funciones de inserción.

Ejemplo 7. Modificación de datos en un GtkTreeStore

	  GtkTreeIter iter;
	  GtkTreeModel *model;
	  GtlTreeStore *store;
	  GtkTreeSelection *select;

	  /* obtiene el TreeStore del TreeView */
	  store = (GtkTreeStore *) gtk_tree_view_get_model(treeview);

	  /* obtiene la selección actual que hay en el TreeView */
	  select = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
	  
	  /* obtiene el iter del elemento seleccionado en le TreeView */
	  gtk_tree_selection_get_selected(select,&model,&iter);

	  /* modifica el valor de la primera columna */
	  gtk_tree_store_set(store,&iter,COLUMN_COMMENTS,"Nuevo texto",-1);

En este ejemplo, hemos cambiado el texto de la columna COLUMN_COMMENTS. Podríamos haber cambiado los valores de todas las columnas simplemente indicando la columna y el nuevo valor.

Eliminación de datos

Para eliminar una fila, debemos conocer cual es su posición. en el siguiente ejemplo se utiliza la función gtk_tree_store_remove() para eliminar la fila del modelo.

Ejemplo 8. Eliminación de una fila en un GtkTreeStore

	  gtk_tree_selection_get_selected(select,&model,&iter);

	  gtk_tree_store_remove(store,&iter);