handle default sort feature

Mon Sep  3 18:03:56 2001  Jonathan Blandford  <jrb@redhat.com>

	* gtk/gtktreestore.c (gtk_tree_store_set_default_sort_func):
	handle default sort feature

	* gtk/gtktreesortable.c (gtk_tree_sortable_set_default_sort_func):
	new function to handle default sort.
	(gtk_tree_sortable_has_default_sort_func): check if default sort
	is set.

	* gtk/gtkliststore.c (gtk_list_store_set_default_sort_func):
	handle default sort feature
This commit is contained in:
Jonathan Blandford 2001-09-03 23:37:39 +00:00 committed by Jonathan Blandford
parent 8249e6275a
commit 43405a3d77
13 changed files with 400 additions and 145 deletions

View File

@ -1,3 +1,16 @@
Mon Sep 3 18:03:56 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreestore.c (gtk_tree_store_set_default_sort_func):
handle default sort feature
* gtk/gtktreesortable.c (gtk_tree_sortable_set_default_sort_func):
new function to handle default sort.
(gtk_tree_sortable_has_default_sort_func): check if default sort
is set.
* gtk/gtkliststore.c (gtk_list_store_set_default_sort_func):
handle default sort feature
Sun Sep 2 20:32:36 2001 Jonathan Blandford <jrb@redhat.com> Sun Sep 2 20:32:36 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeview.c (gtk_tree_view_scroll_to_cell): patch from * gtk/gtktreeview.c (gtk_tree_view_scroll_to_cell): patch from

View File

@ -1,3 +1,16 @@
Mon Sep 3 18:03:56 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreestore.c (gtk_tree_store_set_default_sort_func):
handle default sort feature
* gtk/gtktreesortable.c (gtk_tree_sortable_set_default_sort_func):
new function to handle default sort.
(gtk_tree_sortable_has_default_sort_func): check if default sort
is set.
* gtk/gtkliststore.c (gtk_list_store_set_default_sort_func):
handle default sort feature
Sun Sep 2 20:32:36 2001 Jonathan Blandford <jrb@redhat.com> Sun Sep 2 20:32:36 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeview.c (gtk_tree_view_scroll_to_cell): patch from * gtk/gtktreeview.c (gtk_tree_view_scroll_to_cell): patch from

View File

@ -1,3 +1,16 @@
Mon Sep 3 18:03:56 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreestore.c (gtk_tree_store_set_default_sort_func):
handle default sort feature
* gtk/gtktreesortable.c (gtk_tree_sortable_set_default_sort_func):
new function to handle default sort.
(gtk_tree_sortable_has_default_sort_func): check if default sort
is set.
* gtk/gtkliststore.c (gtk_list_store_set_default_sort_func):
handle default sort feature
Sun Sep 2 20:32:36 2001 Jonathan Blandford <jrb@redhat.com> Sun Sep 2 20:32:36 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeview.c (gtk_tree_view_scroll_to_cell): patch from * gtk/gtktreeview.c (gtk_tree_view_scroll_to_cell): patch from

View File

@ -1,3 +1,16 @@
Mon Sep 3 18:03:56 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreestore.c (gtk_tree_store_set_default_sort_func):
handle default sort feature
* gtk/gtktreesortable.c (gtk_tree_sortable_set_default_sort_func):
new function to handle default sort.
(gtk_tree_sortable_has_default_sort_func): check if default sort
is set.
* gtk/gtkliststore.c (gtk_list_store_set_default_sort_func):
handle default sort feature
Sun Sep 2 20:32:36 2001 Jonathan Blandford <jrb@redhat.com> Sun Sep 2 20:32:36 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeview.c (gtk_tree_view_scroll_to_cell): patch from * gtk/gtktreeview.c (gtk_tree_view_scroll_to_cell): patch from

View File

@ -1,3 +1,16 @@
Mon Sep 3 18:03:56 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreestore.c (gtk_tree_store_set_default_sort_func):
handle default sort feature
* gtk/gtktreesortable.c (gtk_tree_sortable_set_default_sort_func):
new function to handle default sort.
(gtk_tree_sortable_has_default_sort_func): check if default sort
is set.
* gtk/gtkliststore.c (gtk_list_store_set_default_sort_func):
handle default sort feature
Sun Sep 2 20:32:36 2001 Jonathan Blandford <jrb@redhat.com> Sun Sep 2 20:32:36 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeview.c (gtk_tree_view_scroll_to_cell): patch from * gtk/gtktreeview.c (gtk_tree_view_scroll_to_cell): patch from

View File

@ -1,3 +1,16 @@
Mon Sep 3 18:03:56 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreestore.c (gtk_tree_store_set_default_sort_func):
handle default sort feature
* gtk/gtktreesortable.c (gtk_tree_sortable_set_default_sort_func):
new function to handle default sort.
(gtk_tree_sortable_has_default_sort_func): check if default sort
is set.
* gtk/gtkliststore.c (gtk_list_store_set_default_sort_func):
handle default sort feature
Sun Sep 2 20:32:36 2001 Jonathan Blandford <jrb@redhat.com> Sun Sep 2 20:32:36 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeview.c (gtk_tree_view_scroll_to_cell): patch from * gtk/gtktreeview.c (gtk_tree_view_scroll_to_cell): patch from

