## GtkTreeSortable GtkTreeSortable — The interface for sortable models used by GtkTreeView |

## Synopsis

    #include <gtk/gtk.h>

                        GtkTreeSortable;
    struct              GtkTreeSortableIface;
    gint                (*GtkTreeIterCompareFunc)           (GtkTreeModel *model,
                                                             GtkTreeIter *a,
                                                             GtkTreeIter *b,
                                                             gpointer user_data);
    void                gtk_tree_sortable_sort_column_changed
                                                            (GtkTreeSortable *sortable);
    gboolean            gtk_tree_sortable_get_sort_column_id
                                                            (GtkTreeSortable *sortable,
                                                             gint *sort_column_id,
                                                             GtkSortType *order);
    void                gtk_tree_sortable_set_sort_column_id
                                                            (GtkTreeSortable *sortable,
                                                             gint sort_column_id,
                                                             GtkSortType order);
    void                gtk_tree_sortable_set_sort_func     (GtkTreeSortable *sortable,
                                                             gint sort_column_id,
                                                             GtkTreeIterCompareFunc sort_func,
                                                             gpointer user_data,
                                                             GDestroyNotify destroy);
    void                gtk_tree_sortable_set_default_sort_func
                                                            (GtkTreeSortable *sortable,
                                                             GtkTreeIterCompareFunc sort_func,
                                                             gpointer user_data,
                                                             GDestroyNotify destroy);
    gboolean            gtk_tree_sortable_has_default_sort_func
                                                            (GtkTreeSortable *sortable);

## Object Hierarchy

      GInterface
       +----GtkTreeSortable

## Prerequisites

GtkTreeSortable requires GtkTreeModel and GObject.

## Known Implementations

GtkTreeSortable is implemented by GtkListStore, GtkTreeModelSort and GtkTreeStore.

## Signals

      "sort-column-changed"                            : Run Last

## Description

GtkTreeSortable is an interface to be implemented by tree models which support sorting. The GtkTreeView uses the methods provided by this interface to sort the model.

## Details

### GtkTreeSortable

    typedef struct _GtkTreeSortable GtkTreeSortable;

### struct GtkTreeSortableIface

    struct GtkTreeSortableIface {
      GTypeInterface g_iface;

      /* signals */
      void     (* sort_column_changed)   (GtkTreeSortable        *sortable);

      /* virtual table */
      gboolean (* get_sort_column_id)    (GtkTreeSortable        *sortable,
    				      gint                   *sort_column_id,
    				      GtkSortType            *order);
      void     (* set_sort_column_id)    (GtkTreeSortable        *sortable,
    				      gint                    sort_column_id,
    				      GtkSortType             order);
      void     (* set_sort_func)         (GtkTreeSortable        *sortable,
    				      gint                    sort_column_id,
    				      GtkTreeIterCompareFunc  func,
    				      gpointer                data,
    				      GDestroyNotify          destroy);
      void     (* set_default_sort_func) (GtkTreeSortable        *sortable,
    				      GtkTreeIterCompareFunc  func,
    				      gpointer                data,
    				      GDestroyNotify          destroy);
      gboolean (* has_default_sort_func) (GtkTreeSortable        *sortable);
    };

### GtkTreeIterCompareFunc ()

    gint                (*GtkTreeIterCompareFunc)           (GtkTreeModel *model,
                                                             GtkTreeIter *a,
                                                             GtkTreeIter *b,
                                                             gpointer user_data);

A GtkTreeIterCompareFunc should return a negative integer, zero, or a positive integer if `a` sorts before `b`, `a` sorts with `b`, or `a` sorts after `b` respectively. If two iters compare as equal, their order in the sorted model is undefined. In order to ensure that the GtkTreeSortable behaves as expected, the GtkTreeIterCompareFunc must define a partial order on the model, i.e. it must be reflexive, antisymmetric and transitive.

For example, if `model` is a product catalogue, then a compare function for the "price" column could be one which returns `price_of(`a`) - price_of(`b`)`.

`model` : | The GtkTreeModel the comparison is within
`a` : | A GtkTreeIter in `model`
`b` : | Another GtkTreeIter in `model`
`user_data` : | Data passed when the compare func is assigned e.g. by `gtk_tree_sortable_set_sort_func()`
Returns : | a negative integer, zero or a positive integer depending on whether `a` sorts before, with or after `b`

