2000-11-14 16:37:32 +00:00
|
|
|
<!-- ##### SECTION Title ##### -->
|
|
|
|
GtkTreeModelSort
|
|
|
|
|
|
|
|
<!-- ##### SECTION Short_Description ##### -->
|
2004-01-22 06:48:20 +00:00
|
|
|
A GtkTreeModel which makes an underlying tree model sortable
|
2000-11-14 16:37:32 +00:00
|
|
|
|
|
|
|
<!-- ##### SECTION Long_Description ##### -->
|
|
|
|
<para>
|
2004-01-22 06:48:20 +00:00
|
|
|
The #GtkTreeModelSort is a model which implements the #GtkTreeSortable
|
|
|
|
interface. It does not hold any data itself, but rather is created with
|
|
|
|
a child model and proxies its data. It has identical column types to
|
|
|
|
this child model, and the changes in the child are propagated. The
|
|
|
|
primary purpose of this model is to provide a way to sort a different
|
2005-07-25 13:55:31 +00:00
|
|
|
model without modifying it. Note that the sort function used by
|
|
|
|
#GtkTreeModelSort is not guaranteed to be stable.
|
2004-01-22 06:48:20 +00:00
|
|
|
</para>
|
|
|
|
<para>
|
|
|
|
The use of this is best demonstrated through an example. In the
|
|
|
|
following sample code we create two #GtkTreeView widgets each with a
|
|
|
|
view of the same data. As the model is wrapped here by a
|
|
|
|
#GtkTreeModelSort, the two #GtkTreeView<!-- -->s can each sort their
|
|
|
|
view of the data without affecting the other. By contrast, if we
|
|
|
|
simply put the same model in each widget, then sorting the first would
|
|
|
|
sort the second.
|
|
|
|
</para>
|
|
|
|
<para>
|
|
|
|
<example>
|
|
|
|
<title>Using a <structname>GtkTreeModelSort</structname></title>
|
|
|
|
<programlisting>
|
|
|
|
{
|
|
|
|
GtkTreeView *tree_view1;
|
|
|
|
GtkTreeView *tree_view2;
|
|
|
|
GtkTreeModel *sort_model1;
|
|
|
|
GtkTreeModel *sort_model2;
|
|
|
|
GtkTreeModel *child_model;
|
|
|
|
|
|
|
|
/* get the child model */
|
|
|
|
child_model = get_my_model ();
|
|
|
|
|
|
|
|
/* Create the first tree */
|
|
|
|
sort_model1 = gtk_tree_model_sort_new_with_model (child_model);
|
|
|
|
tree_view1 = gtk_tree_view_new_with_model (sort_model1);
|
2000-11-14 16:37:32 +00:00
|
|
|
|
2004-01-22 06:48:20 +00:00
|
|
|
/* Create the second tree */
|
|
|
|
sort_model2 = gtk_tree_model_sort_new_with_model (child_model);
|
|
|
|
tree_view2 = gtk_tree_view_new_with_model (sort_model2);
|
|
|
|
|
|
|
|
/* Now we can sort the two models independently */
|
|
|
|
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sort_model1),
|
|
|
|
COLUMN_1, GTK_SORT_ASCENDING);
|
|
|
|
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sort_model2),
|
|
|
|
COLUMN_1, GTK_SORT_DESCENDING);
|
|
|
|
}
|
|
|
|
</programlisting>
|
|
|
|
</example>
|
|
|
|
</para>
|
|
|
|
|
|
|
|
<para>
|
|
|
|
To demonstrate how to access the underlying child model from the sort
|
|
|
|
model, the next example will be a callback for the #GtkTreeSelection
|
|
|
|
"changed" signal. In this callback, we get a string from COLUMN_1 of
|
|
|
|
the model. We then modify the string, find the same selected row on the
|
|
|
|
child model, and change the row there.
|
2000-11-14 16:37:32 +00:00
|
|
|
</para>
|
|
|
|
|
|
|
|
<para>
|
2004-01-22 06:48:20 +00:00
|
|
|
<example>
|
|
|
|
<title>Accessing the child model of in a selection changed callback</title>
|
|
|
|
<programlisting>
|
|
|
|
void
|
|
|
|
selection_changed (GtkTreeSelection *selection, gpointer data)
|
|
|
|
{
|
|
|
|
GtkTreeModel *sort_model = NULL;
|
|
|
|
GtkTreeModel *child_model;
|
|
|
|
GtkTreeIter sort_iter;
|
|
|
|
GtkTreeIter child_iter;
|
|
|
|
char *some_data = NULL;
|
|
|
|
char *modified_data;
|
2000-11-14 16:37:32 +00:00
|
|
|
|
2004-01-22 06:48:20 +00:00
|
|
|
/* Get the current selected row and the model. */
|
|
|
|
if (! gtk_tree_selection_get_selected (selection,
|
|
|
|
&sort_model,
|
|
|
|
&sort_iter))
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
/* Look up the current value on the selected row and get a new value
|
|
|
|
* to change it to.
|
|
|
|
*/
|
|
|
|
gtk_tree_model_get (GTK_TREE_MODEL (sort_model), &sort_iter,
|
|
|
|
COLUMN_1, &some_data,
|
|
|
|
-1);
|
|
|
|
|
|
|
|
modified_data = change_the_data (some_data);
|
|
|
|
g_free (some_data);
|
|
|
|
|
|
|
|
/* Get an iterator on the child model, instead of the sort model. */
|
|
|
|
gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (sort_model),
|
|
|
|
&child_iter,
|
|
|
|
&sort_iter);
|
|
|
|
|
|
|
|
/* Get the child model and change the value of the row. In this
|
|
|
|
* example, the child model is a GtkListStore. It could be any other
|
|
|
|
* type of model, though.
|
|
|
|
*/
|
|
|
|
child_model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (sort_model));
|
|
|
|
gtk_list_store_set (GTK_LIST_STORE (child_model), &child_iter,
|
|
|
|
COLUMN_1, &modified_data,
|
|
|
|
-1);
|
|
|
|
g_free (modified_data);
|
|
|
|
}
|
|
|
|
</programlisting>
|
|
|
|
</example>
|
2000-11-14 16:37:32 +00:00
|
|
|
</para>
|
|
|
|
|
2004-01-22 06:48:20 +00:00
|
|
|
<!-- ##### SECTION See_Also ##### -->
|
2001-11-15 22:20:18 +00:00
|
|
|
<para>
|
2004-01-22 06:48:20 +00:00
|
|
|
#GtkTreeModel, #GtkListStore, #GtkTreeStore, #GtkTreeSortable, #GtkTreeModelFilter
|
|
|
|
</para>
|
2001-11-15 22:20:18 +00:00
|
|
|
|
2005-06-20 22:06:27 +00:00
|
|
|
<!-- ##### SECTION Stability_Level ##### -->
|
|
|
|
|
|
|
|
|
2010-05-08 05:18:53 +00:00
|
|
|
<!-- ##### SECTION Image ##### -->
|
|
|
|
|
|
|
|
|
2004-01-22 06:48:20 +00:00
|
|
|
<!-- ##### STRUCT GtkTreeModelSort ##### -->
|
|
|
|
<para>
|
|
|
|
This should not be accessed directly. Use the accessor functions below.
|
2001-11-15 22:20:18 +00:00
|
|
|
</para>
|
|
|
|
|
|
|
|
|
2004-07-20 02:26:06 +00:00
|
|
|
<!-- ##### ARG GtkTreeModelSort:model ##### -->
|
|
|
|
<para>
|
|
|
|
|
|
|
|
</para>
|
|
|
|
|
2000-11-14 16:37:32 +00:00
|
|
|
<!-- ##### FUNCTION gtk_tree_model_sort_new_with_model ##### -->
|
|
|
|
<para>
|
|
|
|
|
|
|
|
</para>
|
|
|
|
|
2001-01-09 16:41:17 +00:00
|
|
|
@child_model:
|
2000-11-14 16:37:32 +00:00
|
|
|
@Returns:
|
|
|
|
|
|
|
|
|
2001-10-03 04:44:13 +00:00
|
|
|
<!-- ##### FUNCTION gtk_tree_model_sort_get_model ##### -->
|
|
|
|
<para>
|
|
|
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
@tree_model:
|
|
|
|
@Returns:
|
|
|
|
|
|
|
|
|
2001-11-21 21:43:47 +00:00
|
|
|
<!-- ##### FUNCTION gtk_tree_model_sort_convert_child_path_to_path ##### -->
|
|
|
|
<para>
|
|
|
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
@tree_model_sort:
|
|
|
|
@child_path:
|
|
|
|
@Returns:
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ##### FUNCTION gtk_tree_model_sort_convert_child_iter_to_iter ##### -->
|
|
|
|
<para>
|
|
|
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
@tree_model_sort:
|
|
|
|
@sort_iter:
|
|
|
|
@child_iter:
|
2008-05-30 05:08:50 +00:00
|
|
|
@Returns:
|
2001-11-21 21:43:47 +00:00
|
|
|
|
|
|
|
|
|
|
|
<!-- ##### FUNCTION gtk_tree_model_sort_convert_path_to_child_path ##### -->
|
|
|
|
<para>
|
|
|
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
@tree_model_sort:
|
|
|
|
@sorted_path:
|
|
|
|
@Returns:
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ##### FUNCTION gtk_tree_model_sort_convert_iter_to_child_iter ##### -->
|
|
|
|
<para>
|
|
|
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
@tree_model_sort:
|
|
|
|
@child_iter:
|
|
|
|
@sorted_iter:
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ##### FUNCTION gtk_tree_model_sort_reset_default_sort_func ##### -->
|
|
|
|
<para>
|
|
|
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
@tree_model_sort:
|
|
|
|
|
|
|
|
|
|
|
|
<!-- ##### FUNCTION gtk_tree_model_sort_clear_cache ##### -->
|
|
|
|
<para>
|
|
|
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
@tree_model_sort:
|
|
|
|
|
|
|
|
|
Documentation fixes.
Sun Oct 13 18:50:14 2002 Soeren Sandmann <sandmann@daimi.au.dk>
* gtkmenu.c, gtkmenu.sgml, gtkitemfactory.c, gdkwindow.c,
gtkwindow.c, gtkpaned.sgml, gtkdialog.c, gtkbox.h, gtkbutton.sgml,
gtktreemodel.sgml,gtktable.sgml, gtktable.c:
Documentation fixes.
#85719, #90759, #95169, Owen Taylor;
#89221, Yao Zhang, Matthias Clasen;
#95592, Joost Faassen;
#92637, Vitaly Tishkov;
#94616, Ben Martin;
#94772, sbaillie@bigpond.net.au;
2002-10-13 17:17:14 +00:00
|
|
|
<!-- ##### FUNCTION gtk_tree_model_sort_iter_is_valid ##### -->
|
|
|
|
<para>
|
|
|
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
@tree_model_sort:
|
|
|
|
@iter:
|
|
|
|
@Returns:
|
|
|
|
|
|
|
|
|