View File

@ -1,3 +1,16 @@
Mon Sep 3 18:03:56 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreestore.c (gtk_tree_store_set_default_sort_func):
handle default sort feature
* gtk/gtktreesortable.c (gtk_tree_sortable_set_default_sort_func):
new function to handle default sort.
(gtk_tree_sortable_has_default_sort_func): check if default sort
is set.
* gtk/gtkliststore.c (gtk_list_store_set_default_sort_func):
handle default sort feature
Sun Sep 2 20:32:36 2001 Jonathan Blandford <jrb@redhat.com> Sun Sep 2 20:32:36 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeview.c (gtk_tree_view_scroll_to_cell): patch from * gtk/gtktreeview.c (gtk_tree_view_scroll_to_cell): patch from

View File

@ -89,21 +89,27 @@ static gboolean gtk_list_store_row_drop_possible (GtkTreeDragDest *drag_dest,
/* sortable */ /* sortable */
static void gtk_list_store_sort (GtkListStore *list_store); static void gtk_list_store_sort (GtkListStore *list_store);
static void gtk_list_store_sort_iter_changed (GtkListStore *list_store, static void gtk_list_store_sort_iter_changed (GtkListStore *list_store,
GtkTreeIter *iter, GtkTreeIter *iter,
gint column); gint column);
static gboolean gtk_list_store_get_sort_column_id (GtkTreeSortable *sortable, static gboolean gtk_list_store_get_sort_column_id (GtkTreeSortable *sortable,
gint *sort_column_id, gint *sort_column_id,
GtkSortType *order); GtkSortType *order);
static void gtk_list_store_set_sort_column_id (GtkTreeSortable *sortable, static void gtk_list_store_set_sort_column_id (GtkTreeSortable *sortable,
gint sort_column_id, gint sort_column_id,
GtkSortType order); GtkSortType order);
static void gtk_list_store_set_sort_func (GtkTreeSortable *sortable, static void gtk_list_store_set_sort_func (GtkTreeSortable *sortable,
gint sort_column_id, gint sort_column_id,
GtkTreeIterCompareFunc func, GtkTreeIterCompareFunc func,
gpointer data, gpointer data,
GtkDestroyNotify destroy); GtkDestroyNotify destroy);
static void gtk_list_store_set_default_sort_func (GtkTreeSortable *sortable,
GtkTreeIterCompareFunc func,
gpointer data,
GtkDestroyNotify destroy);
static gboolean gtk_list_store_has_default_sort_func (GtkTreeSortable *sortable);
static void static void
@ -228,6 +234,8 @@ gtk_list_store_sortable_init (GtkTreeSortableIface *iface)
iface->get_sort_column_id = gtk_list_store_get_sort_column_id; iface->get_sort_column_id = gtk_list_store_get_sort_column_id;
iface->set_sort_column_id = gtk_list_store_set_sort_column_id; iface->set_sort_column_id = gtk_list_store_set_sort_column_id;
iface->set_sort_func = gtk_list_store_set_sort_func; iface->set_sort_func = gtk_list_store_set_sort_func;
iface->set_default_sort_func = gtk_list_store_set_default_sort_func;
iface->has_default_sort_func = gtk_list_store_has_default_sort_func;
} }
static void static void
@ -1366,18 +1374,33 @@ gtk_list_store_compare_func (gconstpointer a,
gpointer user_data) gpointer user_data)
{ {
GtkListStore *list_store = user_data; GtkListStore *list_store = user_data;
GtkTreeDataSortHeader *header = NULL;
GSList *el_a; /* Los Angeles? */ GSList *el_a; /* Los Angeles? */
GSList *el_b; GSList *el_b;
GtkTreeIter iter_a; GtkTreeIter iter_a;
GtkTreeIter iter_b; GtkTreeIter iter_b;
gint retval; gint retval;
GtkTreeIterCompareFunc func;
gpointer data;
header = _gtk_tree_data_list_get_header (list_store->sort_list,
list_store->sort_column_id);
g_return_val_if_fail (header != NULL, 0); if (list_store->sort_column_id != -1)
g_return_val_if_fail (header->func != NULL, 0); {
GtkTreeDataSortHeader *header;
header = _gtk_tree_data_list_get_header (list_store->sort_list,
list_store->sort_column_id);
g_return_val_if_fail (header != NULL, 0);
g_return_val_if_fail (header->func != NULL, 0);
func = header->func;
data = header->data;
}
else
{
g_return_val_if_fail (list_store->default_sort_func != NULL, 0);
func = list_store->default_sort_func;
data = list_store->default_sort_data;
}
el_a = ((SortTuple *) a)->el; el_a = ((SortTuple *) a)->el;
el_b = ((SortTuple *) b)->el; el_b = ((SortTuple *) b)->el;
@ -1387,9 +1410,7 @@ gtk_list_store_compare_func (gconstpointer a,
iter_b.stamp = list_store->stamp; iter_b.stamp = list_store->stamp;
iter_b.user_data = el_b; iter_b.user_data = el_b;
retval = (* header->func) (GTK_TREE_MODEL (list_store), retval = (* func) (GTK_TREE_MODEL (list_store), &iter_a, &iter_b, data);
&iter_a, &iter_b,
header->data);
if (list_store->order == GTK_SORT_DESCENDING) if (list_store->order == GTK_SORT_DESCENDING)
{ {
@ -1404,7 +1425,6 @@ gtk_list_store_compare_func (gconstpointer a,
static void static void
gtk_list_store_sort (GtkListStore *list_store) gtk_list_store_sort (GtkListStore *list_store)
{ {
GtkTreeDataSortHeader *header = NULL;
GtkTreeIter iter; GtkTreeIter iter;
GArray *sort_array; GArray *sort_array;
gint i; gint i;
@ -1417,12 +1437,6 @@ gtk_list_store_sort (GtkListStore *list_store)
g_assert (GTK_LIST_STORE_IS_SORTED (list_store)); g_assert (GTK_LIST_STORE_IS_SORTED (list_store));
header = _gtk_tree_data_list_get_header (list_store->sort_list, list_store->sort_column_id);
/* We want to make sure that we have a function */
g_return_if_fail (header != NULL);
g_return_if_fail (header->func != NULL);
list = G_SLIST (list_store->root); list = G_SLIST (list_store->root);
sort_array = g_array_sized_new (FALSE, FALSE, sort_array = g_array_sized_new (FALSE, FALSE,
@ -1471,7 +1485,6 @@ gtk_list_store_sort_iter_changed (GtkListStore *list_store,
gint column) gint column)
{ {
GtkTreeDataSortHeader *header;
GSList *prev = NULL; GSList *prev = NULL;
GSList *next = NULL; GSList *next = NULL;
GSList *list = G_SLIST (list_store->root); GSList *list = G_SLIST (list_store->root);
@ -1483,18 +1496,33 @@ gtk_list_store_sort_iter_changed (GtkListStore *list_store,
gint old_location; gint old_location;
gint new_location; gint new_location;
gint *new_order; gint *new_order;
GtkTreeIterCompareFunc func;
gpointer data;
if (list_store->length < 2) if (list_store->length < 2)
return; return;
tmp_iter.stamp = list_store->stamp; tmp_iter.stamp = list_store->stamp;
header = _gtk_tree_data_list_get_header (list_store->sort_list,
list_store->sort_column_id); if (list_store->sort_column_id != -1)
g_return_if_fail (header != NULL); {
g_return_if_fail (header->func != NULL); GtkTreeDataSortHeader *header;
header = _gtk_tree_data_list_get_header (list_store->sort_list,
list_store->sort_column_id);
g_return_if_fail (header != NULL);
g_return_if_fail (header->func != NULL);
func = header->func;
data = header->data;
}
else
{
g_return_if_fail (list_store->default_sort_func != NULL);
func = list_store->default_sort_func;
data = list_store->default_sort_data;
}
/* If it's the built in function, we don't sort. */ /* If it's the built in function, we don't sort. */
if (header->func == gtk_tree_data_list_compare_func && if (func == gtk_tree_data_list_compare_func &&
list_store->sort_column_id != column) list_store->sort_column_id != column)
return; return;
@ -1516,17 +1544,13 @@ gtk_list_store_sort_iter_changed (GtkListStore *list_store,
if (prev != NULL) if (prev != NULL)
{ {
tmp_iter.user_data = prev; tmp_iter.user_data = prev;
cmp_a = (* header->func) (GTK_TREE_MODEL (list_store), cmp_a = (* func) (GTK_TREE_MODEL (list_store), &tmp_iter, iter, data);
&tmp_iter, iter,
header->data);
} }
if (next != NULL) if (next != NULL)
{ {
tmp_iter.user_data = next; tmp_iter.user_data = next;
cmp_b = (* header->func) (GTK_TREE_MODEL (list_store), cmp_b = (* func) (GTK_TREE_MODEL (list_store), iter, &tmp_iter, data);
iter, &tmp_iter,
header->data);
} }
@ -1568,11 +1592,9 @@ gtk_list_store_sort_iter_changed (GtkListStore *list_store,
new_location = 0; new_location = 0;
tmp_iter.user_data = list; tmp_iter.user_data = list;
if (list_store->order == GTK_SORT_DESCENDING) if (list_store->order == GTK_SORT_DESCENDING)
cmp_a = (* header->func) (GTK_TREE_MODEL (list_store), cmp_a = (* func) (GTK_TREE_MODEL (list_store), &tmp_iter, iter, data);
&tmp_iter, iter, header->data);
else else
cmp_a = (* header->func) (GTK_TREE_MODEL (list_store), cmp_a = (* func) (GTK_TREE_MODEL (list_store), iter, &tmp_iter, data);
iter, &tmp_iter, header->data);
while ((list->next) && (cmp_a > 0)) while ((list->next) && (cmp_a > 0))
{ {
@ -1581,11 +1603,9 @@ gtk_list_store_sort_iter_changed (GtkListStore *list_store,
new_location++; new_location++;
tmp_iter.user_data = list; tmp_iter.user_data = list;
if (list_store->order == GTK_SORT_DESCENDING) if (list_store->order == GTK_SORT_DESCENDING)
cmp_a = (* header->func) (GTK_TREE_MODEL (list_store), cmp_a = (* func) (GTK_TREE_MODEL (list_store), &tmp_iter, iter, data);
&tmp_iter, iter, header->data);
else else
cmp_a = (* header->func) (GTK_TREE_MODEL (list_store), cmp_a = (* func) (GTK_TREE_MODEL (list_store), iter, &tmp_iter, data);
iter, &tmp_iter, header->data);
} }
if ((!list->next) && (cmp_a > 0)) if ((!list->next) && (cmp_a > 0))
@ -1667,27 +1687,33 @@ gtk_list_store_set_sort_column_id (GtkTreeSortable *sortable,
GtkSortType order) GtkSortType order)
{ {
GtkListStore *list_store = (GtkListStore *) sortable; GtkListStore *list_store = (GtkListStore *) sortable;
GList *list;
g_return_if_fail (GTK_IS_LIST_STORE (sortable)); g_return_if_fail (GTK_IS_LIST_STORE (sortable));
for (list = list_store->sort_list; list; list = list->next)
{
GtkTreeDataSortHeader *header = (GtkTreeDataSortHeader*) list->data;
if (header->sort_column_id == sort_column_id)
break;
}
g_return_if_fail (list != NULL);
if ((list_store->sort_column_id == sort_column_id) && if ((list_store->sort_column_id == sort_column_id) &&
(list_store->order == order)) (list_store->order == order))
return; return;
if (sort_column_id != -1)
{
GtkTreeDataSortHeader *header = NULL;
header = _gtk_tree_data_list_get_header (list_store->sort_list, sort_column_id);
/* We want to make sure that we have a function */
g_return_if_fail (header != NULL);
g_return_if_fail (header->func != NULL);
}
else
{
g_return_if_fail (list_store->default_sort_func != NULL);
}
list_store->sort_column_id = sort_column_id; list_store->sort_column_id = sort_column_id;
list_store->order = order; list_store->order = order;
if (list_store->sort_column_id >= 0) gtk_list_store_sort (list_store);
gtk_list_store_sort (list_store);
gtk_tree_sortable_sort_column_changed (sortable); gtk_tree_sortable_sort_column_changed (sortable);
} }
@ -1727,3 +1753,32 @@ gtk_list_store_set_sort_func (GtkTreeSortable *sortable,
header->data = data; header->data = data;
header->destroy = destroy; header->destroy = destroy;
} }
static void
gtk_list_store_set_default_sort_func (GtkTreeSortable *sortable,
GtkTreeIterCompareFunc func,
gpointer data,
GtkDestroyNotify destroy)
{
GtkListStore *list_store = (GtkListStore *) sortable;
g_return_if_fail (GTK_IS_LIST_STORE (sortable));
if (list_store->default_sort_destroy)
(* list_store->default_sort_destroy) (list_store->default_sort_data);
list_store->default_sort_func = func;
list_store->default_sort_data = data;
list_store->default_sort_destroy = destroy;
}
static gboolean
gtk_list_store_has_default_sort_func (GtkTreeSortable *sortable)
{
GtkListStore *list_store = (GtkListStore *) sortable;
g_return_val_if_fail (GTK_IS_LIST_STORE (sortable), FALSE);
return (list_store->default_sort_func != NULL);
}

View File

@ -51,6 +51,9 @@ struct _GtkListStore
GtkSortType order; GtkSortType order;
GType *column_headers; GType *column_headers;
gint length; gint length;
GtkTreeIterCompareFunc default_sort_func;
gpointer default_sort_data;
GtkDestroyNotify default_sort_destroy;
}; };
struct _GtkListStoreClass struct _GtkListStoreClass

View File

@ -130,4 +130,35 @@ gtk_tree_sortable_set_sort_func (GtkTreeSortable *sortable,
(* iface->set_sort_func) (sortable, sort_column_id, func, data, destroy); (* iface->set_sort_func) (sortable, sort_column_id, func, data, destroy);
} }
void
gtk_tree_sortable_set_default_sort_func (GtkTreeSortable *sortable,
GtkTreeIterCompareFunc func,
gpointer data,
GtkDestroyNotify destroy)
{
GtkTreeSortableIface *iface;
g_return_if_fail (GTK_IS_TREE_SORTABLE (sortable));
iface = GTK_TREE_SORTABLE_GET_IFACE (sortable);
g_return_if_fail (iface != NULL);
g_return_if_fail (iface->set_default_sort_func != NULL);
(* iface->set_default_sort_func) (sortable, func, data, destroy);
}
gboolean
gtk_tree_sortable_has_default_sort_func (GtkTreeSortable *sortable)
{
GtkTreeSortableIface *iface;
g_return_if_fail (GTK_IS_TREE_SORTABLE (sortable));
iface = GTK_TREE_SORTABLE_GET_IFACE (sortable);
g_return_if_fail (iface != NULL);
g_return_if_fail (iface->has_default_sort_func != NULL);
(* iface->has_default_sort_func) (sortable);
}

View File

@ -22,9 +22,7 @@
#include <gtk/gtktreemodel.h> #include <gtk/gtktreemodel.h>
#ifdef __cplusplus G_BEGIN_DECLS
extern "C" {
#endif /* __cplusplus */
#define GTK_TYPE_TREE_SORTABLE (gtk_tree_sortable_get_type ()) #define GTK_TYPE_TREE_SORTABLE (gtk_tree_sortable_get_type ())
#define GTK_TREE_SORTABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_TREE_SORTABLE, GtkTreeSortable)) #define GTK_TREE_SORTABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_TREE_SORTABLE, GtkTreeSortable))
@ -32,6 +30,9 @@ extern "C" {
#define GTK_IS_TREE_SORTABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_TREE_SORTABLE)) #define GTK_IS_TREE_SORTABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_TREE_SORTABLE))
#define GTK_TREE_SORTABLE_GET_IFACE(obj) ((GtkTreeSortableIface *)g_type_interface_peek (((GTypeInstance *)GTK_TREE_SORTABLE (obj))->g_class, GTK_TYPE_TREE_SORTABLE)) #define GTK_TREE_SORTABLE_GET_IFACE(obj) ((GtkTreeSortableIface *)g_type_interface_peek (((GTypeInstance *)GTK_TREE_SORTABLE (obj))->g_class, GTK_TYPE_TREE_SORTABLE))
enum {
GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID = -1,
};
typedef struct _GtkTreeSortable GtkTreeSortable; /* Dummy typedef */ typedef struct _GtkTreeSortable GtkTreeSortable; /* Dummy typedef */
typedef struct _GtkTreeSortableIface GtkTreeSortableIface; typedef struct _GtkTreeSortableIface GtkTreeSortableIface;
@ -47,43 +48,49 @@ struct _GtkTreeSortableIface
GTypeInterface g_iface; GTypeInterface g_iface;
/* signals */ /* signals */
void (* sort_column_changed) (GtkTreeSortable *sortable); void (* sort_column_changed) (GtkTreeSortable *sortable);
/* virtual table */ /* virtual table */
gboolean (* get_sort_column_id) (GtkTreeSortable *sortable, gboolean (* get_sort_column_id) (GtkTreeSortable *sortable,
gint *sort_column_id, gint *sort_column_id,
GtkSortType *order); GtkSortType *order);
void (* set_sort_column_id) (GtkTreeSortable *sortable, void (* set_sort_column_id) (GtkTreeSortable *sortable,
gint sort_column_id, gint sort_column_id,
GtkSortType order); GtkSortType order);
void (* set_sort_func) (GtkTreeSortable *sortable, void (* set_sort_func) (GtkTreeSortable *sortable,
gint sort_column_id, gint sort_column_id,
GtkTreeIterCompareFunc func, GtkTreeIterCompareFunc func,
gpointer data, gpointer data,
GtkDestroyNotify destroy); GtkDestroyNotify destroy);
void (* set_default_sort_func) (GtkTreeSortable *sortable,
GtkTreeIterCompareFunc func,
gpointer data,
GtkDestroyNotify destroy);
gboolean (* has_default_sort_func) (GtkTreeSortable *sortable);
}; };
GType gtk_tree_sortable_get_type (void) G_GNUC_CONST; GType gtk_tree_sortable_get_type (void) G_GNUC_CONST;
void gtk_tree_sortable_sort_column_changed (GtkTreeSortable *sortable); void gtk_tree_sortable_sort_column_changed (GtkTreeSortable *sortable);
gboolean gtk_tree_sortable_get_sort_column_id (GtkTreeSortable *sortable, gboolean gtk_tree_sortable_get_sort_column_id (GtkTreeSortable *sortable,
gint *sort_column_id, gint *sort_column_id,
GtkSortType *order); GtkSortType *order);
void gtk_tree_sortable_set_sort_column_id (GtkTreeSortable *sortable, void gtk_tree_sortable_set_sort_column_id (GtkTreeSortable *sortable,
gint sort_column_id, gint sort_column_id,
GtkSortType order); GtkSortType order);
void gtk_tree_sortable_set_sort_func (GtkTreeSortable *sortable, void gtk_tree_sortable_set_sort_func (GtkTreeSortable *sortable,
gint sort_column_id, gint sort_column_id,
GtkTreeIterCompareFunc func, GtkTreeIterCompareFunc func,
gpointer data, gpointer data,
GtkDestroyNotify destroy); GtkDestroyNotify destroy);
void gtk_tree_sortable_set_default_sort_func (GtkTreeSortable *sortable,
GtkTreeIterCompareFunc func,
gpointer data,
GtkDestroyNotify destroy);
gboolean gtk_tree_sortable_has_default_sort_func (GtkTreeSortable *sortable);
G_END_DECLS
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __GTK_TREE_SORTABLE_H__ */ #endif /* __GTK_TREE_SORTABLE_H__ */

View File

@ -98,12 +98,16 @@ static gboolean gtk_tree_store_get_sort_column_id (GtkTreeSortable *
static void gtk_tree_store_set_sort_column_id (GtkTreeSortable *sortable, static void gtk_tree_store_set_sort_column_id (GtkTreeSortable *sortable,
gint sort_column_id, gint sort_column_id,
GtkSortType order); GtkSortType order);
static void gtk_tree_store_set_sort_func (GtkTreeSortable *sortable, static void gtk_tree_store_set_sort_func (GtkTreeSortable *sortable,
gint sort_column_id, gint sort_column_id,
GtkTreeIterCompareFunc func, GtkTreeIterCompareFunc func,
gpointer data, gpointer data,
GtkDestroyNotify destroy); GtkDestroyNotify destroy);
static void gtk_tree_store_set_default_sort_func (GtkTreeSortable *sortable,
GtkTreeIterCompareFunc func,
gpointer data,
GtkDestroyNotify destroy);
static gboolean gtk_tree_store_has_default_sort_func (GtkTreeSortable *sortable);
static void validate_gnode (GNode *node); static void validate_gnode (GNode *node);
@ -232,6 +236,8 @@ gtk_tree_store_sortable_init (GtkTreeSortableIface *iface)
iface->get_sort_column_id = gtk_tree_store_get_sort_column_id; iface->get_sort_column_id = gtk_tree_store_get_sort_column_id;
iface->set_sort_column_id = gtk_tree_store_set_sort_column_id; iface->set_sort_column_id = gtk_tree_store_set_sort_column_id;
iface->set_sort_func = gtk_tree_store_set_sort_func; iface->set_sort_func = gtk_tree_store_set_sort_func;
iface->set_default_sort_func = gtk_tree_store_set_default_sort_func;
iface->has_default_sort_func = gtk_tree_store_has_default_sort_func;
} }
static void static void
@ -1465,18 +1471,33 @@ gtk_tree_store_compare_func (gconstpointer a,
gpointer user_data) gpointer user_data)
{ {
GtkTreeStore *tree_store = user_data; GtkTreeStore *tree_store = user_data;
GtkTreeDataSortHeader *header = NULL;
GNode *node_a; GNode *node_a;
GNode *node_b; GNode *node_b;
GtkTreeIterCompareFunc func;
gpointer data;
GtkTreeIter iter_a; GtkTreeIter iter_a;
GtkTreeIter iter_b; GtkTreeIter iter_b;
gint retval; gint retval;
header = _gtk_tree_data_list_get_header (tree_store->sort_list, if (tree_store->sort_column_id != -1)
tree_store->sort_column_id); {
GtkTreeDataSortHeader *header;
g_return_val_if_fail (header != NULL, 0); header = _gtk_tree_data_list_get_header (tree_store->sort_list,
g_return_val_if_fail (header->func != NULL, 0); tree_store->sort_column_id);
g_return_val_if_fail (header != NULL, 0);
g_return_val_if_fail (header->func != NULL, 0);
func = header->func;
data = header->data;
}
else
{
g_return_val_if_fail (tree_store->default_sort_func != NULL, 0);
func = tree_store->default_sort_func;
data = tree_store->default_sort_data;
}
node_a = ((SortTuple *) a)->node; node_a = ((SortTuple *) a)->node;
node_b = ((SortTuple *) b)->node; node_b = ((SortTuple *) b)->node;
@ -1486,9 +1507,7 @@ gtk_tree_store_compare_func (gconstpointer a,
iter_b.stamp = tree_store->stamp; iter_b.stamp = tree_store->stamp;
iter_b.user_data = node_b; iter_b.user_data = node_b;
retval = (* header->func) (GTK_TREE_MODEL (user_data), retval = (* func) (GTK_TREE_MODEL (user_data), &iter_a, &iter_b, data);
&iter_a, &iter_b,
header->data);
if (tree_store->order == GTK_SORT_DESCENDING) if (tree_store->order == GTK_SORT_DESCENDING)
{ {
@ -1505,7 +1524,6 @@ gtk_tree_store_sort_helper (GtkTreeStore *tree_store,
GNode *parent, GNode *parent,
gboolean recurse) gboolean recurse)
{ {
GtkTreeDataSortHeader *header = NULL;
GtkTreeIter iter; GtkTreeIter iter;
GArray *sort_array; GArray *sort_array;
GNode *node; GNode *node;
@ -1521,12 +1539,6 @@ gtk_tree_store_sort_helper (GtkTreeStore *tree_store,
g_assert (GTK_TREE_STORE_IS_SORTED (tree_store)); g_assert (GTK_TREE_STORE_IS_SORTED (tree_store));
header = _gtk_tree_data_list_get_header (tree_store->sort_list, tree_store->sort_column_id);
/* We want to make sure that we have a function */
g_return_if_fail (header != NULL);
g_return_if_fail (header->func != NULL);
list_length = 0; list_length = 0;
for (tmp_node = node; tmp_node; tmp_node = tmp_node->next) for (tmp_node = node; tmp_node; tmp_node = tmp_node->next)
list_length++; list_length++;
@ -1584,6 +1596,21 @@ gtk_tree_store_sort_helper (GtkTreeStore *tree_store,
static void static void
gtk_tree_store_sort (GtkTreeStore *tree_store) gtk_tree_store_sort (GtkTreeStore *tree_store)
{ {
if (tree_store->sort_column_id != -1)
{
GtkTreeDataSortHeader *header = NULL;
header = _gtk_tree_data_list_get_header (tree_store->sort_list, tree_store->sort_column_id);
/* We want to make sure that we have a function */
g_return_if_fail (header != NULL);
g_return_if_fail (header->func != NULL);
}
else
{
g_return_if_fail (tree_store->default_sort_func != NULL);
}
gtk_tree_store_sort_helper (tree_store, G_NODE (tree_store->root), TRUE); gtk_tree_store_sort_helper (tree_store, G_NODE (tree_store->root), TRUE);
} }
@ -1592,7 +1619,6 @@ gtk_tree_store_sort_iter_changed (GtkTreeStore *tree_store,
GtkTreeIter *iter, GtkTreeIter *iter,
gint column) gint column)
{ {
GtkTreeDataSortHeader *header;
GNode *prev = NULL; GNode *prev = NULL;
GNode *next = NULL; GNode *next = NULL;
GNode *node; GNode *node;
@ -1605,18 +1631,31 @@ gtk_tree_store_sort_iter_changed (GtkTreeStore *tree_store,
gint new_location; gint new_location;
gint *new_order; gint *new_order;
gint length; gint length;
GtkTreeIterCompareFunc func;
gpointer data;
g_return_if_fail (G_NODE (iter->user_data)->parent != NULL); g_return_if_fail (G_NODE (iter->user_data)->parent != NULL);
tmp_iter.stamp = tree_store->stamp; tmp_iter.stamp = tree_store->stamp;
header = _gtk_tree_data_list_get_header (tree_store->sort_list, if (tree_store->sort_column_id != -1)
tree_store->sort_column_id); {
g_return_if_fail (header != NULL); GtkTreeDataSortHeader *header;
g_return_if_fail (header->func != NULL); header = _gtk_tree_data_list_get_header (tree_store->sort_list,
tree_store->sort_column_id);
g_return_if_fail (header != NULL);
g_return_if_fail (header->func != NULL);
func = header->func;
data = header->data;
}
else
{
g_return_if_fail (tree_store->default_sort_func != NULL);
func = tree_store->default_sort_func;
data = tree_store->default_sort_data;
}
/* If it's the built in function, we don't sort. */ /* If it's the built in function, we don't sort. */
if (header->func == gtk_tree_data_list_compare_func && if (func == gtk_tree_data_list_compare_func &&
tree_store->sort_column_id != column) tree_store->sort_column_id != column)
return; return;
@ -1639,17 +1678,13 @@ gtk_tree_store_sort_iter_changed (GtkTreeStore *tree_store,
if (prev != NULL) if (prev != NULL)
{ {
tmp_iter.user_data = prev; tmp_iter.user_data = prev;
cmp_a = (* header->func) (GTK_TREE_MODEL (tree_store), cmp_a = (* func) (GTK_TREE_MODEL (tree_store), &tmp_iter, iter, data);
&tmp_iter, iter,
header->data);
} }
if (next != NULL) if (next != NULL)
{ {
tmp_iter.user_data = next; tmp_iter.user_data = next;
cmp_b = (* header->func) (GTK_TREE_MODEL (tree_store), cmp_b = (* func) (GTK_TREE_MODEL (tree_store), iter, &tmp_iter, data);
iter, &tmp_iter,
header->data);
} }
@ -1693,11 +1728,9 @@ gtk_tree_store_sort_iter_changed (GtkTreeStore *tree_store,
new_location = 0; new_location = 0;
tmp_iter.user_data = node; tmp_iter.user_data = node;
if (tree_store->order == GTK_SORT_DESCENDING) if (tree_store->order == GTK_SORT_DESCENDING)
cmp_a = (* header->func) (GTK_TREE_MODEL (tree_store), cmp_a = (* func) (GTK_TREE_MODEL (tree_store), &tmp_iter, iter, data);
&tmp_iter, iter, header->data);
else else
cmp_a = (* header->func) (GTK_TREE_MODEL (tree_store), cmp_a = (* func) (GTK_TREE_MODEL (tree_store), iter, &tmp_iter, data);
iter, &tmp_iter, header->data);
while ((node->next) && (cmp_a > 0)) while ((node->next) && (cmp_a > 0))
{ {
@ -1706,11 +1739,9 @@ gtk_tree_store_sort_iter_changed (GtkTreeStore *tree_store,
new_location++; new_location++;
tmp_iter.user_data = node; tmp_iter.user_data = node;
if (tree_store->order == GTK_SORT_DESCENDING) if (tree_store->order == GTK_SORT_DESCENDING)
cmp_a = (* header->func) (GTK_TREE_MODEL (tree_store), cmp_a = (* func) (GTK_TREE_MODEL (tree_store), &tmp_iter, iter, data);
&tmp_iter, iter, header->data);
else else
cmp_a = (* header->func) (GTK_TREE_MODEL (tree_store), cmp_a = (* func) (GTK_TREE_MODEL (tree_store), iter, &tmp_iter, data);
iter, &tmp_iter, header->data);
} }
if ((!node->next) && (cmp_a > 0)) if ((!node->next) && (cmp_a > 0))
@ -1797,27 +1828,33 @@ gtk_tree_store_set_sort_column_id (GtkTreeSortable *sortable,
GtkSortType order) GtkSortType order)
{ {
GtkTreeStore *tree_store = (GtkTreeStore *) sortable; GtkTreeStore *tree_store = (GtkTreeStore *) sortable;
GList *list;
g_return_if_fail (GTK_IS_TREE_STORE (sortable)); g_return_if_fail (GTK_IS_TREE_STORE (sortable));
for (list = tree_store->sort_list; list; list = list->next)
{
GtkTreeDataSortHeader *header = (GtkTreeDataSortHeader*) list->data;
if (header->sort_column_id == sort_column_id)
break;
}
g_return_if_fail (list != NULL);
if ((tree_store->sort_column_id == sort_column_id) && if ((tree_store->sort_column_id == sort_column_id) &&
(tree_store->order == order)) (tree_store->order == order))
return; return;
if (sort_column_id != -1)
{
GtkTreeDataSortHeader *header = NULL;
header = _gtk_tree_data_list_get_header (tree_store->sort_list, sort_column_id);
/* We want to make sure that we have a function */
g_return_if_fail (header != NULL);
g_return_if_fail (header->func != NULL);
}
else
{
g_return_if_fail (tree_store->default_sort_func != NULL);
}
tree_store->sort_column_id = sort_column_id; tree_store->sort_column_id = sort_column_id;
tree_store->order = order; tree_store->order = order;
if (tree_store->sort_column_id >= 0) gtk_tree_store_sort (tree_store);
gtk_tree_store_sort (tree_store);
gtk_tree_sortable_sort_column_changed (sortable); gtk_tree_sortable_sort_column_changed (sortable);
} }
@ -1859,6 +1896,34 @@ gtk_tree_store_set_sort_func (GtkTreeSortable *sortable,
} }
static void
gtk_tree_store_set_default_sort_func (GtkTreeSortable *sortable,
GtkTreeIterCompareFunc func,
gpointer data,
GtkDestroyNotify destroy)
{
GtkTreeStore *tree_store = (GtkTreeStore *) sortable;
g_return_if_fail (GTK_IS_TREE_STORE (sortable));
if (tree_store->default_sort_destroy)
(* tree_store->default_sort_destroy) (tree_store->default_sort_data);
tree_store->default_sort_func = func;
tree_store->default_sort_data = data;
tree_store->default_sort_destroy = destroy;
}
static gboolean
gtk_tree_store_has_default_sort_func (GtkTreeSortable *sortable)
{
GtkTreeStore *tree_store = (GtkTreeStore *) sortable;
g_return_val_if_fail (GTK_IS_TREE_STORE (sortable), FALSE);
return (tree_store->default_sort_func != NULL);
}
static void static void
validate_gnode (GNode* node) validate_gnode (GNode* node)
{ {

View File

@ -50,6 +50,9 @@ struct _GtkTreeStore
GList *sort_list; GList *sort_list;
GtkSortType order; GtkSortType order;
GType *column_headers; GType *column_headers;
GtkTreeIterCompareFunc default_sort_func;
gpointer default_sort_data;
GtkDestroyNotify default_sort_destroy;
}; };
struct _GtkTreeStoreClass struct _GtkTreeStoreClass