* we warned you and we're not liable for any head injuries.
*/
-#include <config.h>
+#include "config.h"
#include <string.h>
#include "gtktreemodelsort.h"
#include "gtkintl.h"
#include "gtkprivate.h"
#include "gtktreednd.h"
-#include "gtkalias.h"
+
typedef struct _SortElt SortElt;
typedef struct _SortLevel SortLevel;
{
GArray *array;
gint ref_count;
- SortElt *parent_elt;
+ gint parent_elt_index;
SortLevel *parent_level;
};
};
+struct _GtkTreeModelSortPrivate
+{
+ gpointer root;
+ gint stamp;
+ guint child_flags;
+ GtkTreeModel *child_model;
+ gint zero_ref_count;
+
+ /* sort information */
+ GList *sort_list;
+ gint sort_column_id;
+ GtkSortType order;
+
+ /* default sort */
+ GtkTreeIterCompareFunc default_sort_func;
+ gpointer default_sort_data;
+ GDestroyNotify default_sort_destroy;
+
+ /* signal ids */
+ gulong changed_id;
+ gulong inserted_id;
+ gulong has_child_toggled_id;
+ gulong deleted_id;
+ gulong reordered_id;
+};
+
#define GTK_TREE_MODEL_SORT_CACHE_CHILD_ITERS(tree_model_sort) \
- (((GtkTreeModelSort *)tree_model_sort)->child_flags>K_TREE_MODEL_ITERS_PERSIST)
+ (((GtkTreeModelSort *)tree_model_sort)->priv->child_flags>K_TREE_MODEL_ITERS_PERSIST)
#define SORT_ELT(sort_elt) ((SortElt *)sort_elt)
#define SORT_LEVEL(sort_level) ((SortLevel *)sort_level)
-#define GET_CHILD_ITER(tree_model_sort,ch_iter,so_iter) gtk_tree_model_sort_convert_iter_to_child_iter(GTK_TREE_MODEL_SORT (tree_model_sort), ch_iter, so_iter);
+#define SORT_LEVEL_PARENT_ELT(level) (&g_array_index (SORT_LEVEL ((level))->parent_level->array, SortElt, SORT_LEVEL ((level))->parent_elt_index))
+#define SORT_LEVEL_ELT_INDEX(level, elt) (SORT_ELT ((elt)) - SORT_ELT (SORT_LEVEL ((level))->array->data))
+
+
+#define GET_CHILD_ITER(tree_model_sort,ch_iter,so_iter) gtk_tree_model_sort_convert_iter_to_child_iter((GtkTreeModelSort*)(tree_model_sort), (ch_iter), (so_iter));
#define NO_SORT_FUNC ((GtkTreeIterCompareFunc) 0x1)
-#define VALID_ITER(iter, tree_model_sort) (iter != NULL && iter->user_data != NULL && iter->user_data2 != NULL && tree_model_sort->stamp == iter->stamp)
+#define VALID_ITER(iter, tree_model_sort) ((iter) != NULL && (iter)->user_data != NULL && (iter)->user_data2 != NULL && (tree_model_sort)->priv->stamp == (iter)->stamp)
/* general (object/interface init, etc) */
-static void gtk_tree_model_sort_init (GtkTreeModelSort *tree_model_sort);
-static void gtk_tree_model_sort_class_init (GtkTreeModelSortClass *tree_model_sort_class);
static void gtk_tree_model_sort_tree_model_init (GtkTreeModelIface *iface);
static void gtk_tree_model_sort_tree_sortable_init (GtkTreeSortableIface *iface);
static void gtk_tree_model_sort_drag_source_init (GtkTreeDragSourceIface*iface);
GValue *value);
static gboolean gtk_tree_model_sort_iter_next (GtkTreeModel *tree_model,
GtkTreeIter *iter);
+static gboolean gtk_tree_model_sort_iter_previous (GtkTreeModel *tree_model,
+ GtkTreeIter *iter);
static gboolean gtk_tree_model_sort_iter_children (GtkTreeModel *tree_model,
GtkTreeIter *iter,
GtkTreeIter *parent);
gint sort_column_id,
GtkTreeIterCompareFunc func,
gpointer data,
- GtkDestroyNotify destroy);
+ GDestroyNotify destroy);
static void gtk_tree_model_sort_set_default_sort_func (GtkTreeSortable *sortable,
GtkTreeIterCompareFunc func,
gpointer data,
- GtkDestroyNotify destroy);
+ GDestroyNotify destroy);
static gboolean gtk_tree_model_sort_has_default_sort_func (GtkTreeSortable *sortable);
/* Private functions (sort funcs, level handling and other utils) */
static void gtk_tree_model_sort_build_level (GtkTreeModelSort *tree_model_sort,
SortLevel *parent_level,
- SortElt *parent_elt);
+ gint parent_elt_index);
static void gtk_tree_model_sort_free_level (GtkTreeModelSort *tree_model_sort,
SortLevel *sort_level);
static void gtk_tree_model_sort_increment_stamp (GtkTreeModelSort *tree_model_sort);
GtkTreePath *child_path,
gboolean build_levels);
-static GObjectClass *parent_class = NULL;
-
-GType
-gtk_tree_model_sort_get_type (void)
-{
- static GType tree_model_sort_type = 0;
-
- if (!tree_model_sort_type)
- {
- static const GTypeInfo tree_model_sort_info =
- {
- sizeof (GtkTreeModelSortClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) gtk_tree_model_sort_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (GtkTreeModelSort),
- 0, /* n_preallocs */
- (GInstanceInitFunc) gtk_tree_model_sort_init
- };
-
- static const GInterfaceInfo tree_model_info =
- {
- (GInterfaceInitFunc) gtk_tree_model_sort_tree_model_init,
- NULL,
- NULL
- };
-
- static const GInterfaceInfo sortable_info =
- {
- (GInterfaceInitFunc) gtk_tree_model_sort_tree_sortable_init,
- NULL,
- NULL
- };
-
- static const GInterfaceInfo drag_source_info =
- {
- (GInterfaceInitFunc) gtk_tree_model_sort_drag_source_init,
- NULL,
- NULL
- };
-
- tree_model_sort_type =
- g_type_register_static (G_TYPE_OBJECT, I_("GtkTreeModelSort"),
- &tree_model_sort_info, 0);
- g_type_add_interface_static (tree_model_sort_type,
- GTK_TYPE_TREE_MODEL,
- &tree_model_info);
-
- g_type_add_interface_static (tree_model_sort_type,
- GTK_TYPE_TREE_SORTABLE,
- &sortable_info);
-
- g_type_add_interface_static (tree_model_sort_type,
- GTK_TYPE_TREE_DRAG_SOURCE,
- &drag_source_info);
- }
-
- return tree_model_sort_type;
-}
+G_DEFINE_TYPE_WITH_CODE (GtkTreeModelSort, gtk_tree_model_sort, G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL,
+ gtk_tree_model_sort_tree_model_init)
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_SORTABLE,
+ gtk_tree_model_sort_tree_sortable_init)
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_DRAG_SOURCE,
+ gtk_tree_model_sort_drag_source_init))
static void
gtk_tree_model_sort_init (GtkTreeModelSort *tree_model_sort)
{
- tree_model_sort->sort_column_id = GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID;
- tree_model_sort->stamp = 0;
- tree_model_sort->zero_ref_count = 0;
- tree_model_sort->root = NULL;
- tree_model_sort->sort_list = NULL;
+ GtkTreeModelSortPrivate *priv;
+
+ priv = G_TYPE_INSTANCE_GET_PRIVATE (tree_model_sort,
+ GTK_TYPE_TREE_MODEL_SORT,
+ GtkTreeModelSortPrivate);
+ tree_model_sort->priv = priv;
+ priv->sort_column_id = GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID;
+ priv->stamp = 0;
+ priv->zero_ref_count = 0;
+ priv->root = NULL;
+ priv->sort_list = NULL;
}
static void
GObjectClass *object_class;
object_class = (GObjectClass *) class;
- parent_class = g_type_class_peek_parent (class);
object_class->set_property = gtk_tree_model_sort_set_property;
object_class->get_property = gtk_tree_model_sort_get_property;
P_("The model for the TreeModelSort to sort"),
GTK_TYPE_TREE_MODEL,
GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+
+ g_type_class_add_private (class, sizeof (GtkTreeModelSortPrivate));
}
static void
iface->get_path = gtk_tree_model_sort_get_path;
iface->get_value = gtk_tree_model_sort_get_value;
iface->iter_next = gtk_tree_model_sort_iter_next;
+ iface->iter_previous = gtk_tree_model_sort_iter_previous;
iface->iter_children = gtk_tree_model_sort_iter_children;
iface->iter_has_child = gtk_tree_model_sort_iter_has_child;
iface->iter_n_children = gtk_tree_model_sort_iter_n_children;
*
* Creates a new #GtkTreeModel, with @child_model as the child model.
*
- * Return value: A new #GtkTreeModel.
+ * Return value: (transfer full): A new #GtkTreeModel.
*/
GtkTreeModel *
-gtk_tree_model_sort_new_with_model (GtkTreeModel *child_model)
+gtk_tree_model_sort_new_with_model (GtkTreeModel *child_model)
{
GtkTreeModel *retval;
gtk_tree_model_sort_finalize (GObject *object)
{
GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *) object;
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
gtk_tree_model_sort_set_model (tree_model_sort, NULL);
- if (tree_model_sort->root)
- gtk_tree_model_sort_free_level (tree_model_sort, tree_model_sort->root);
+ if (priv->root)
+ gtk_tree_model_sort_free_level (tree_model_sort, priv->root);
- if (tree_model_sort->sort_list)
+ if (priv->sort_list)
{
- _gtk_tree_data_list_header_free (tree_model_sort->sort_list);
- tree_model_sort->sort_list = NULL;
+ _gtk_tree_data_list_header_free (priv->sort_list);
+ priv->sort_list = NULL;
}
+ if (priv->default_sort_destroy)
+ {
+ priv->default_sort_destroy (priv->default_sort_data);
+ priv->default_sort_destroy = NULL;
+ priv->default_sort_data = NULL;
+ }
+
+
/* must chain up */
- parent_class->finalize (object);
+ G_OBJECT_CLASS (gtk_tree_model_sort_parent_class)->finalize (object);
}
static void
switch (prop_id)
{
case PROP_MODEL:
- g_value_set_object (value, gtk_tree_model_sort_get_model(tree_model_sort));
+ g_value_set_object (value, gtk_tree_model_sort_get_model (tree_model_sort));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
gpointer data)
{
GtkTreeModelSort *tree_model_sort = GTK_TREE_MODEL_SORT (data);
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
GtkTreePath *path = NULL;
GtkTreeIter iter;
GtkTreeIter tmpiter;
}
gtk_tree_model_get_iter (GTK_TREE_MODEL (data), &iter, path);
+ gtk_tree_model_sort_ref_node (GTK_TREE_MODEL (data), &iter);
level = iter.user_data;
elt = iter.user_data2;
- level->ref_count++;
-
if (level->array->len < 2 ||
- (tree_model_sort->sort_column_id == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID &&
- tree_model_sort->default_sort_func == NO_SORT_FUNC))
+ (priv->sort_column_id == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID &&
+ priv->default_sort_func == NO_SORT_FUNC))
{
if (free_s_path)
gtk_tree_path_free (start_s_path);
gtk_tree_model_row_changed (GTK_TREE_MODEL (data), path, &iter);
+ gtk_tree_model_sort_unref_node (GTK_TREE_MODEL (data), &iter);
gtk_tree_path_free (path);
- level->ref_count--;
-
return;
}
if (!GTK_TREE_MODEL_SORT_CACHE_CHILD_ITERS (tree_model_sort))
{
- gtk_tree_model_get_iter (tree_model_sort->child_model,
+ gtk_tree_model_get_iter (priv->child_model,
&tmpiter, start_s_path);
}
for (i = 0; i < level->array->len; i++)
if (g_array_index (level->array, SortElt, i).children)
- g_array_index (level->array, SortElt, i).children->parent_elt = &g_array_index (level->array, SortElt, i);
+ g_array_index (level->array, SortElt, i).children->parent_elt_index = i;
gtk_tree_path_up (path);
gtk_tree_path_append_index (path, index);
/* else? shouldn't really happen */
}
- if (level->parent_elt)
+ if (level->parent_elt_index >= 0)
{
- iter.stamp = tree_model_sort->stamp;
+ iter.stamp = priv->stamp;
iter.user_data = level->parent_level;
- iter.user_data2 = level->parent_elt;
+ iter.user_data2 = SORT_LEVEL_PARENT_ELT (level);
tmppath = gtk_tree_model_get_path (GTK_TREE_MODEL (tree_model_sort), &iter);
g_free (new_order);
}
- level->ref_count--;
-
/* emit row_changed signal (at new location) */
gtk_tree_model_get_iter (GTK_TREE_MODEL (data), &iter, path);
gtk_tree_model_row_changed (GTK_TREE_MODEL (data), path, &iter);
+ gtk_tree_model_sort_unref_node (GTK_TREE_MODEL (data), &iter);
gtk_tree_path_free (path);
if (free_s_path)
gpointer data)
{
GtkTreeModelSort *tree_model_sort = GTK_TREE_MODEL_SORT (data);
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
GtkTreePath *path;
GtkTreeIter iter;
GtkTreeIter real_s_iter;
SortLevel *level;
SortLevel *parent_level = NULL;
- parent_level = level = SORT_LEVEL (tree_model_sort->root);
+ parent_level = level = SORT_LEVEL (priv->root);
g_return_if_fail (s_path != NULL || s_iter != NULL);
else
real_s_iter = *s_iter;
- if (!tree_model_sort->root)
+ if (!priv->root)
{
- gtk_tree_model_sort_build_level (tree_model_sort, NULL, NULL);
+ gtk_tree_model_sort_build_level (tree_model_sort, NULL, -1);
/* the build level already put the inserted iter in the level,
so no need to handle this signal anymore */
if (level->array->len < gtk_tree_path_get_indices (s_path)[i])
{
- g_warning ("A node was inserted with a parent that's not in the tree.\n"
+ g_warning ("%s: A node was inserted with a parent that's not in the tree.\n"
"This possibly means that a GtkTreeModel inserted a child node\n"
- "before the parent was inserted.");
+ "before the parent was inserted.",
+ G_STRLOC);
goto done;
}
if (!elt->children)
{
- GtkTreePath *tmppath;
- GtkTreeIter tmpiter;
-
- tmpiter.stamp = tree_model_sort->stamp;
- tmpiter.user_data = level;
- tmpiter.user_data2 = elt;
-
- tmppath = gtk_tree_model_get_path (GTK_TREE_MODEL (data), &tmpiter);
- if (tmppath)
- {
- gtk_tree_model_row_has_child_toggled (GTK_TREE_MODEL (data),
- tmppath,
- &tmpiter);
- gtk_tree_path_free (tmppath);
- }
-
/* not covering this signal */
goto done;
}
if (!parent_level)
goto done;
- if (level->ref_count == 0 && level != tree_model_sort->root)
+ if (level->ref_count == 0 && level != priv->root)
{
gtk_tree_model_sort_free_level (tree_model_sort, level);
goto done;
gtk_tree_path_free (path);
}
-/* FIXME: I still have doubts if this works */
static void
gtk_tree_model_sort_row_deleted (GtkTreeModel *s_model,
GtkTreePath *s_path,
*/
gtk_tree_model_sort_increment_stamp (tree_model_sort);
gtk_tree_path_free (path);
- if (level == tree_model_sort->root)
+ if (level == tree_model_sort->priv->root)
{
gtk_tree_model_sort_free_level (tree_model_sort,
- tree_model_sort->root);
- tree_model_sort->root = NULL;
+ tree_model_sort->priv->root);
+ tree_model_sort->priv->root = NULL;
}
return;
}
if (elt->offset > offset)
elt->offset--;
if (elt->children)
- elt->children->parent_elt = elt;
+ elt->children->parent_elt_index = i;
}
gtk_tree_path_free (path);
int i, j;
GtkTreePath *path;
GtkTreeModelSort *tree_model_sort = GTK_TREE_MODEL_SORT (data);
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
g_return_if_fail (new_order != NULL);
- if (s_path == NULL || gtk_tree_path_get_indices (s_path) == NULL)
+ if (s_path == NULL || gtk_tree_path_get_depth (s_path) == 0)
{
- if (tree_model_sort->root == NULL)
+ if (priv->root == NULL)
return;
path = gtk_tree_path_new ();
- level = SORT_LEVEL (tree_model_sort->root);
+ level = SORT_LEVEL (priv->root);
}
else
{
g_array_index (level->array, SortElt, i).offset = tmp_array[i];
g_free (tmp_array);
- if (tree_model_sort->sort_column_id == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID &&
- tree_model_sort->default_sort_func == NO_SORT_FUNC)
+ if (priv->sort_column_id == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID &&
+ priv->default_sort_func == NO_SORT_FUNC)
{
gtk_tree_model_sort_sort_level (tree_model_sort, level,
static GtkTreeModelFlags
gtk_tree_model_sort_get_flags (GtkTreeModel *tree_model)
{
+ GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *) tree_model;
GtkTreeModelFlags flags;
- g_return_val_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model), 0);
- g_return_val_if_fail (GTK_TREE_MODEL_SORT (tree_model)->child_model != NULL, 0);
+ g_return_val_if_fail (tree_model_sort->priv->child_model != NULL, 0);
- flags = gtk_tree_model_get_flags (GTK_TREE_MODEL_SORT (tree_model)->child_model);
+ flags = gtk_tree_model_get_flags (tree_model_sort->priv->child_model);
if ((flags & GTK_TREE_MODEL_LIST_ONLY) == GTK_TREE_MODEL_LIST_ONLY)
return GTK_TREE_MODEL_LIST_ONLY;
{
GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *) tree_model;
- g_return_val_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model), 0);
-
- if (tree_model_sort->child_model == 0)
+ if (tree_model_sort->priv->child_model == 0)
return 0;
- return gtk_tree_model_get_n_columns (tree_model_sort->child_model);
+ return gtk_tree_model_get_n_columns (tree_model_sort->priv->child_model);
}
static GType
gtk_tree_model_sort_get_column_type (GtkTreeModel *tree_model,
gint index)
{
- g_return_val_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model), G_TYPE_INVALID);
- g_return_val_if_fail (GTK_TREE_MODEL_SORT (tree_model)->child_model != NULL, G_TYPE_INVALID);
+ GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *) tree_model;
- return gtk_tree_model_get_column_type (GTK_TREE_MODEL_SORT (tree_model)->child_model, index);
+ g_return_val_if_fail (tree_model_sort->priv->child_model != NULL, G_TYPE_INVALID);
+
+ return gtk_tree_model_get_column_type (tree_model_sort->priv->child_model, index);
}
static gboolean
GtkTreeIter *iter,
GtkTreePath *path)
{
- GtkTreeModelSort *tree_model_sort;
+ GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *) tree_model;
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
gint *indices;
SortLevel *level;
gint depth, i;
- g_return_val_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model), FALSE);
- g_return_val_if_fail (GTK_TREE_MODEL_SORT (tree_model)->child_model != NULL, FALSE);
+ g_return_val_if_fail (priv->child_model != NULL, FALSE);
- tree_model_sort = (GtkTreeModelSort *) tree_model;
indices = gtk_tree_path_get_indices (path);
- if (tree_model_sort->root == NULL)
- gtk_tree_model_sort_build_level (tree_model_sort, NULL, NULL);
- level = SORT_LEVEL (tree_model_sort->root);
+ if (priv->root == NULL)
+ gtk_tree_model_sort_build_level (tree_model_sort, NULL, -1);
+ level = SORT_LEVEL (priv->root);
depth = gtk_tree_path_get_depth (path);
if (depth == 0)
return FALSE;
if (g_array_index (level->array, SortElt, indices[i]).children == NULL)
- gtk_tree_model_sort_build_level (tree_model_sort, level, &g_array_index (level->array, SortElt, indices[i]));
+ gtk_tree_model_sort_build_level (tree_model_sort, level, indices[i]);
level = g_array_index (level->array, SortElt, indices[i]).children;
}
return FALSE;
}
- iter->stamp = tree_model_sort->stamp;
+ iter->stamp = priv->stamp;
iter->user_data = level;
iter->user_data2 = &g_array_index (level->array, SortElt, indices[depth - 1]);
gtk_tree_model_sort_get_path (GtkTreeModel *tree_model,
GtkTreeIter *iter)
{
+ GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *) tree_model;
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
GtkTreePath *retval;
SortLevel *level;
- SortElt *elt;
+ gint elt_index;
- g_return_val_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model), NULL);
- g_return_val_if_fail (GTK_TREE_MODEL_SORT (tree_model)->child_model != NULL, NULL);
- g_return_val_if_fail (GTK_TREE_MODEL_SORT (tree_model)->stamp == iter->stamp, NULL);
+ g_return_val_if_fail (priv->child_model != NULL, NULL);
+ g_return_val_if_fail (priv->stamp == iter->stamp, NULL);
retval = gtk_tree_path_new ();
- level = iter->user_data;
- elt = iter->user_data2;
- while (level != NULL)
+
+ level = SORT_LEVEL (iter->user_data);
+ elt_index = SORT_LEVEL_ELT_INDEX (level, iter->user_data2);
+
+ while (level)
{
- gtk_tree_path_prepend_index (retval, elt - (SortElt *)level->array->data);
+ gtk_tree_path_prepend_index (retval, elt_index);
- elt = level->parent_elt;
+ elt_index = level->parent_elt_index;
level = level->parent_level;
}
gint column,
GValue *value)
{
+ GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *) tree_model;
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
GtkTreeIter child_iter;
- g_return_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model));
- g_return_if_fail (GTK_TREE_MODEL_SORT (tree_model)->child_model != NULL);
- g_return_if_fail (GTK_TREE_MODEL_SORT (tree_model)->stamp == iter->stamp);
+ g_return_if_fail (priv->child_model != NULL);
+ g_return_if_fail (VALID_ITER (iter, tree_model_sort));
- GET_CHILD_ITER (tree_model, &child_iter, iter);
- gtk_tree_model_get_value (GTK_TREE_MODEL_SORT (tree_model)->child_model,
+ GET_CHILD_ITER (tree_model_sort, &child_iter, iter);
+ gtk_tree_model_get_value (priv->child_model,
&child_iter, column, value);
}
gtk_tree_model_sort_iter_next (GtkTreeModel *tree_model,
GtkTreeIter *iter)
{
+ GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *) tree_model;
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
SortLevel *level;
SortElt *elt;
- g_return_val_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model), FALSE);
- g_return_val_if_fail (GTK_TREE_MODEL_SORT (tree_model)->child_model != NULL, FALSE);
- g_return_val_if_fail (GTK_TREE_MODEL_SORT (tree_model)->stamp == iter->stamp, FALSE);
+ g_return_val_if_fail (priv->child_model != NULL, FALSE);
+ g_return_val_if_fail (priv->stamp == iter->stamp, FALSE);
level = iter->user_data;
elt = iter->user_data2;
return TRUE;
}
+static gboolean
+gtk_tree_model_sort_iter_previous (GtkTreeModel *tree_model,
+ GtkTreeIter *iter)
+{
+ GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *) tree_model;
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
+ SortLevel *level;
+ SortElt *elt;
+
+ g_return_val_if_fail (priv->child_model != NULL, FALSE);
+ g_return_val_if_fail (priv->stamp == iter->stamp, FALSE);
+
+ level = iter->user_data;
+ elt = iter->user_data2;
+
+ if (elt == (SortElt *)level->array->data)
+ {
+ iter->stamp = 0;
+ return FALSE;
+ }
+ iter->user_data2 = elt - 1;
+
+ return TRUE;
+}
+
static gboolean
gtk_tree_model_sort_iter_children (GtkTreeModel *tree_model,
GtkTreeIter *iter,
GtkTreeIter *parent)
{
GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *) tree_model;
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
SortLevel *level;
iter->stamp = 0;
- g_return_val_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model), FALSE);
- g_return_val_if_fail (tree_model_sort->child_model != NULL, FALSE);
- if (parent) g_return_val_if_fail (tree_model_sort->stamp == parent->stamp, FALSE);
+ g_return_val_if_fail (priv->child_model != NULL, FALSE);
+ if (parent)
+ g_return_val_if_fail (VALID_ITER (parent, tree_model_sort), FALSE);
if (parent == NULL)
{
- if (tree_model_sort->root == NULL)
- gtk_tree_model_sort_build_level (tree_model_sort, NULL, NULL);
- if (tree_model_sort->root == NULL)
+ if (priv->root == NULL)
+ gtk_tree_model_sort_build_level (tree_model_sort, NULL, -1);
+ if (priv->root == NULL)
return FALSE;
- level = tree_model_sort->root;
- iter->stamp = tree_model_sort->stamp;
+ level = priv->root;
+ iter->stamp = priv->stamp;
iter->user_data = level;
iter->user_data2 = level->array->data;
}
else
{
- if (((SortElt *)parent->user_data2)->children == NULL)
- gtk_tree_model_sort_build_level (tree_model_sort,
- (SortLevel *)parent->user_data,
- (SortElt *)parent->user_data2);
- if (((SortElt *)parent->user_data2)->children == NULL)
+ SortElt *elt;
+
+ level = SORT_LEVEL (parent->user_data);
+ elt = SORT_ELT (parent->user_data2);
+
+ if (elt->children == NULL)
+ gtk_tree_model_sort_build_level (tree_model_sort, level,
+ SORT_LEVEL_ELT_INDEX (level, elt));
+
+ if (elt->children == NULL)
return FALSE;
- iter->stamp = tree_model_sort->stamp;
- iter->user_data = ((SortElt *)parent->user_data2)->children;
- iter->user_data2 = ((SortLevel *)iter->user_data)->array->data;
+
+ iter->stamp = priv->stamp;
+ iter->user_data = elt->children;
+ iter->user_data2 = elt->children->array->data;
}
return TRUE;
gtk_tree_model_sort_iter_has_child (GtkTreeModel *tree_model,
GtkTreeIter *iter)
{
+ GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *) tree_model;
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
GtkTreeIter child_iter;
- g_return_val_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model), FALSE);
- g_return_val_if_fail (GTK_TREE_MODEL_SORT (tree_model)->child_model != NULL, FALSE);
- g_return_val_if_fail (GTK_TREE_MODEL_SORT (tree_model)->stamp == iter->stamp, FALSE);
+ g_return_val_if_fail (priv->child_model != NULL, FALSE);
+ g_return_val_if_fail (VALID_ITER (iter, tree_model_sort), FALSE);
- GET_CHILD_ITER (tree_model, &child_iter, iter);
+ GET_CHILD_ITER (tree_model_sort, &child_iter, iter);
- return gtk_tree_model_iter_has_child (GTK_TREE_MODEL_SORT (tree_model)->child_model, &child_iter);
+ return gtk_tree_model_iter_has_child (priv->child_model, &child_iter);
}
static gint
gtk_tree_model_sort_iter_n_children (GtkTreeModel *tree_model,
GtkTreeIter *iter)
{
+ GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *) tree_model;
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
GtkTreeIter child_iter;
- g_return_val_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model), 0);
- g_return_val_if_fail (GTK_TREE_MODEL_SORT (tree_model)->child_model != NULL, 0);
- if (iter) g_return_val_if_fail (GTK_TREE_MODEL_SORT (tree_model)->stamp == iter->stamp, 0);
+ g_return_val_if_fail (priv->child_model != NULL, 0);
+ if (iter)
+ g_return_val_if_fail (VALID_ITER (iter, tree_model_sort), 0);
if (iter == NULL)
- return gtk_tree_model_iter_n_children (GTK_TREE_MODEL_SORT (tree_model)->child_model, NULL);
+ return gtk_tree_model_iter_n_children (priv->child_model, NULL);
- GET_CHILD_ITER (tree_model, &child_iter, iter);
+ GET_CHILD_ITER (tree_model_sort, &child_iter, iter);
- return gtk_tree_model_iter_n_children (GTK_TREE_MODEL_SORT (tree_model)->child_model, &child_iter);
+ return gtk_tree_model_iter_n_children (priv->child_model, &child_iter);
}
static gboolean
GtkTreeIter *parent,
gint n)
{
+ GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *) tree_model;
SortLevel *level;
/* We have this for the iter == parent case */
GtkTreeIter children;
- g_return_val_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model), FALSE);
- if (parent) g_return_val_if_fail (GTK_TREE_MODEL_SORT (tree_model)->stamp == parent->stamp, FALSE);
+ if (parent)
+ g_return_val_if_fail (VALID_ITER (parent, tree_model_sort), FALSE);
/* Use this instead of has_child to force us to build the level, if needed */
if (gtk_tree_model_sort_iter_children (tree_model, &children, parent) == FALSE)
return FALSE;
}
- iter->stamp = GTK_TREE_MODEL_SORT (tree_model)->stamp;
+ iter->stamp = tree_model_sort->priv->stamp;
iter->user_data = level;
iter->user_data2 = &g_array_index (level->array, SortElt, n);
gtk_tree_model_sort_iter_parent (GtkTreeModel *tree_model,
GtkTreeIter *iter,
GtkTreeIter *child)
-{
+{
+ GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *) tree_model;
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
SortLevel *level;
iter->stamp = 0;
- g_return_val_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model), FALSE);
- g_return_val_if_fail (GTK_TREE_MODEL_SORT (tree_model)->child_model != NULL, FALSE);
- g_return_val_if_fail (GTK_TREE_MODEL_SORT (tree_model)->stamp == child->stamp, FALSE);
+ g_return_val_if_fail (priv->child_model != NULL, FALSE);
+ g_return_val_if_fail (VALID_ITER (child, tree_model_sort), FALSE);
level = child->user_data;
if (level->parent_level)
{
- iter->stamp = GTK_TREE_MODEL_SORT (tree_model)->stamp;
+ iter->stamp = priv->stamp;
iter->user_data = level->parent_level;
- iter->user_data2 = level->parent_elt;
+ iter->user_data2 = SORT_LEVEL_PARENT_ELT (level);
return TRUE;
}
GtkTreeIter *iter)
{
GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *) tree_model;
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
GtkTreeIter child_iter;
- SortLevel *level;
+ SortLevel *level, *parent_level;
SortElt *elt;
+ gint parent_elt_index;
- g_return_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model));
- g_return_if_fail (GTK_TREE_MODEL_SORT (tree_model)->child_model != NULL);
- g_return_if_fail (GTK_TREE_MODEL_SORT (tree_model)->stamp == iter->stamp);
+ g_return_if_fail (priv->child_model != NULL);
+ g_return_if_fail (VALID_ITER (iter, tree_model_sort));
- GET_CHILD_ITER (tree_model, &child_iter, iter);
+ GET_CHILD_ITER (tree_model_sort, &child_iter, iter);
- gtk_tree_model_ref_node (GTK_TREE_MODEL_SORT (tree_model)->child_model, &child_iter);
+ /* Reference the node in the child model */
+ gtk_tree_model_ref_node (priv->child_model, &child_iter);
+ /* Increase the reference count of this element and its level */
level = iter->user_data;
elt = iter->user_data2;
elt->ref_count++;
level->ref_count++;
+
+ /* Increase the reference count of all parent elements */
+ parent_level = level->parent_level;
+ parent_elt_index = level->parent_elt_index;
+
+ while (parent_level)
+ {
+ GtkTreeIter tmp_iter;
+
+ tmp_iter.stamp = priv->stamp;
+ tmp_iter.user_data = parent_level;
+ tmp_iter.user_data2 = &g_array_index (parent_level->array, SortElt, parent_elt_index);
+
+ gtk_tree_model_sort_ref_node (tree_model, &tmp_iter);
+
+ parent_elt_index = parent_level->parent_elt_index;
+ parent_level = parent_level->parent_level;
+ }
+
if (level->ref_count == 1)
{
SortLevel *parent_level = level->parent_level;
- SortElt *parent_elt = level->parent_elt;
+ gint parent_elt_index = level->parent_elt_index;
+
/* We were at zero -- time to decrement the zero_ref_count val */
- do
- {
- if (parent_elt)
- parent_elt->zero_ref_count--;
- else
- tree_model_sort->zero_ref_count--;
+ while (parent_level)
+ {
+ g_array_index (parent_level->array, SortElt, parent_elt_index).zero_ref_count--;
- if (parent_level)
- {
- parent_elt = parent_level->parent_elt;
- parent_level = parent_level->parent_level;
- }
+ parent_elt_index = parent_level->parent_elt_index;
+ parent_level = parent_level->parent_level;
}
- while (parent_level);
+
+ if (priv->root != level)
+ priv->zero_ref_count--;
}
}
gboolean propagate_unref)
{
GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *) tree_model;
- GtkTreeIter child_iter;
- SortLevel *level;
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
+ SortLevel *level, *parent_level;
SortElt *elt;
+ gint parent_elt_index;
- g_return_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model));
- g_return_if_fail (GTK_TREE_MODEL_SORT (tree_model)->child_model != NULL);
- g_return_if_fail (GTK_TREE_MODEL_SORT (tree_model)->stamp == iter->stamp);
-
- GET_CHILD_ITER (tree_model, &child_iter, iter);
+ g_return_if_fail (priv->child_model != NULL);
+ g_return_if_fail (VALID_ITER (iter, tree_model_sort));
if (propagate_unref)
- gtk_tree_model_unref_node (GTK_TREE_MODEL_SORT (tree_model)->child_model, &child_iter);
+ {
+ GtkTreeIter child_iter;
+
+ GET_CHILD_ITER (tree_model_sort, &child_iter, iter);
+ gtk_tree_model_unref_node (priv->child_model, &child_iter);
+ }
level = iter->user_data;
elt = iter->user_data2;
elt->ref_count--;
level->ref_count--;
+ /* Decrease the reference count of all parent elements */
+ parent_level = level->parent_level;
+ parent_elt_index = level->parent_elt_index;
+
+ while (parent_level)
+ {
+ GtkTreeIter tmp_iter;
+
+ tmp_iter.stamp = priv->stamp;
+ tmp_iter.user_data = parent_level;
+ tmp_iter.user_data2 = &g_array_index (parent_level->array, SortElt, parent_elt_index);
+
+ gtk_tree_model_sort_real_unref_node (tree_model, &tmp_iter, FALSE);
+
+ parent_elt_index = parent_level->parent_elt_index;
+ parent_level = parent_level->parent_level;
+ }
+
if (level->ref_count == 0)
{
SortLevel *parent_level = level->parent_level;
- SortElt *parent_elt = level->parent_elt;
+ gint parent_elt_index = level->parent_elt_index;
/* We are at zero -- time to increment the zero_ref_count val */
while (parent_level)
{
- parent_elt->zero_ref_count++;
+ g_array_index (parent_level->array, SortElt, parent_elt_index).zero_ref_count++;
- parent_elt = parent_level->parent_elt;
+ parent_elt_index = parent_level->parent_elt_index;
parent_level = parent_level->parent_level;
}
- tree_model_sort->zero_ref_count++;
+
+ if (priv->root != level)
+ priv->zero_ref_count++;
}
}
GtkSortType *order)
{
GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *)sortable;
-
- g_return_val_if_fail (GTK_IS_TREE_MODEL_SORT (sortable), FALSE);
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
if (sort_column_id)
- *sort_column_id = tree_model_sort->sort_column_id;
+ *sort_column_id = priv->sort_column_id;
if (order)
- *order = tree_model_sort->order;
+ *order = priv->order;
- if (tree_model_sort->sort_column_id == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID ||
- tree_model_sort->sort_column_id == GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID)
+ if (priv->sort_column_id == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID ||
+ priv->sort_column_id == GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID)
return FALSE;
return TRUE;
GtkSortType order)
{
GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *)sortable;
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
- g_return_if_fail (GTK_IS_TREE_MODEL_SORT (sortable));
-
- if (sort_column_id != GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID)
+ if (sort_column_id != GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID)
{
- GtkTreeDataSortHeader *header = NULL;
+ if (sort_column_id != GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID)
+ {
+ GtkTreeDataSortHeader *header = NULL;
- header = _gtk_tree_data_list_get_header (tree_model_sort->sort_list,
- sort_column_id);
+ header = _gtk_tree_data_list_get_header (priv->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_model_sort->default_sort_func != NULL);
+ /* 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 (priv->default_sort_func != NULL);
- if (tree_model_sort->sort_column_id == sort_column_id)
- {
- if (sort_column_id != GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID)
- {
- if (tree_model_sort->order == order)
+ if (priv->sort_column_id == sort_column_id)
+ {
+ if (sort_column_id != GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID)
+ {
+ if (priv->order == order)
+ return;
+ }
+ else
return;
- }
- else
- return;
+ }
}
- tree_model_sort->sort_column_id = sort_column_id;
- tree_model_sort->order = order;
+ priv->sort_column_id = sort_column_id;
+ priv->order = order;
gtk_tree_sortable_sort_column_changed (sortable);
gint sort_column_id,
GtkTreeIterCompareFunc func,
gpointer data,
- GtkDestroyNotify destroy)
+ GDestroyNotify destroy)
{
GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *) sortable;
- GtkTreeDataSortHeader *header = NULL;
- GList *list;
-
- g_return_if_fail (GTK_IS_TREE_MODEL_SORT (sortable));
- g_return_if_fail (func != NULL);
-
- for (list = tree_model_sort->sort_list; list; list = list->next)
- {
- GtkTreeDataSortHeader *list_header;
-
- list_header = (GtkTreeDataSortHeader*) list->data;
- if (list_header->sort_column_id == sort_column_id)
- {
- header = list_header;
- break;
- }
- }
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
- if (header == NULL)
- {
- header = g_new0 (GtkTreeDataSortHeader, 1);
- header->sort_column_id = sort_column_id;
- tree_model_sort->sort_list = g_list_append (tree_model_sort->sort_list,
- header);
- }
-
- if (header->destroy)
- {
- GtkDestroyNotify d = header->destroy;
+ priv->sort_list = _gtk_tree_data_list_set_header (priv->sort_list,
+ sort_column_id,
+ func, data, destroy);
- header->destroy = NULL;
- d (header->data);
- }
-
- header->func = func;
- header->data = data;
- header->destroy = destroy;
-
- if (tree_model_sort->sort_column_id == sort_column_id)
+ if (priv->sort_column_id == sort_column_id)
gtk_tree_model_sort_sort (tree_model_sort);
}
gtk_tree_model_sort_set_default_sort_func (GtkTreeSortable *sortable,
GtkTreeIterCompareFunc func,
gpointer data,
- GtkDestroyNotify destroy)
+ GDestroyNotify destroy)
{
GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *)sortable;
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
- g_return_if_fail (GTK_IS_TREE_MODEL_SORT (sortable));
-
- if (tree_model_sort->default_sort_destroy)
+ if (priv->default_sort_destroy)
{
- GtkDestroyNotify d = tree_model_sort->default_sort_destroy;
+ GDestroyNotify d = priv->default_sort_destroy;
- tree_model_sort->default_sort_destroy = NULL;
- d (tree_model_sort->default_sort_data);
+ priv->default_sort_destroy = NULL;
+ d (priv->default_sort_data);
}
- tree_model_sort->default_sort_func = func;
- tree_model_sort->default_sort_data = data;
- tree_model_sort->default_sort_destroy = destroy;
+ priv->default_sort_func = func;
+ priv->default_sort_data = data;
+ priv->default_sort_destroy = destroy;
- if (tree_model_sort->sort_column_id == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID)
+ if (priv->sort_column_id == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID)
gtk_tree_model_sort_sort (tree_model_sort);
}
{
GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *)sortable;
- g_return_val_if_fail (GTK_IS_TREE_MODEL_SORT (sortable), FALSE);
-
- return (tree_model_sort->default_sort_func != NULL);
+ return (tree_model_sort->priv->default_sort_func != NULL);
}
/* DragSource interface */
GtkTreePath *child_path;
gboolean draggable;
- g_return_val_if_fail (GTK_IS_TREE_MODEL_SORT (drag_source), FALSE);
- g_return_val_if_fail (path != NULL, FALSE);
-
child_path = gtk_tree_model_sort_convert_path_to_child_path (tree_model_sort,
path);
- draggable = gtk_tree_drag_source_row_draggable (GTK_TREE_DRAG_SOURCE (tree_model_sort->child_model), child_path);
+ draggable = gtk_tree_drag_source_row_draggable (GTK_TREE_DRAG_SOURCE (tree_model_sort->priv->child_model), child_path);
gtk_tree_path_free (child_path);
return draggable;
GtkTreePath *child_path;
gboolean gotten;
- g_return_val_if_fail (GTK_IS_TREE_MODEL_SORT (drag_source), FALSE);
- g_return_val_if_fail (path != NULL, FALSE);
-
- child_path = gtk_tree_model_sort_convert_path_to_child_path (tree_model_sort,
- path);
- gotten = gtk_tree_drag_source_drag_data_get (GTK_TREE_DRAG_SOURCE (tree_model_sort->child_model), child_path, selection_data);
+ child_path = gtk_tree_model_sort_convert_path_to_child_path (tree_model_sort, path);
+ gotten = gtk_tree_drag_source_drag_data_get (GTK_TREE_DRAG_SOURCE (tree_model_sort->priv->child_model), child_path, selection_data);
gtk_tree_path_free (child_path);
return gotten;
GtkTreePath *child_path;
gboolean deleted;
- g_return_val_if_fail (GTK_IS_TREE_MODEL_SORT (drag_source), FALSE);
- g_return_val_if_fail (path != NULL, FALSE);
-
- child_path = gtk_tree_model_sort_convert_path_to_child_path (tree_model_sort,
- path);
- deleted = gtk_tree_drag_source_drag_data_delete (GTK_TREE_DRAG_SOURCE (tree_model_sort->child_model), child_path);
+ child_path = gtk_tree_model_sort_convert_path_to_child_path (tree_model_sort, path);
+ deleted = gtk_tree_drag_source_drag_data_delete (GTK_TREE_DRAG_SOURCE (tree_model_sort->priv->child_model), child_path);
gtk_tree_path_free (child_path);
return deleted;
{
SortData *data = (SortData *)user_data;
GtkTreeModelSort *tree_model_sort = data->tree_model_sort;
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
SortTuple *sa = (SortTuple *)a;
SortTuple *sb = (SortTuple *)b;
else
{
data->parent_path_indices [data->parent_path_depth-1] = sa->elt->offset;
- gtk_tree_model_get_iter (GTK_TREE_MODEL (tree_model_sort->child_model), &iter_a, data->parent_path);
+ gtk_tree_model_get_iter (GTK_TREE_MODEL (priv->child_model), &iter_a, data->parent_path);
data->parent_path_indices [data->parent_path_depth-1] = sb->elt->offset;
- gtk_tree_model_get_iter (GTK_TREE_MODEL (tree_model_sort->child_model), &iter_b, data->parent_path);
+ gtk_tree_model_get_iter (GTK_TREE_MODEL (priv->child_model), &iter_b, data->parent_path);
}
- retval = (* data->sort_func) (GTK_TREE_MODEL (tree_model_sort->child_model),
+ retval = (* data->sort_func) (GTK_TREE_MODEL (priv->child_model),
&iter_a, &iter_b,
data->sort_data);
- if (tree_model_sort->order == GTK_SORT_DESCENDING)
+ if (priv->order == GTK_SORT_DESCENDING)
{
if (retval > 0)
retval = -1;
else
retval = 0;
- if (data->tree_model_sort->order == GTK_SORT_DESCENDING)
+ if (data->tree_model_sort->priv->order == GTK_SORT_DESCENDING)
{
if (retval > 0)
retval = -1;
gboolean recurse,
gboolean emit_reordered)
{
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
gint i;
+ gint ref_offset;
GArray *sort_array;
GArray *new_array;
gint *new_order;
SortData data;
- g_return_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model_sort));
g_return_if_fail (level != NULL);
if (level->array->len < 1 && !((SortElt *)level->array->data)->children)
return;
- level->ref_count++;
+ iter.stamp = priv->stamp;
+ iter.user_data = level;
+ iter.user_data2 = &g_array_index (level->array, SortElt, 0);
+
+ gtk_tree_model_sort_ref_node (GTK_TREE_MODEL (tree_model_sort), &iter);
+ ref_offset = g_array_index (level->array, SortElt, 0).offset;
/* Set up data */
data.tree_model_sort = tree_model_sort;
- if (level->parent_elt)
+ if (level->parent_elt_index >= 0)
{
data.parent_path = gtk_tree_model_sort_elt_get_path (level->parent_level,
- level->parent_elt);
+ SORT_LEVEL_PARENT_ELT (level));
gtk_tree_path_append_index (data.parent_path, 0);
}
else
g_array_append_val (sort_array, tuple);
}
- if (tree_model_sort->sort_column_id != GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID)
+ if (priv->sort_column_id != GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID)
{
GtkTreeDataSortHeader *header = NULL;
- header = _gtk_tree_data_list_get_header (tree_model_sort->sort_list,
- tree_model_sort->sort_column_id);
+ header = _gtk_tree_data_list_get_header (priv->sort_list,
+ priv->sort_column_id);
g_return_if_fail (header != NULL);
g_return_if_fail (header->func != NULL);
else
{
/* absolutely SHOULD NOT happen: */
- g_return_if_fail (tree_model_sort->default_sort_func != NULL);
+ g_return_if_fail (priv->default_sort_func != NULL);
- data.sort_func = tree_model_sort->default_sort_func;
- data.sort_data = tree_model_sort->default_sort_data;
+ data.sort_func = priv->default_sort_func;
+ data.sort_data = priv->default_sort_data;
}
if (data.sort_func == NO_SORT_FUNC)
new_order[i] = g_array_index (sort_array, SortTuple, i).offset;
g_array_append_val (new_array, *elt);
- elt = &g_array_index (new_array, SortElt, i);
if (elt->children)
- elt->children->parent_elt = elt;
+ elt->children->parent_elt_index = i;
}
g_array_free (level->array, TRUE);
if (emit_reordered)
{
gtk_tree_model_sort_increment_stamp (tree_model_sort);
- if (level->parent_elt)
+ if (level->parent_elt_index >= 0)
{
- iter.stamp = tree_model_sort->stamp;
+ iter.stamp = priv->stamp;
iter.user_data = level->parent_level;
- iter.user_data2 = level->parent_elt;
+ iter.user_data2 = SORT_LEVEL_PARENT_ELT (level);
path = gtk_tree_model_get_path (GTK_TREE_MODEL (tree_model_sort),
&iter);
g_free (new_order);
- level->ref_count--;
+ /* get the iter we referenced at the beginning of this function and
+ * unref it again
+ */
+ iter.stamp = priv->stamp;
+ iter.user_data = level;
+
+ for (i = 0; i < level->array->len; i++)
+ {
+ if (g_array_index (level->array, SortElt, i).offset == ref_offset)
+ {
+ iter.user_data2 = &g_array_index (level->array, SortElt, i);
+ break;
+ }
+ }
+
+ gtk_tree_model_sort_unref_node (GTK_TREE_MODEL (tree_model_sort), &iter);
}
static void
gtk_tree_model_sort_sort (GtkTreeModelSort *tree_model_sort)
{
- g_return_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model_sort));
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
- if (!tree_model_sort->root)
+ if (priv->sort_column_id == GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID)
return;
- if (tree_model_sort->sort_column_id != GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID)
+ if (!priv->root)
+ return;
+
+ if (priv->sort_column_id != GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID)
{
GtkTreeDataSortHeader *header = NULL;
- header = _gtk_tree_data_list_get_header (tree_model_sort->sort_list,
- tree_model_sort->sort_column_id);
+ header = _gtk_tree_data_list_get_header (priv->sort_list,
+ priv->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_model_sort->default_sort_func != NULL);
+ g_return_if_fail (priv->default_sort_func != NULL);
- gtk_tree_model_sort_sort_level (tree_model_sort, tree_model_sort->root,
+ gtk_tree_model_sort_sort_level (tree_model_sort, priv->root,
TRUE, TRUE);
}
GtkTreeIter *iter,
gint skip_index)
{
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
gint start, middle, end;
gint cmp;
SortElt *tmp_elt;
GtkTreeIterCompareFunc func;
gpointer data;
- if (tree_model_sort->sort_column_id != GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID)
+ if (priv->sort_column_id != GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID)
{
GtkTreeDataSortHeader *header;
- header = _gtk_tree_data_list_get_header (tree_model_sort->sort_list,
- tree_model_sort->sort_column_id);
+ header = _gtk_tree_data_list_get_header (priv->sort_list,
+ priv->sort_column_id);
g_return_val_if_fail (header != NULL, 0);
}
else
{
- func = tree_model_sort->default_sort_func;
- data = tree_model_sort->default_sort_data;
+ func = priv->default_sort_func;
+ data = priv->default_sort_data;
g_return_val_if_fail (func != NO_SORT_FUNC, 0);
}
if (!GTK_TREE_MODEL_SORT_CACHE_CHILD_ITERS (tree_model_sort))
{
GtkTreePath *path = gtk_tree_model_sort_elt_get_path (level, tmp_elt);
- gtk_tree_model_get_iter (tree_model_sort->child_model,
+ gtk_tree_model_get_iter (priv->child_model,
&tmp_iter, path);
gtk_tree_path_free (path);
}
else
tmp_iter = tmp_elt->iter;
- if (tree_model_sort->order == GTK_SORT_ASCENDING)
- cmp = (* func) (GTK_TREE_MODEL (tree_model_sort->child_model),
+ if (priv->order == GTK_SORT_ASCENDING)
+ cmp = (* func) (GTK_TREE_MODEL (priv->child_model),
&tmp_iter, iter, data);
else
- cmp = (* func) (GTK_TREE_MODEL (tree_model_sort->child_model),
+ cmp = (* func) (GTK_TREE_MODEL (priv->child_model),
iter, &tmp_iter, data);
if (cmp <= 0)
GtkTreePath *s_path,
GtkTreeIter *s_iter)
{
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
gint offset, index, i;
SortElt elt;
if (tmp_elt->offset >= offset)
tmp_elt->offset++;
- if (tree_model_sort->sort_column_id == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID &&
- tree_model_sort->default_sort_func == NO_SORT_FUNC)
+ if (priv->sort_column_id == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID &&
+ priv->default_sort_func == NO_SORT_FUNC)
index = offset;
else
index = gtk_tree_model_sort_level_find_insert (tree_model_sort,
tmp_elt = SORT_ELT (level->array->data);
for (i = 0; i < level->array->len; i++, tmp_elt++)
if (tmp_elt->children)
- tmp_elt->children->parent_elt = tmp_elt;
+ tmp_elt->children->parent_elt_index = i;
return TRUE;
}
{
gtk_tree_path_prepend_index (path, walker2->offset);
- walker2 = walker->parent_elt;
+ if (!walker->parent_level)
+ break;
+
+ walker2 = SORT_LEVEL_PARENT_ELT (walker);
walker = walker->parent_level;
}
/**
* gtk_tree_model_sort_set_model:
* @tree_model_sort: The #GtkTreeModelSort.
- * @child_model: A #GtkTreeModel, or %NULL.
+ * @child_model: (allow-none): A #GtkTreeModel, or %NULL.
*
* Sets the model of @tree_model_sort to be @model. If @model is %NULL,
* then the old model is unset. The sort function is unset as a result
gtk_tree_model_sort_set_model (GtkTreeModelSort *tree_model_sort,
GtkTreeModel *child_model)
{
- g_return_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model_sort));
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
if (child_model)
g_object_ref (child_model);
- if (tree_model_sort->child_model)
+ if (priv->child_model)
{
- g_signal_handler_disconnect (tree_model_sort->child_model,
- tree_model_sort->changed_id);
- g_signal_handler_disconnect (tree_model_sort->child_model,
- tree_model_sort->inserted_id);
- g_signal_handler_disconnect (tree_model_sort->child_model,
- tree_model_sort->has_child_toggled_id);
- g_signal_handler_disconnect (tree_model_sort->child_model,
- tree_model_sort->deleted_id);
- g_signal_handler_disconnect (tree_model_sort->child_model,
- tree_model_sort->reordered_id);
+ g_signal_handler_disconnect (priv->child_model,
+ priv->changed_id);
+ g_signal_handler_disconnect (priv->child_model,
+ priv->inserted_id);
+ g_signal_handler_disconnect (priv->child_model,
+ priv->has_child_toggled_id);
+ g_signal_handler_disconnect (priv->child_model,
+ priv->deleted_id);
+ g_signal_handler_disconnect (priv->child_model,
+ priv->reordered_id);
/* reset our state */
- if (tree_model_sort->root)
- gtk_tree_model_sort_free_level (tree_model_sort, tree_model_sort->root);
- tree_model_sort->root = NULL;
- _gtk_tree_data_list_header_free (tree_model_sort->sort_list);
- tree_model_sort->sort_list = NULL;
- g_object_unref (tree_model_sort->child_model);
+ if (priv->root)
+ gtk_tree_model_sort_free_level (tree_model_sort, priv->root);
+ priv->root = NULL;
+ _gtk_tree_data_list_header_free (priv->sort_list);
+ priv->sort_list = NULL;
+ g_object_unref (priv->child_model);
}
- tree_model_sort->child_model = child_model;
+ priv->child_model = child_model;
if (child_model)
{
GType *types;
gint i, n_columns;
- tree_model_sort->changed_id =
- g_signal_connect (child_model, "row_changed",
+ priv->changed_id =
+ g_signal_connect (child_model, "row-changed",
G_CALLBACK (gtk_tree_model_sort_row_changed),
tree_model_sort);
- tree_model_sort->inserted_id =
- g_signal_connect (child_model, "row_inserted",
+ priv->inserted_id =
+ g_signal_connect (child_model, "row-inserted",
G_CALLBACK (gtk_tree_model_sort_row_inserted),
tree_model_sort);
- tree_model_sort->has_child_toggled_id =
- g_signal_connect (child_model, "row_has_child_toggled",
+ priv->has_child_toggled_id =
+ g_signal_connect (child_model, "row-has-child-toggled",
G_CALLBACK (gtk_tree_model_sort_row_has_child_toggled),
tree_model_sort);
- tree_model_sort->deleted_id =
- g_signal_connect (child_model, "row_deleted",
+ priv->deleted_id =
+ g_signal_connect (child_model, "row-deleted",
G_CALLBACK (gtk_tree_model_sort_row_deleted),
tree_model_sort);
- tree_model_sort->reordered_id =
- g_signal_connect (child_model, "rows_reordered",
+ priv->reordered_id =
+ g_signal_connect (child_model, "rows-reordered",
G_CALLBACK (gtk_tree_model_sort_rows_reordered),
tree_model_sort);
- tree_model_sort->child_flags = gtk_tree_model_get_flags (child_model);
+ priv->child_flags = gtk_tree_model_get_flags (child_model);
n_columns = gtk_tree_model_get_n_columns (child_model);
types = g_new (GType, n_columns);
for (i = 0; i < n_columns; i++)
types[i] = gtk_tree_model_get_column_type (child_model, i);
- tree_model_sort->sort_list = _gtk_tree_data_list_header_new (n_columns, types);
+ priv->sort_list = _gtk_tree_data_list_header_new (n_columns, types);
g_free (types);
- tree_model_sort->default_sort_func = NO_SORT_FUNC;
- tree_model_sort->stamp = g_random_int ();
+ priv->default_sort_func = NO_SORT_FUNC;
+ priv->stamp = g_random_int ();
}
}
*
* Returns the model the #GtkTreeModelSort is sorting.
*
- * Return value: the "child model" being sorted
+ * Return value: (transfer none): the "child model" being sorted
**/
GtkTreeModel *
-gtk_tree_model_sort_get_model (GtkTreeModelSort *tree_model)
+gtk_tree_model_sort_get_model (GtkTreeModelSort *tree_model)
{
g_return_val_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model), NULL);
- return tree_model->child_model;
+ return tree_model->priv->child_model;
}
GtkTreePath *child_path,
gboolean build_levels)
{
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
gint *child_indices;
GtkTreePath *retval;
SortLevel *level;
gint i;
- g_return_val_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model_sort), NULL);
- g_return_val_if_fail (tree_model_sort->child_model != NULL, NULL);
+ g_return_val_if_fail (priv->child_model != NULL, NULL);
g_return_val_if_fail (child_path != NULL, NULL);
retval = gtk_tree_path_new ();
child_indices = gtk_tree_path_get_indices (child_path);
- if (tree_model_sort->root == NULL && build_levels)
- gtk_tree_model_sort_build_level (tree_model_sort, NULL, NULL);
- level = SORT_LEVEL (tree_model_sort->root);
+ if (priv->root == NULL && build_levels)
+ gtk_tree_model_sort_build_level (tree_model_sort, NULL, -1);
+ level = SORT_LEVEL (priv->root);
for (i = 0; i < gtk_tree_path_get_depth (child_path); i++)
{
gtk_tree_path_append_index (retval, j);
if (g_array_index (level->array, SortElt, j).children == NULL && build_levels)
{
- gtk_tree_model_sort_build_level (tree_model_sort, level, &g_array_index (level->array, SortElt, j));
+ gtk_tree_model_sort_build_level (tree_model_sort, level, j);
}
level = g_array_index (level->array, SortElt, j).children;
found_child = TRUE;
GtkTreePath *child_path)
{
g_return_val_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model_sort), NULL);
- g_return_val_if_fail (tree_model_sort->child_model != NULL, NULL);
+ g_return_val_if_fail (tree_model_sort->priv->child_model != NULL, NULL);
g_return_val_if_fail (child_path != NULL, NULL);
return gtk_real_tree_model_sort_convert_child_path_to_path (tree_model_sort, child_path, TRUE);
/**
* gtk_tree_model_sort_convert_child_iter_to_iter:
* @tree_model_sort: A #GtkTreeModelSort
- * @sort_iter: An uninitialized #GtkTreeIter.
+ * @sort_iter: (out): An uninitialized #GtkTreeIter.
* @child_iter: A valid #GtkTreeIter pointing to a row on the child model
*
* Sets @sort_iter to point to the row in @tree_model_sort that corresponds to
- * the row pointed at by @child_iter.
+ * the row pointed at by @child_iter. If @sort_iter was not set, %FALSE
+ * is returned. Note: a boolean is only returned since 2.14.
+ *
+ * Return value: %TRUE, if @sort_iter was set, i.e. if @sort_iter is a
+ * valid iterator pointer to a visible row in the child model.
**/
-void
+gboolean
gtk_tree_model_sort_convert_child_iter_to_iter (GtkTreeModelSort *tree_model_sort,
GtkTreeIter *sort_iter,
GtkTreeIter *child_iter)
{
+ gboolean ret;
GtkTreePath *child_path, *path;
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
- g_return_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model_sort));
- g_return_if_fail (tree_model_sort->child_model != NULL);
- g_return_if_fail (sort_iter != NULL);
- g_return_if_fail (child_iter != NULL);
+ g_return_val_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model_sort), FALSE);
+ g_return_val_if_fail (priv->child_model != NULL, FALSE);
+ g_return_val_if_fail (sort_iter != NULL, FALSE);
+ g_return_val_if_fail (child_iter != NULL, FALSE);
+ g_return_val_if_fail (sort_iter != child_iter, FALSE);
sort_iter->stamp = 0;
- child_path = gtk_tree_model_get_path (tree_model_sort->child_model, child_iter);
- g_return_if_fail (child_path != NULL);
+ child_path = gtk_tree_model_get_path (priv->child_model, child_iter);
+ g_return_val_if_fail (child_path != NULL, FALSE);
path = gtk_tree_model_sort_convert_child_path_to_path (tree_model_sort, child_path);
gtk_tree_path_free (child_path);
- g_return_if_fail (path != NULL);
- gtk_tree_model_get_iter (GTK_TREE_MODEL (tree_model_sort), sort_iter, path);
+ if (!path)
+ {
+ g_warning ("%s: The conversion of the child path to a GtkTreeModel sort path failed", G_STRLOC);
+ return FALSE;
+ }
+
+ ret = gtk_tree_model_get_iter (GTK_TREE_MODEL (tree_model_sort),
+ sort_iter, path);
gtk_tree_path_free (path);
+
+ return ret;
}
/**
gtk_tree_model_sort_convert_path_to_child_path (GtkTreeModelSort *tree_model_sort,
GtkTreePath *sorted_path)
{
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
gint *sorted_indices;
GtkTreePath *retval;
SortLevel *level;
gint i;
g_return_val_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model_sort), NULL);
- g_return_val_if_fail (tree_model_sort->child_model != NULL, NULL);
+ g_return_val_if_fail (priv->child_model != NULL, NULL);
g_return_val_if_fail (sorted_path != NULL, NULL);
retval = gtk_tree_path_new ();
sorted_indices = gtk_tree_path_get_indices (sorted_path);
- if (tree_model_sort->root == NULL)
- gtk_tree_model_sort_build_level (tree_model_sort, NULL, NULL);
- level = SORT_LEVEL (tree_model_sort->root);
+ if (priv->root == NULL)
+ gtk_tree_model_sort_build_level (tree_model_sort, NULL, -1);
+ level = SORT_LEVEL (priv->root);
for (i = 0; i < gtk_tree_path_get_depth (sorted_path); i++)
{
}
if (g_array_index (level->array, SortElt, count).children == NULL)
- gtk_tree_model_sort_build_level (tree_model_sort, level, &g_array_index (level->array, SortElt, count));
+ gtk_tree_model_sort_build_level (tree_model_sort, level, count);
if (level == NULL)
{
/**
* gtk_tree_model_sort_convert_iter_to_child_iter:
* @tree_model_sort: A #GtkTreeModelSort
- * @child_iter: An uninitialized #GtkTreeIter
+ * @child_iter: (out): An uninitialized #GtkTreeIter
* @sorted_iter: A valid #GtkTreeIter pointing to a row on @tree_model_sort.
*
* Sets @child_iter to point to the row pointed to by @sorted_iter.
GtkTreeIter *child_iter,
GtkTreeIter *sorted_iter)
{
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
g_return_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model_sort));
- g_return_if_fail (tree_model_sort->child_model != NULL);
+ g_return_if_fail (priv->child_model != NULL);
g_return_if_fail (child_iter != NULL);
- g_return_if_fail (sorted_iter != NULL);
- g_return_if_fail (sorted_iter->stamp == tree_model_sort->stamp);
+ g_return_if_fail (VALID_ITER (sorted_iter, tree_model_sort));
+ g_return_if_fail (sorted_iter != child_iter);
if (GTK_TREE_MODEL_SORT_CACHE_CHILD_ITERS (tree_model_sort))
{
path = gtk_tree_model_sort_elt_get_path (sorted_iter->user_data,
sorted_iter->user_data2);
- gtk_tree_model_get_iter (tree_model_sort->child_model, child_iter, path);
+ gtk_tree_model_get_iter (priv->child_model, child_iter, path);
gtk_tree_path_free (path);
}
}
static void
gtk_tree_model_sort_build_level (GtkTreeModelSort *tree_model_sort,
SortLevel *parent_level,
- SortElt *parent_elt)
+ gint parent_elt_index)
{
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
GtkTreeIter iter;
+ SortElt *parent_elt = NULL;
SortLevel *new_level;
gint length = 0;
gint i;
- g_assert (tree_model_sort->child_model != NULL);
+ g_assert (priv->child_model != NULL);
if (parent_level == NULL)
{
- if (gtk_tree_model_get_iter_first (tree_model_sort->child_model, &iter) == FALSE)
+ if (gtk_tree_model_get_iter_first (priv->child_model, &iter) == FALSE)
return;
- length = gtk_tree_model_iter_n_children (tree_model_sort->child_model, NULL);
+ length = gtk_tree_model_iter_n_children (priv->child_model, NULL);
}
else
{
GtkTreeIter parent_iter;
GtkTreeIter child_parent_iter;
- parent_iter.stamp = tree_model_sort->stamp;
+ parent_elt = &g_array_index (parent_level->array, SortElt, parent_elt_index);
+
+ parent_iter.stamp = priv->stamp;
parent_iter.user_data = parent_level;
parent_iter.user_data2 = parent_elt;
gtk_tree_model_sort_convert_iter_to_child_iter (tree_model_sort,
&child_parent_iter,
&parent_iter);
- if (gtk_tree_model_iter_children (tree_model_sort->child_model,
+ if (gtk_tree_model_iter_children (priv->child_model,
&iter,
&child_parent_iter) == FALSE)
return;
&child_parent_iter,
&parent_iter);
- length = gtk_tree_model_iter_n_children (tree_model_sort->child_model, &child_parent_iter);
+ length = gtk_tree_model_iter_n_children (priv->child_model, &child_parent_iter);
}
g_return_if_fail (length > 0);
new_level = g_new (SortLevel, 1);
new_level->array = g_array_sized_new (FALSE, FALSE, sizeof (SortElt), length);
new_level->ref_count = 0;
- new_level->parent_elt = parent_elt;
new_level->parent_level = parent_level;
+ new_level->parent_elt_index = parent_elt_index;
- if (parent_elt)
+ if (parent_elt_index >= 0)
parent_elt->children = new_level;
else
- tree_model_sort->root = new_level;
+ priv->root = new_level;
/* increase the count of zero ref_counts.*/
while (parent_level)
{
- parent_elt->zero_ref_count++;
+ g_array_index (parent_level->array, SortElt, parent_elt_index).zero_ref_count++;
- parent_elt = parent_level->parent_elt;
+ parent_elt_index = parent_level->parent_elt_index;
parent_level = parent_level->parent_level;
}
- if (new_level != tree_model_sort->root)
- tree_model_sort->zero_ref_count++;
+
+ if (new_level != priv->root)
+ priv->zero_ref_count++;
for (i = 0; i < length; i++)
{
if (GTK_TREE_MODEL_SORT_CACHE_CHILD_ITERS (tree_model_sort))
{
sort_elt.iter = iter;
- if (gtk_tree_model_iter_next (tree_model_sort->child_model, &iter) == FALSE &&
+ if (gtk_tree_model_iter_next (priv->child_model, &iter) == FALSE &&
i < length - 1)
{
- g_warning ("There is a discrepancy between the sort model and the child model.");
+ if (parent_level)
+ {
+ GtkTreePath *level;
+ gchar *str;
+
+ level = gtk_tree_model_sort_elt_get_path (parent_level,
+ parent_elt);
+ str = gtk_tree_path_to_string (level);
+ gtk_tree_path_free (level);
+
+ g_warning ("%s: There is a discrepancy between the sort model "
+ "and the child model. The child model is "
+ "advertising a wrong length for level %s:.",
+ G_STRLOC, str);
+ g_free (str);
+ }
+ else
+ {
+ g_warning ("%s: There is a discrepancy between the sort model "
+ "and the child model. The child model is "
+ "advertising a wrong length for the root level.",
+ G_STRLOC);
+ }
+
return;
}
}
gtk_tree_model_sort_free_level (GtkTreeModelSort *tree_model_sort,
SortLevel *sort_level)
{
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
gint i;
g_assert (sort_level);
+ for (i = 0; i < sort_level->array->len; i++)
+ {
+ if (g_array_index (sort_level->array, SortElt, i).children)
+ gtk_tree_model_sort_free_level (tree_model_sort,
+ SORT_LEVEL (g_array_index (sort_level->array, SortElt, i).children));
+ }
+
if (sort_level->ref_count == 0)
{
SortLevel *parent_level = sort_level->parent_level;
- SortElt *parent_elt = sort_level->parent_elt;
+ gint parent_elt_index = sort_level->parent_elt_index;
- do
- {
- if (parent_elt)
- parent_elt->zero_ref_count--;
- else
- tree_model_sort->zero_ref_count--;
+ while (parent_level)
+ {
+ g_array_index (parent_level->array, SortElt, parent_elt_index).zero_ref_count--;
- if (parent_level)
- {
- parent_elt = parent_level->parent_elt;
- parent_level = parent_level->parent_level;
- }
+ parent_elt_index = parent_level->parent_elt_index;
+ parent_level = parent_level->parent_level;
}
- while (parent_level);
- }
- for (i = 0; i < sort_level->array->len; i++)
- {
- if (g_array_index (sort_level->array, SortElt, i).children)
- gtk_tree_model_sort_free_level (tree_model_sort,
- SORT_LEVEL(g_array_index (sort_level->array, SortElt, i).children));
+ if (sort_level != priv->root)
+ priv->zero_ref_count--;
}
- if (sort_level->parent_elt)
- sort_level->parent_elt->children = NULL;
+ if (sort_level->parent_elt_index >= 0)
+ SORT_LEVEL_PARENT_ELT (sort_level)->children = NULL;
else
- tree_model_sort->root = NULL;
+ priv->root = NULL;
g_array_free (sort_level->array, TRUE);
sort_level->array = NULL;
static void
gtk_tree_model_sort_increment_stamp (GtkTreeModelSort *tree_model_sort)
{
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
+
do
{
- tree_model_sort->stamp++;
+ priv->stamp++;
}
- while (tree_model_sort->stamp == 0);
+ while (priv->stamp == 0);
gtk_tree_model_sort_clear_cache (tree_model_sort);
}
gtk_tree_model_sort_clear_cache_helper (tree_model_sort, g_array_index (level->array, SortElt, i).children);
}
- if (level->ref_count == 0 && level != tree_model_sort->root)
+ if (level->ref_count == 0 && level != tree_model_sort->priv->root)
gtk_tree_model_sort_free_level (tree_model_sort, level);
}
void
gtk_tree_model_sort_reset_default_sort_func (GtkTreeModelSort *tree_model_sort)
{
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
+
g_return_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model_sort));
- if (tree_model_sort->default_sort_destroy)
+ if (priv->default_sort_destroy)
{
- GtkDestroyNotify d = tree_model_sort->default_sort_destroy;
+ GDestroyNotify d = priv->default_sort_destroy;
- tree_model_sort->default_sort_destroy = NULL;
- d (tree_model_sort->default_sort_data);
+ priv->default_sort_destroy = NULL;
+ d (priv->default_sort_data);
}
- tree_model_sort->default_sort_func = NO_SORT_FUNC;
- tree_model_sort->default_sort_data = NULL;
- tree_model_sort->default_sort_destroy = NULL;
+ priv->default_sort_func = NO_SORT_FUNC;
+ priv->default_sort_data = NULL;
+ priv->default_sort_destroy = NULL;
- if (tree_model_sort->sort_column_id == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID)
+ if (priv->sort_column_id == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID)
gtk_tree_model_sort_sort (tree_model_sort);
- tree_model_sort->sort_column_id = GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID;
+ priv->sort_column_id = GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID;
}
/**
{
g_return_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model_sort));
- if (tree_model_sort->zero_ref_count)
- gtk_tree_model_sort_clear_cache_helper (tree_model_sort, (SortLevel *)tree_model_sort->root);
+ if (tree_model_sort->priv->zero_ref_count > 0)
+ gtk_tree_model_sort_clear_cache_helper (tree_model_sort, (SortLevel *)tree_model_sort->priv->root);
}
static gboolean
return FALSE;
return gtk_tree_model_sort_iter_is_valid_helper (iter,
- tree_model_sort->root);
+ tree_model_sort->priv->root);
}
-
-#define __GTK_TREE_MODEL_SORT_C__
-#include "gtkaliasdef.c"