### gtk_tree_sortable_sort_column_changed ()

    void                gtk_tree_sortable_sort_column_changed
                                                            (GtkTreeSortable *sortable);

Emits a "sort-column-changed" signal on `sortable`.

`sortable` : | A GtkTreeSortable

### gtk_tree_sortable_get_sort_column_id ()

    gboolean            gtk_tree_sortable_get_sort_column_id
                                                            (GtkTreeSortable *sortable,
                                                             gint *sort_column_id,
                                                             GtkSortType *order);

Fills in `sort_column_id` and `order` with the current sort column and the order. It returns `TRUE` unless the `sort_column_id` is `GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID` or `GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID`.

`sortable` : | A GtkTreeSortable
`sort_column_id` : | The sort column id to be filled in
`order` : | The GtkSortType to be filled in
Returns : | `TRUE` if the sort column is not one of the special sort column ids.

### gtk_tree_sortable_set_sort_column_id ()

    void                gtk_tree_sortable_set_sort_column_id
                                                            (GtkTreeSortable *sortable,
                                                             gint sort_column_id,
                                                             GtkSortType order);

Sets the current sort column to be `sort_column_id`. The `sortable` will resort itself to reflect this change, after emitting a "sort-column-changed" signal. `sort_column_id` may either be a regular column id, or one of the following special values:

`GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID` | the default sort function will be used, if it is set
`GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID` | no sorting will occur

`sortable` : | A GtkTreeSortable
`sort_column_id` : | the sort column id to set
`order` : | The sort order of the column

### gtk_tree_sortable_set_sort_func ()

    void                gtk_tree_sortable_set_sort_func     (GtkTreeSortable *sortable,
                                                             gint sort_column_id,
                                                             GtkTreeIterCompareFunc sort_func,
                                                             gpointer user_data,
                                                             GDestroyNotify destroy);

Sets the comparison function used when sorting to be `sort_func`. If the current sort column id of `sortable` is the same as `sort_column_id`, then the model will sort using this function.

`sortable` : | A GtkTreeSortable
`sort_column_id` : | the sort column id to set the function for
`sort_func` : | The comparison function
`user_data` : | User data to pass to `sort_func`, or `NULL`. [allow-none]
`destroy` : | Destroy notifier of `user_data`, or `NULL`. [allow-none]

### gtk_tree_sortable_set_default_sort_func ()

    void                gtk_tree_sortable_set_default_sort_func
                                                            (GtkTreeSortable *sortable,
                                                             GtkTreeIterCompareFunc sort_func,
                                                             gpointer user_data,
                                                             GDestroyNotify destroy);

Sets the default comparison function used when sorting to be `sort_func`. If the current sort column id of `sortable` is `GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID`, then the model will sort using this function.

If `sort_func` is `NULL`, then there will be no default comparison function. This means that once the model has been sorted, it can't go back to the default state. In this case, when the current sort column id of `sortable` is `GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID`, the model will be unsorted.

`sortable` : | A GtkTreeSortable
`sort_func` : | The comparison function
`user_data` : | User data to pass to `sort_func`, or `NULL`. [allow-none]
`destroy` : | Destroy notifier of `user_data`, or `NULL`. [allow-none]

### gtk_tree_sortable_has_default_sort_func ()

    gboolean            gtk_tree_sortable_has_default_sort_func
                                                            (GtkTreeSortable *sortable);

Returns `TRUE` if the model has a default sort function. This is used primarily by GtkTreeViewColumns in order to determine if a model can go back to the default state, or not.

`sortable` : | A GtkTreeSortable
Returns : | `TRUE`, if the model has a default sort function

## Signal Details

### The `"sort-column-changed"` signal

    void                user_function                      (GtkTreeSortable *sortable,
                                                            gpointer         user_data)      : Run Last

The ::sort-column-changed signal is emitted when the sort column or sort order of `sortable` is changed. The signal is emitted before the contents of `sortable` are resorted.

`sortable` : | the object on which the signal is emitted
`user_data` : | user data set when the signal handler was connected.

## See Also

GtkTreeModel, GtkTreeView