summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
authorJonathan Blandford <jrb@redhat.com>2000-11-11 00:02:05 +0000
committerJonathan Blandford <jrb@src.gnome.org>2000-11-11 00:02:05 +0000
commit48a1ddbeb1ad233b6a7753cebad3a67a1c3039e3 (patch)
tree9523526d72211548be6da95eb8c7611ce251606b /gtk
parent87899845766556379239271c2ab294a49376b541 (diff)
downloadgtk+-48a1ddbeb1ad233b6a7753cebad3a67a1c3039e3.tar.gz
New function to help handle keeping things in sync.
Fri Nov 10 19:06:41 2000 Jonathan Blandford <jrb@redhat.com> * gtk/gtktreemodelsort.c (gtk_tree_model_sort_insert_value): New function to help handle keeping things in sync.
Diffstat (limited to 'gtk')
-rw-r--r--gtk/gtktreemodelsort.c109
-rw-r--r--gtk/gtktreemodelsort.h4
2 files changed, 74 insertions, 39 deletions
diff --git a/gtk/gtktreemodelsort.c b/gtk/gtktreemodelsort.c
index bbfbd5e1ca..010cce89fa 100644
--- a/gtk/gtktreemodelsort.c
+++ b/gtk/gtktreemodelsort.c
@@ -229,7 +229,7 @@ gtk_tree_model_sort_new (void)
GtkTreeModel *
gtk_tree_model_sort_new_with_model (GtkTreeModel *model,
- GValueCompareFunc *func,
+ GValueCompareFunc func,
gint sort_col)
{
GtkTreeModel *retval;
@@ -407,29 +407,49 @@ gtk_tree_model_sort_changed (GtkTreeModel *s_model,
gtk_tree_path_free (s_path);
}
-#if 0
static void
gtk_tree_model_sort_insert_value (GtkTreeModelSort *sort,
- GtkTreeIter *old_iter,
- GtkTreePath *path)
+ GtkTreePath *s_path,
+ GtkTreeIter *s_iter)
{
- GtkTreePath *parent_path;
+ GtkTreePath *tmp_path;
GArray *array;
GtkTreeIter iter;
- SortElt new_elt;
+ SortElt elt;
SortElt *tmp_elt;
gint high, low, middle;
- GValueCompareFunc *func;
+ GValueCompareFunc func;
+ GValue s_value = {0, };
GValue tmp_value = {0, };
- GValue old_value = {0, };
- parent_path = gtk_tree_path_copy (path);
- gtk_tree_path_up (parent_path);
- gtk_tree_model_get_iter (GTK_TREE_MODEL (sort),
- &iter,
- parent_path);
- gtk_tree_path_free (parent_path);
- array = ((SortElt *) iter.tree_node)->children;
+ elt.iter = *s_iter;
+ elt.ref = 0;
+ elt.children = NULL;
+
+ tmp_path = gtk_tree_path_copy (s_path);
+ if (gtk_tree_path_up (tmp_path))
+ {
+ GtkTreePath *parent_path;
+
+ parent_path = gtk_tree_model_sort_convert_path (sort, tmp_path);
+ gtk_tree_model_get_iter (GTK_TREE_MODEL (sort), &iter, parent_path);
+ elt.parent = ((SortElt *) iter.tree_node);
+ array = ((SortElt *) iter.tree_node)->children;
+ if (array == NULL)
+ {
+ ((SortElt *) iter.tree_node)->children = g_array_sized_new (FALSE, FALSE, sizeof (SortElt), 1);
+ array = ((SortElt *) iter.tree_node)->children;
+ }
+ gtk_tree_path_free (parent_path);
+ }
+ else
+ {
+ if (sort->root == NULL)
+ sort->root = g_array_sized_new (FALSE, FALSE, sizeof (SortElt), 1);
+ array = sort->root;
+ elt.parent = NULL;
+ }
+ gtk_tree_path_free (tmp_path);
if (sort->func)
func = sort->func;
@@ -444,38 +464,44 @@ gtk_tree_model_sort_insert_value (GtkTreeModelSort *sort,
func = &g_value_int_compare_func;
break;
default:
- g_warning ("No comparison function for row %d\n", sort->sort_col);
+ g_warning ("No comparison function for row %d (Type %s)\n",
+ sort->sort_col,
+ g_type_name (gtk_tree_model_get_column_type (sort->model, sort->sort_col)));
return;
}
}
- new_elt.iter = iter;
- new_elt.ref = 0;
- new_elt.parent = ((SortElt *) iter.tree_node);
- new_elt.children = NULL;
+ gtk_tree_model_get_value (sort->model, s_iter, sort->sort_col, &s_value);
low = 0;
high = array->len;
middle = (low + high)/2;
/* Insert the value into the array */
- while (1)
+ while (low != high)
{
gint cmp;
- tmp_elt = &(g_array_index (array, SortElt,middle));
- gtk_tree_model_get_value (sort->model, tmp_elt, sort->sort_col, &tmp_value);
-
- cmp = ((func) (&tmp_value, value));
- if (retval < 0)
- ;
- else if (retval == 0)
- g_array_insert_vals
- ;
- else if (retval > 0)
- ;
+ tmp_elt = &(g_array_index (array, SortElt, middle));
+ gtk_tree_model_get_value (sort->model,
+ (GtkTreeIter *) tmp_elt,
+ sort->sort_col,
+ &tmp_value);
+
+ cmp = ((func) (&tmp_value, &s_value));
+ g_value_unset (&tmp_value);
+
+ if (cmp < 0)
+ high = middle;
+ else if (cmp > 0)
+ low = middle;
+ else if (cmp == 0)
+ break;
+ middle = (low + high)/2;
}
+
+ g_array_insert_vals (array, middle, &elt, 1);
+ g_value_unset (&s_value);
}
-#endif
static void
gtk_tree_model_sort_inserted (GtkTreeModel *s_model,
@@ -489,19 +515,28 @@ gtk_tree_model_sort_inserted (GtkTreeModel *s_model,
g_return_if_fail (s_path != NULL || s_iter != NULL);
+ if (s_path == NULL)
+ s_path = gtk_tree_model_get_path (s_model, s_iter);
+
if (!(tree_model_sort->flags & GTK_TREE_MODEL_ITERS_PERSIST))
{
- gtk_tree_model_sort_free_level ((GArray *)tree_model_sort->root);
+ gtk_tree_model_sort_free_level ((GArray *) tree_model_sort->root);
tree_model_sort->root = NULL;
}
else
{
- }
+ GtkTreeIter real_s_iter;
- if (s_path == NULL)
- s_path = gtk_tree_model_get_path (s_model, s_iter);
+ if (s_iter == NULL)
+ gtk_tree_model_get_iter (s_model, &real_s_iter, s_path);
+ else
+ real_s_iter = *s_iter;
+
+ gtk_tree_model_sort_insert_value (tree_model_sort, s_path, &real_s_iter);
+ }
path = gtk_tree_model_sort_convert_path (tree_model_sort, s_path);
+
gtk_tree_model_get_iter (GTK_TREE_MODEL (data), &iter, path);
gtk_signal_emit_by_name (GTK_OBJECT (data), "inserted", path, iter);
gtk_tree_path_free (path);
diff --git a/gtk/gtktreemodelsort.h b/gtk/gtktreemodelsort.h
index 01366e6cb7..65935e41f4 100644
--- a/gtk/gtktreemodelsort.h
+++ b/gtk/gtktreemodelsort.h
@@ -48,7 +48,7 @@ struct _GtkTreeModelSort
guint flags;
GtkTreeModel *model;
gint sort_col;
- GValueCompareFunc *func;
+ GValueCompareFunc func;
};
struct _GtkTreeModelSortClass
@@ -74,7 +74,7 @@ struct _GtkTreeModelSortClass
GtkType gtk_tree_model_sort_get_type (void);
GtkTreeModel *gtk_tree_model_sort_new (void);
GtkTreeModel *gtk_tree_model_sort_new_with_model (GtkTreeModel *model,
- GValueCompareFunc *func,
+ GValueCompareFunc func,
gint sort_col);
void gtk_tree_model_sort_set_model (GtkTreeModelSort *tree_model_sort,
GtkTreeModel *model);