summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Blandford <jrb@src.gnome.org>2000-12-20 00:37:58 +0000
committerJonathan Blandford <jrb@src.gnome.org>2000-12-20 00:37:58 +0000
commitfb14db07bdfb7b0181757c4a0fa33072afc363e7 (patch)
tree00024cbaff2f8383f9cf133f99a8c72434191cce
parent00a6a1b219cab25dd06e812aea9c8d473fbb0134 (diff)
downloadgtk+-fb14db07bdfb7b0181757c4a0fa33072afc363e7.tar.gz
sync
-rw-r--r--gtk/gtktreemodelsort.c160
1 files changed, 103 insertions, 57 deletions
diff --git a/gtk/gtktreemodelsort.c b/gtk/gtktreemodelsort.c
index 66d1221241..1972c628cc 100644
--- a/gtk/gtktreemodelsort.c
+++ b/gtk/gtktreemodelsort.c
@@ -113,6 +113,10 @@ static void gtk_tree_model_sort_unref_iter (GtkTreeModel *
GtkTreeIter *iter);
/* Internal functions */
+static gint gtk_tree_model_sort_array_find_insert (GtkTreeModelSort *tree_model_sort,
+ GArray *array,
+ GtkTreeIter *iter,
+ gboolean skip_sort_elt);
static GtkTreePath *gtk_tree_model_sort_convert_path_real (GtkTreeModelSort *tree_model_sort,
GtkTreePath *child_path,
gboolean build_children);
@@ -360,7 +364,10 @@ gtk_tree_model_sort_changed (GtkTreeModel *s_model,
GtkTreeModelSort *tree_model_sort = GTK_TREE_MODEL_SORT (data);
GtkTreePath *path;
GtkTreeIter iter;
+ SortElt *elt;
+ GArray *array;
gboolean free_s_path = FALSE;
+ gint index;
g_return_if_fail (s_path != NULL || s_iter != NULL);
@@ -377,7 +384,22 @@ gtk_tree_model_sort_changed (GtkTreeModel *s_model,
gtk_tree_path_free (s_path);
return;
}
+
gtk_tree_model_get_iter (GTK_TREE_MODEL (data), &iter, path);
+ elt = (SortElt *) iter.tree_node;
+ array = get_array (elt, tree_model_sort);
+
+ /* FIXME: as an optimization for when the column other then the one we're
+ * sorting is changed, we can check the prev and next element to see if
+ * they're different.
+ */
+
+ /* Now we need to resort things. */
+ index = gtk_tree_model_sort_array_find_insert (tree_model_sort,
+ array,
+ (GtkTreeIter *) elt,
+ TRUE);
+ g_print ("index is %d\n", index);
gtk_signal_emit_by_name (GTK_OBJECT (data), "changed", path, &iter);
gtk_tree_path_free (path);
@@ -393,15 +415,15 @@ gtk_tree_model_sort_insert_value (GtkTreeModelSort *sort,
{
GtkTreePath *tmp_path;
GArray *array;
+ gint index;
GtkTreeIter iter;
SortElt elt;
- SortElt *tmp_elt;
gint offset;
gint middle, j;
GValueCompareFunc func;
GValue s_value = {0, };
GValue tmp_value = {0, };
-
+ SortElt *tmp_elt;
offset = gtk_tree_path_get_indices (s_path)[gtk_tree_path_get_depth (s_path) - 1];
elt.iter = *s_iter;
@@ -440,61 +462,9 @@ gtk_tree_model_sort_insert_value (GtkTreeModelSort *sort,
}
gtk_tree_path_free (tmp_path);
- func = (GValueCompareFunc) gtk_tree_model_sort_get_func (sort);
-
- g_return_val_if_fail (func != NULL, FALSE);
-
- gtk_tree_model_get_value (sort->child_model, s_iter, sort->sort_col, &s_value);
-
-#if 0
- /* FIXME: we can, as we are an array, do binary search to find the correct
- * location to insert the element. However, I'd rather get it working. The
- * below is quite wrong, but a step in the right direction.
- */
- low = 0;
- high = array->len;
- middle = (low + high)/2;
-
- /* Insert the value into the array */
- while (low != high)
- {
- gint cmp;
- tmp_elt = &(g_array_index (array, SortElt, middle));
- gtk_tree_model_get_value (sort->child_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;
- }
-#endif
- for (middle = 0; middle < array->len; middle++)
- {
- gint cmp;
-
- tmp_elt = &(g_array_index (array, SortElt, middle));
- gtk_tree_model_get_value (sort->child_model,
- (GtkTreeIter *) tmp_elt,
- sort->sort_col,
- &tmp_value);
-
- cmp = ((func) (&s_value, &tmp_value));
- g_value_unset (&tmp_value);
-
- if (cmp >= 0)
- break;
- }
+ index = gtk_tree_model_sort_array_find_insert (sort, array, (GtkTreeIter *) &elt, FALSE);
- g_array_insert_vals (array, middle, &elt, 1);
+ g_array_insert_vals (array, index, &elt, 1);
g_value_unset (&s_value);
@@ -503,7 +473,7 @@ gtk_tree_model_sort_insert_value (GtkTreeModelSort *sort,
for (j = 0; j < array->len; j++, tmp_elt++)
{
if ((tmp_elt->offset >= offset) &&
- j != middle)
+ j != index)
tmp_elt->offset ++;
}
@@ -913,6 +883,47 @@ gtk_tree_model_sort_unref_iter (GtkTreeModel *tree_model,
}
/* Internal functions */
+
+static gint
+gtk_tree_model_sort_array_find_insert (GtkTreeModelSort *tree_model_sort,
+ GArray *array,
+ GtkTreeIter *iter,
+ gboolean skip_sort_elt)
+{
+ gint middle;
+ gint cmp;
+ GValueCompareFunc func;
+ GValue value = {0, };
+ GValue tmp_value = {0, };
+ SortElt *tmp_elt;
+
+ func = (GValueCompareFunc) gtk_tree_model_sort_get_func (tree_model_sort);
+
+ g_return_val_if_fail (func != NULL, 0);
+
+ gtk_tree_model_get_value (tree_model_sort->child_model, iter, tree_model_sort->sort_col, &value);
+
+ for (middle = 0; middle < array->len; middle++)
+ {
+ tmp_elt = &(g_array_index (array, SortElt, middle));
+ if (!skip_sort_elt &&
+ (SortElt *) iter == tmp_elt)
+ continue;
+ gtk_tree_model_get_value (tree_model_sort->child_model,
+ (GtkTreeIter *) tmp_elt,
+ tree_model_sort->sort_col,
+ &tmp_value);
+
+ cmp = ((func) (&value, &tmp_value));
+ g_value_unset (&tmp_value);
+
+ if (cmp >= 0)
+ break;
+ }
+ return middle;
+}
+
+
static GtkTreePath *
gtk_tree_model_sort_convert_path_real (GtkTreeModelSort *tree_model_sort,
GtkTreePath *child_path,
@@ -1131,3 +1142,38 @@ g_value_int_compare_func (const GValue *a,
{
return g_value_get_int (a) < g_value_get_int (b);
}
+
+
+/* DEAD CODE */
+
+#if 0
+ /* FIXME: we can, as we are an array, do binary search to find the correct
+ * location to insert the element. However, I'd rather get it working. The
+ * below is quite wrong, but a step in the right direction.
+ */
+ low = 0;
+ high = array->len;
+ middle = (low + high)/2;
+
+ /* Insert the value into the array */
+ while (low != high)
+ {
+ gint cmp;
+ tmp_elt = &(g_array_index (array, SortElt, middle));
+ gtk_tree_model_get_value (sort->child_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;
+ }
+#endif