summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
Diffstat (limited to 'gtk')
-rw-r--r--gtk/gtkliststore.c45
-rw-r--r--gtk/gtkmarshal.list10
-rw-r--r--gtk/gtkmarshalers.list10
-rw-r--r--gtk/gtkmodelsimple.c103
-rw-r--r--gtk/gtktreemodelsort.c179
-rw-r--r--gtk/gtktreestore.c48
-rw-r--r--gtk/gtktreestore.h2
-rw-r--r--gtk/treestoretest.c2
8 files changed, 244 insertions, 155 deletions
diff --git a/gtk/gtkliststore.c b/gtk/gtkliststore.c
index c50974b4e3..fb23aadfb4 100644
--- a/gtk/gtkliststore.c
+++ b/gtk/gtkliststore.c
@@ -40,6 +40,8 @@ static void gtk_list_store_class_init (GtkListStoreClass *class);
static void gtk_list_store_tree_model_init (GtkTreeModelIface *iface);
static guint gtk_list_store_get_flags (GtkTreeModel *tree_model);
static gint gtk_list_store_get_n_columns (GtkTreeModel *tree_model);
+static GType gtk_list_store_get_column_type (GtkTreeModel *tree_model,
+ gint index);
static gboolean gtk_list_store_get_iter (GtkTreeModel *tree_model,
GtkTreeIter *iter,
GtkTreePath *path);
@@ -115,36 +117,36 @@ gtk_list_store_class_init (GtkListStoreClass *class)
GTK_RUN_FIRST,
GTK_CLASS_TYPE (object_class),
GTK_SIGNAL_OFFSET (GtkListStoreClass, changed),
- gtk_marshal_VOID__POINTER_POINTER,
- GTK_TYPE_NONE, 2,
- GTK_TYPE_POINTER,
- GTK_TYPE_POINTER);
+ gtk_marshal_VOID__BOXED_BOXED,
+ G_TYPE_NONE, 2,
+ GTK_TYPE_TREE_PATH,
+ GTK_TYPE_TREE_ITER);
list_store_signals[INSERTED] =
gtk_signal_new ("inserted",
GTK_RUN_FIRST,
GTK_CLASS_TYPE (object_class),
GTK_SIGNAL_OFFSET (GtkListStoreClass, inserted),
- gtk_marshal_VOID__POINTER_POINTER,
- GTK_TYPE_NONE, 2,
- GTK_TYPE_POINTER,
- GTK_TYPE_POINTER);
+ gtk_marshal_VOID__BOXED_BOXED,
+ G_TYPE_NONE, 2,
+ GTK_TYPE_TREE_PATH,
+ GTK_TYPE_TREE_ITER);
list_store_signals[CHILD_TOGGLED] =
gtk_signal_new ("child_toggled",
GTK_RUN_FIRST,
GTK_CLASS_TYPE (object_class),
GTK_SIGNAL_OFFSET (GtkListStoreClass, child_toggled),
- gtk_marshal_VOID__POINTER_POINTER,
- GTK_TYPE_NONE, 2,
- GTK_TYPE_POINTER,
- GTK_TYPE_POINTER);
+ gtk_marshal_VOID__BOXED_BOXED,
+ G_TYPE_NONE, 2,
+ GTK_TYPE_TREE_PATH,
+ GTK_TYPE_TREE_ITER);
list_store_signals[DELETED] =
gtk_signal_new ("deleted",
GTK_RUN_FIRST,
GTK_CLASS_TYPE (object_class),
GTK_SIGNAL_OFFSET (GtkListStoreClass, deleted),
- gtk_marshal_VOID__POINTER,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_POINTER);
+ gtk_marshal_VOID__BOXED,
+ G_TYPE_NONE, 1,
+ GTK_TYPE_TREE_PATH);
gtk_object_class_add_signals (object_class, list_store_signals, LAST_SIGNAL);
@@ -155,6 +157,7 @@ gtk_list_store_tree_model_init (GtkTreeModelIface *iface)
{
iface->get_flags = gtk_list_store_get_flags;
iface->get_n_columns = gtk_list_store_get_n_columns;
+ iface->get_column_type = gtk_list_store_get_column_type;
iface->get_iter = gtk_list_store_get_iter;
iface->get_path = gtk_list_store_get_path;
iface->get_value = gtk_list_store_get_value;
@@ -260,6 +263,17 @@ gtk_list_store_get_n_columns (GtkTreeModel *tree_model)
return GTK_LIST_STORE (tree_model)->n_columns;
}
+static GType
+gtk_list_store_get_column_type (GtkTreeModel *tree_model,
+ gint index)
+{
+ g_return_val_if_fail (GTK_IS_LIST_STORE (tree_model), G_TYPE_INVALID);
+ g_return_val_if_fail (index < GTK_LIST_STORE (tree_model)->n_columns &&
+ index >= 0, G_TYPE_INVALID);
+
+ return GTK_LIST_STORE (tree_model)->column_headers[index];
+}
+
static gboolean
gtk_list_store_get_iter (GtkTreeModel *tree_model,
GtkTreeIter *iter,
@@ -643,7 +657,6 @@ gtk_list_store_append (GtkListStore *list_store,
g_return_if_fail (list_store != NULL);
g_return_if_fail (GTK_IS_LIST_STORE (list_store));
g_return_if_fail (iter != NULL);
- g_return_if_fail (G_SLIST (iter)->next == NULL);
iter->stamp = list_store->stamp;
iter->tree_node = g_slist_alloc ();
diff --git a/gtk/gtkmarshal.list b/gtk/gtkmarshal.list
index 5e01c765e4..f011f28b73 100644
--- a/gtk/gtkmarshal.list
+++ b/gtk/gtkmarshal.list
@@ -21,6 +21,9 @@
# NONE deprecated alias for VOID
# BOOL deprecated alias for BOOLEAN
+BOOLEAN:BOXED
+BOOLEAN:BOXED,BOXED
+BOOLEAN:BOXED,BOXED,INT
BOOLEAN:POINTER
BOOLEAN:POINTER,POINTER
BOOLEAN:POINTER,INT,INT
@@ -29,8 +32,10 @@ BOOLEAN:POINTER,POINTER,INT
BOOLEAN:POINTER,POINTER,INT,INT
BOOLEAN:POINTER,STRING,STRING,POINTER
BOOLEAN:VOID
+BOXED:BOXED
ENUM:ENUM
INT:INT
+INT:BOXED
INT:OBJECT,BOXED,BOXED
INT:POINTER
INT:POINTER,CHAR,CHAR
@@ -40,9 +45,11 @@ POINTER:POINTER,INT
POINTER:VOID
VOID:BOOLEAN
VOID:BOXED
-VOID:BOXED,OBJECT
+VOID:BOXED,BOXED
VOID:BOXED,BOXED,BOOLEAN
VOID:BOXED,BOXED,INT,BOOLEAN
+VOID:BOXED,INT,POINTER
+VOID:BOXED,OBJECT
VOID:BOXED,UINT,FLAGS
VOID:ENUM
VOID:ENUM,FLOAT
@@ -63,7 +70,6 @@ VOID:POINTER,BOOLEAN
VOID:POINTER,INT
VOID:POINTER,INT,INT,POINTER,UINT,UINT
VOID:POINTER,INT,POINTER
-VOID:POINTER,POINTER
VOID:POINTER,POINTER,BOOLEAN
VOID:POINTER,POINTER,INT
VOID:POINTER,POINTER,INT,BOOLEAN
diff --git a/gtk/gtkmarshalers.list b/gtk/gtkmarshalers.list
index 5e01c765e4..f011f28b73 100644
--- a/gtk/gtkmarshalers.list
+++ b/gtk/gtkmarshalers.list
@@ -21,6 +21,9 @@
# NONE deprecated alias for VOID
# BOOL deprecated alias for BOOLEAN
+BOOLEAN:BOXED
+BOOLEAN:BOXED,BOXED
+BOOLEAN:BOXED,BOXED,INT
BOOLEAN:POINTER
BOOLEAN:POINTER,POINTER
BOOLEAN:POINTER,INT,INT
@@ -29,8 +32,10 @@ BOOLEAN:POINTER,POINTER,INT
BOOLEAN:POINTER,POINTER,INT,INT
BOOLEAN:POINTER,STRING,STRING,POINTER
BOOLEAN:VOID
+BOXED:BOXED
ENUM:ENUM
INT:INT
+INT:BOXED
INT:OBJECT,BOXED,BOXED
INT:POINTER
INT:POINTER,CHAR,CHAR
@@ -40,9 +45,11 @@ POINTER:POINTER,INT
POINTER:VOID
VOID:BOOLEAN
VOID:BOXED
-VOID:BOXED,OBJECT
+VOID:BOXED,BOXED
VOID:BOXED,BOXED,BOOLEAN
VOID:BOXED,BOXED,INT,BOOLEAN
+VOID:BOXED,INT,POINTER
+VOID:BOXED,OBJECT
VOID:BOXED,UINT,FLAGS
VOID:ENUM
VOID:ENUM,FLOAT
@@ -63,7 +70,6 @@ VOID:POINTER,BOOLEAN
VOID:POINTER,INT
VOID:POINTER,INT,INT,POINTER,UINT,UINT
VOID:POINTER,INT,POINTER
-VOID:POINTER,POINTER
VOID:POINTER,POINTER,BOOLEAN
VOID:POINTER,POINTER,INT
VOID:POINTER,POINTER,INT,BOOLEAN
diff --git a/gtk/gtkmodelsimple.c b/gtk/gtkmodelsimple.c
index ddfc733f77..12da7adfa5 100644
--- a/gtk/gtkmodelsimple.c
+++ b/gtk/gtkmodelsimple.c
@@ -135,36 +135,36 @@ gtk_model_simple_class_init (GtkModelSimpleClass *class)
GTK_RUN_FIRST,
GTK_CLASS_TYPE (object_class),
GTK_SIGNAL_OFFSET (GtkModelSimpleClass, changed),
- gtk_marshal_VOID__POINTER_POINTER,
- GTK_TYPE_NONE, 2,
- GTK_TYPE_POINTER,
- GTK_TYPE_POINTER);
+ gtk_marshal_VOID__BOXED_BOXED,
+ G_TYPE_NONE, 2,
+ GTK_TYPE_TREE_PATH,
+ GTK_TYPE_TREE_ITER);
model_simple_signals[INSERTED] =
gtk_signal_new ("inserted",
GTK_RUN_FIRST,
GTK_CLASS_TYPE (object_class),
GTK_SIGNAL_OFFSET (GtkModelSimpleClass, inserted),
- gtk_marshal_VOID__POINTER_POINTER,
- GTK_TYPE_NONE, 2,
- GTK_TYPE_POINTER,
- GTK_TYPE_POINTER);
+ gtk_marshal_VOID__BOXED_BOXED,
+ G_TYPE_NONE, 2,
+ GTK_TYPE_TREE_PATH,
+ GTK_TYPE_TREE_ITER);
model_simple_signals[CHILD_TOGGLED] =
gtk_signal_new ("child_toggled",
GTK_RUN_FIRST,
GTK_CLASS_TYPE (object_class),
GTK_SIGNAL_OFFSET (GtkModelSimpleClass, child_toggled),
- gtk_marshal_VOID__POINTER_POINTER,
- GTK_TYPE_NONE, 2,
- GTK_TYPE_POINTER,
- GTK_TYPE_POINTER);
+ gtk_marshal_VOID__BOXED_BOXED,
+ G_TYPE_NONE, 2,
+ GTK_TYPE_TREE_PATH,
+ GTK_TYPE_TREE_ITER);
model_simple_signals[DELETED] =
gtk_signal_new ("deleted",
GTK_RUN_FIRST,
GTK_CLASS_TYPE (object_class),
GTK_SIGNAL_OFFSET (GtkModelSimpleClass, deleted),
- gtk_marshal_VOID__POINTER,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_POINTER);
+ gtk_marshal_VOID__BOXED,
+ G_TYPE_NONE, 1,
+ GTK_TYPE_TREE_PATH);
model_simple_signals[GET_N_COLUMNS] =
gtk_signal_new ("get_n_columns",
@@ -172,93 +172,94 @@ gtk_model_simple_class_init (GtkModelSimpleClass *class)
GTK_CLASS_TYPE (object_class),
0,
gtk_marshal_INT__VOID,
- GTK_TYPE_INT, 0);
+ G_TYPE_INT, 0);
model_simple_signals[GET_COLUMN_TYPE] =
gtk_signal_new ("get_column_type",
GTK_RUN_LAST,
GTK_CLASS_TYPE (object_class),
0,
gtk_marshal_INT__INT,
- GTK_TYPE_INT, 1,
- GTK_TYPE_INT);
+ G_TYPE_INT, 1,
+ G_TYPE_INT);
model_simple_signals[GET_ITER] =
gtk_signal_new ("get_iter",
GTK_RUN_LAST,
GTK_CLASS_TYPE (object_class),
0,
- gtk_marshal_BOOLEAN__POINTER_POINTER,
- GTK_TYPE_BOOL, 2,
- GTK_TYPE_POINTER,
- GTK_TYPE_POINTER);
+ gtk_marshal_BOOLEAN__BOXED_BOXED,
+ G_TYPE_BOOLEAN, 2,
+ GTK_TYPE_TREE_ITER,
+ GTK_TYPE_TREE_PATH);
model_simple_signals[GET_PATH] =
gtk_signal_new ("get_path",
GTK_RUN_LAST,
GTK_CLASS_TYPE (object_class),
0,
- gtk_marshal_POINTER__POINTER,
- GTK_TYPE_POINTER, 1,
- GTK_TYPE_POINTER);
+ gtk_marshal_BOXED__BOXED,
+ GTK_TYPE_TREE_PATH, 1,
+ GTK_TYPE_TREE_ITER);
model_simple_signals[GET_VALUE] =
gtk_signal_new ("get_value",
GTK_RUN_LAST,
GTK_CLASS_TYPE (object_class),
0,
- gtk_marshal_VOID__POINTER_INT_POINTER,
- GTK_TYPE_NONE, 3,
- GTK_TYPE_POINTER,
- GTK_TYPE_INT,
- GTK_TYPE_POINTER);
+ gtk_marshal_VOID__BOXED_INT_POINTER,
+ G_TYPE_NONE, 3,
+ GTK_TYPE_TREE_ITER,
+ G_TYPE_INT,
+ G_TYPE_POINTER);
model_simple_signals[ITER_NEXT] =
gtk_signal_new ("iter_next",
GTK_RUN_LAST,
GTK_CLASS_TYPE (object_class),
0,
- gtk_marshal_BOOLEAN__POINTER,
- GTK_TYPE_BOOL, 1,
- GTK_TYPE_POINTER);
+ gtk_marshal_BOOLEAN__BOXED,
+ G_TYPE_BOOLEAN, 1,
+ GTK_TYPE_TREE_ITER);
model_simple_signals[ITER_CHILDREN] =
gtk_signal_new ("iter_children",
GTK_RUN_LAST,
GTK_CLASS_TYPE (object_class),
0,
- gtk_marshal_BOOLEAN__POINTER_POINTER,
- GTK_TYPE_POINTER, 2,
- GTK_TYPE_POINTER,
- GTK_TYPE_POINTER);
+ gtk_marshal_BOOLEAN__BOXED_BOXED,
+ G_TYPE_BOOLEAN, 2,
+ GTK_TYPE_TREE_ITER,
+ GTK_TYPE_TREE_ITER);
model_simple_signals[ITER_HAS_CHILD] =
gtk_signal_new ("iter_has_child",
GTK_RUN_LAST,
GTK_CLASS_TYPE (object_class),
0,
- gtk_marshal_BOOLEAN__POINTER,
- GTK_TYPE_BOOL, 1,
- GTK_TYPE_POINTER);
+ gtk_marshal_BOOLEAN__BOXED,
+ G_TYPE_BOOLEAN, 1,
+ GTK_TYPE_TREE_ITER);
model_simple_signals[ITER_N_CHILDREN] =
gtk_signal_new ("iter_n_children",
GTK_RUN_LAST,
GTK_CLASS_TYPE (object_class),
0,
- gtk_marshal_INT__POINTER,
- GTK_TYPE_INT, 1,
- GTK_TYPE_POINTER);
+ gtk_marshal_INT__BOXED,
+ G_TYPE_INT, 1,
+ GTK_TYPE_TREE_ITER);
model_simple_signals[ITER_NTH_CHILD] =
gtk_signal_new ("node_nth_child",
GTK_RUN_LAST,
GTK_CLASS_TYPE (object_class),
0,
- gtk_marshal_BOOLEAN__POINTER_POINTER_INT,
- GTK_TYPE_BOOL, 2,
- GTK_TYPE_POINTER,
- GTK_TYPE_POINTER);
+ gtk_marshal_BOOLEAN__BOXED_BOXED_INT,
+ GTK_TYPE_BOOL, 3,
+ GTK_TYPE_TREE_ITER,
+ GTK_TYPE_TREE_ITER,
+ G_TYPE_INT);
model_simple_signals[ITER_PARENT] =
gtk_signal_new ("node_parent",
GTK_RUN_LAST,
GTK_CLASS_TYPE (object_class),
0,
- gtk_marshal_BOOLEAN__POINTER_POINTER,
- GTK_TYPE_BOOL, 2,
- GTK_TYPE_POINTER,
- GTK_TYPE_POINTER);
+ gtk_marshal_BOOLEAN__BOXED_BOXED,
+ G_TYPE_BOOLEAN, 2,
+ GTK_TYPE_TREE_ITER,
+ GTK_TYPE_TREE_ITER);
gtk_object_class_add_signals (object_class, model_simple_signals, LAST_SIGNAL);
}
diff --git a/gtk/gtktreemodelsort.c b/gtk/gtktreemodelsort.c
index 608aeb84f6..bbfbd5e1ca 100644
--- a/gtk/gtktreemodelsort.c
+++ b/gtk/gtktreemodelsort.c
@@ -17,8 +17,16 @@
* Boston, MA 02111-1307, USA.
*/
+
+/* NOTE: There is a potential for confusion in this code as to whether an iter,
+ * path or value refers to the GtkTreeModelSort model, or the model being
+ * sorted. As a convention, variables referencing the sorted model will have an
+ * s_ prefix before them (ie. s_iter, s_value, s_path);
+ */
+
#include "gtktreemodelsort.h"
#include "gtksignal.h"
+#include <string.h>
enum {
CHANGED,
@@ -372,27 +380,31 @@ gtk_tree_model_sort_finalize (GObject *object)
}
static void
-gtk_tree_model_sort_changed (GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
+gtk_tree_model_sort_changed (GtkTreeModel *s_model,
+ GtkTreePath *s_path,
+ GtkTreeIter *s_iter,
gpointer data)
{
GtkTreeModelSort *tree_model_sort = GTK_TREE_MODEL_SORT (data);
- GtkTreePath *local_path;
- GtkTreeIter local_iter;
+ GtkTreePath *path;
+ GtkTreeIter iter;
+ gboolean free_s_path = FALSE;
+
+ g_return_if_fail (s_path != NULL || s_iter != NULL);
- g_return_if_fail (path != NULL || iter != NULL);
+ if (s_path == NULL)
+ {
+ free_s_path = TRUE;
+ s_path = gtk_tree_model_get_path (s_model, s_iter);
+ }
- if (path == NULL)
- path = gtk_tree_model_get_path (model, 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), "changed", path, &iter);
- local_path = gtk_tree_model_sort_convert_path (tree_model_sort, path);
- gtk_tree_model_get_iter (GTK_TREE_MODEL (data), &local_iter, local_path);
- gtk_signal_emit_by_name (GTK_OBJECT (data),
- "changed",
- local_path,
- &local_iter);
- gtk_tree_path_free (local_path);
+ gtk_tree_path_free (path);
+ if (free_s_path)
+ gtk_tree_path_free (s_path);
}
#if 0
@@ -442,14 +454,17 @@ gtk_tree_model_sort_insert_value (GtkTreeModelSort *sort,
new_elt.parent = ((SortElt *) iter.tree_node);
new_elt.children = NULL;
- last = 0;
- j = array->len/2;
+ low = 0;
+ high = array->len;
+ middle = (low + high)/2;
+
+ /* Insert the value into the array */
while (1)
{
gint cmp;
- tmp_elt = &(g_array_index (array, SortElt, j));
+ 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)
;
@@ -463,91 +478,123 @@ gtk_tree_model_sort_insert_value (GtkTreeModelSort *sort,
#endif
static void
-gtk_tree_model_sort_inserted (GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
+gtk_tree_model_sort_inserted (GtkTreeModel *s_model,
+ GtkTreePath *s_path,
+ GtkTreeIter *s_iter,
gpointer data)
{
GtkTreeModelSort *tree_model_sort = GTK_TREE_MODEL_SORT (data);
- GtkTreePath *local_path;
- GtkTreeIter local_iter;
- GValue value;
+ GtkTreePath *path;
+ GtkTreeIter iter;
- g_return_if_fail (path != NULL || iter != NULL);
+ g_return_if_fail (s_path != NULL || s_iter != NULL);
- if (!(tree_model_sort->flags & GTK_TREE_MODEL_ITERS_PERSIST) &&
- (tree_model_sort->root != NULL))
+ if (!(tree_model_sort->flags & GTK_TREE_MODEL_ITERS_PERSIST))
{
gtk_tree_model_sort_free_level ((GArray *)tree_model_sort->root);
tree_model_sort->root = NULL;
}
+ else
+ {
+ }
- if (path == NULL)
- path = gtk_tree_model_get_path (model, iter);
+ if (s_path == NULL)
+ s_path = gtk_tree_model_get_path (s_model, s_iter);
- local_path = gtk_tree_model_sort_convert_path (tree_model_sort, path);
- gtk_tree_model_get_iter (GTK_TREE_MODEL (data), &local_iter, local_path);
- gtk_signal_emit_by_name (GTK_OBJECT (data),
- "inserted",
- local_path,
- &local_iter);
- gtk_tree_path_free (local_path);
+ 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);
}
static void
-gtk_tree_model_sort_child_toggled (GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
+gtk_tree_model_sort_child_toggled (GtkTreeModel *s_model,
+ GtkTreePath *s_path,
+ GtkTreeIter *s_iter,
gpointer data)
{
GtkTreeModelSort *tree_model_sort = GTK_TREE_MODEL_SORT (data);
- GtkTreePath *local_path;
- GtkTreeIter local_iter;
+ GtkTreePath *path;
+ GtkTreeIter iter;
+ gboolean free_s_path = FALSE;
- g_return_if_fail (path != NULL || iter != NULL);
+ g_return_if_fail (s_path != NULL || s_iter != NULL);
- if (!(tree_model_sort->flags & GTK_TREE_MODEL_ITERS_PERSIST) &&
- (tree_model_sort->root != NULL))
+ if (!(tree_model_sort->flags & GTK_TREE_MODEL_ITERS_PERSIST))
{
gtk_tree_model_sort_free_level ((GArray *)tree_model_sort->root);
tree_model_sort->root = NULL;
}
- if (path == NULL)
- path = gtk_tree_model_get_path (model, iter);
+ if (s_path == NULL)
+ {
+ s_path = gtk_tree_model_get_path (s_model, s_iter);
+ free_s_path = TRUE;
+ }
- local_path = gtk_tree_model_sort_convert_path (tree_model_sort, path);
- gtk_tree_model_get_iter (GTK_TREE_MODEL (data), &local_iter, local_path);
+ 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),
"child_toggled",
- local_path,
- &local_iter);
- gtk_tree_path_free (local_path);
+ path, &iter);
+ gtk_tree_path_free (path);
+ if (free_s_path)
+ gtk_tree_path_free (s_path);
}
static void
-gtk_tree_model_sort_deleted (GtkTreeModel *model,
- GtkTreePath *path,
+gtk_tree_model_sort_deleted (GtkTreeModel *s_model,
+ GtkTreePath *s_path,
gpointer data)
{
GtkTreeModelSort *tree_model_sort = GTK_TREE_MODEL_SORT (data);
- GtkTreePath *local_path;
+ GtkTreePath *path;
+ g_return_if_fail (s_path != NULL);
+ path = gtk_tree_model_sort_convert_path (tree_model_sort, s_path);
g_return_if_fail (path != NULL);
- if (!(tree_model_sort->flags & GTK_TREE_MODEL_ITERS_PERSIST) &&
- (tree_model_sort->root != NULL))
+ if (!(tree_model_sort->flags & GTK_TREE_MODEL_ITERS_PERSIST))
{
gtk_tree_model_sort_free_level ((GArray *)tree_model_sort->root);
tree_model_sort->root = NULL;
}
- local_path = gtk_tree_model_sort_convert_path (tree_model_sort, path);
- tree_model_sort->stamp++;
- gtk_signal_emit_by_name (GTK_OBJECT (data),
- "deleted",
- local_path);
+ else
+ {
+ GArray *array;
+ GtkTreeIter iter;
+ SortElt *elt;
+ gint offset;
+ gint i;
+
+ gtk_tree_model_get_iter (GTK_TREE_MODEL (tree_model_sort), &iter, path);
+ elt = (SortElt *) iter.tree_node;
+ offset = elt->offset;
+ array = get_array (elt, tree_model_sort);
+ if (array->len == 1)
+ {
+ if (((SortElt *)array->data)->parent == NULL)
+ tree_model_sort->root = NULL;
+ else
+ (((SortElt *)array->data)->parent)->children = NULL;
+ gtk_tree_model_sort_free_level (array);
+ }
+ else
+ {
+ g_array_remove_index (array, elt - ((SortElt *) array->data));
- gtk_tree_path_free (local_path);
+ for (i = 0; i < array->len; i++)
+ {
+ elt = & (g_array_index (array, SortElt, i));
+ if (elt->offset > offset)
+ elt->offset--;
+ }
+ }
+ }
+
+ tree_model_sort->stamp++;
+ gtk_signal_emit_by_name (GTK_OBJECT (data), "deleted", path);
+ gtk_tree_path_free (path);
}
static gint
@@ -822,7 +869,7 @@ static void
gtk_tree_model_sort_build_level (GtkTreeModelSort *tree_model_sort,
SortElt *place)
{
- gint n, i;
+ gint n, i = 0;
GArray *children;
GtkTreeIter *parent_iter = NULL;
GtkTreeIter iter;
@@ -848,7 +895,6 @@ gtk_tree_model_sort_build_level (GtkTreeModelSort *tree_model_sort,
&iter,
parent_iter);
- i = 0;
do
{
elt.iter = iter;
@@ -869,6 +915,9 @@ gtk_tree_model_sort_free_level (GArray *array)
{
gint i;
+ if (array == NULL)
+ return;
+
for (i = 0; i < array->len; i++)
{
SortElt *elt;
diff --git a/gtk/gtktreestore.c b/gtk/gtktreestore.c
index 44befc800a..c85c251b8d 100644
--- a/gtk/gtktreestore.c
+++ b/gtk/gtktreestore.c
@@ -42,6 +42,8 @@ static void gtk_tree_store_class_init (GtkTreeStoreClass *tree_stor
static void gtk_tree_store_tree_model_init (GtkTreeModelIface *iface);
static guint gtk_tree_store_get_flags (GtkTreeModel *tree_model);
static gint gtk_tree_store_get_n_columns (GtkTreeModel *tree_model);
+static GType gtk_tree_store_get_column_type (GtkTreeModel *tree_model,
+ gint index);
static GtkTreePath *gtk_tree_store_get_path (GtkTreeModel *tree_model,
GtkTreeIter *iter);
static void gtk_tree_store_get_value (GtkTreeModel *tree_model,
@@ -114,36 +116,36 @@ gtk_tree_store_class_init (GtkTreeStoreClass *tree_store_class)
GTK_RUN_FIRST,
GTK_CLASS_TYPE (object_class),
GTK_SIGNAL_OFFSET (GtkTreeStoreClass, changed),
- gtk_marshal_VOID__POINTER_POINTER,
- GTK_TYPE_NONE, 2,
- GTK_TYPE_POINTER,
- GTK_TYPE_POINTER);
+ gtk_marshal_VOID__BOXED_BOXED,
+ G_TYPE_NONE, 2,
+ GTK_TYPE_TREE_PATH,
+ GTK_TYPE_TREE_ITER);
tree_store_signals[INSERTED] =
gtk_signal_new ("inserted",
GTK_RUN_FIRST,
GTK_CLASS_TYPE (object_class),
GTK_SIGNAL_OFFSET (GtkTreeStoreClass, inserted),
- gtk_marshal_VOID__POINTER_POINTER,
- GTK_TYPE_NONE, 2,
- GTK_TYPE_POINTER,
- GTK_TYPE_POINTER);
+ gtk_marshal_VOID__BOXED_BOXED,
+ G_TYPE_NONE, 2,
+ GTK_TYPE_TREE_PATH,
+ GTK_TYPE_TREE_ITER);
tree_store_signals[CHILD_TOGGLED] =
gtk_signal_new ("child_toggled",
GTK_RUN_FIRST,
GTK_CLASS_TYPE (object_class),
GTK_SIGNAL_OFFSET (GtkTreeStoreClass, child_toggled),
- gtk_marshal_VOID__POINTER_POINTER,
- GTK_TYPE_NONE, 2,
- GTK_TYPE_POINTER,
- GTK_TYPE_POINTER);
+ gtk_marshal_VOID__BOXED_BOXED,
+ G_TYPE_NONE, 2,
+ GTK_TYPE_TREE_PATH,
+ GTK_TYPE_TREE_ITER);
tree_store_signals[DELETED] =
gtk_signal_new ("deleted",
GTK_RUN_FIRST,
GTK_CLASS_TYPE (object_class),
GTK_SIGNAL_OFFSET (GtkTreeStoreClass, deleted),
- gtk_marshal_VOID__POINTER,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_POINTER);
+ gtk_marshal_VOID__BOXED,
+ G_TYPE_NONE, 1,
+ GTK_TYPE_TREE_PATH);
gtk_object_class_add_signals (object_class, tree_store_signals, LAST_SIGNAL);
}
@@ -153,6 +155,7 @@ gtk_tree_store_tree_model_init (GtkTreeModelIface *iface)
{
iface->get_flags = gtk_tree_store_get_flags;
iface->get_n_columns = gtk_tree_store_get_n_columns;
+ iface->get_column_type = gtk_tree_store_get_column_type;
iface->get_path = gtk_tree_store_get_path;
iface->get_value = gtk_tree_store_get_value;
iface->iter_next = gtk_tree_store_iter_next;
@@ -177,8 +180,8 @@ gtk_tree_store_new (void)
}
GtkTreeStore *
-gtk_tree_store_new_with_values (gint n_columns,
- ...)
+gtk_tree_store_new_with_types (gint n_columns,
+ ...)
{
GtkTreeStore *retval;
va_list args;
@@ -262,6 +265,17 @@ gtk_tree_store_get_n_columns (GtkTreeModel *tree_model)
return GTK_TREE_STORE (tree_model)->n_columns;
}
+static GType
+gtk_tree_store_get_column_type (GtkTreeModel *tree_model,
+ gint index)
+{
+ g_return_val_if_fail (GTK_IS_TREE_STORE (tree_model), G_TYPE_INVALID);
+ g_return_val_if_fail (index < GTK_TREE_STORE (tree_model)->n_columns &&
+ index >= 0, G_TYPE_INVALID);
+
+ return GTK_TREE_STORE (tree_model)->column_headers[index];
+}
+
static GtkTreePath *
gtk_tree_store_get_path (GtkTreeModel *tree_model,
GtkTreeIter *iter)
diff --git a/gtk/gtktreestore.h b/gtk/gtktreestore.h
index 48e2a0b1d1..373c117927 100644
--- a/gtk/gtktreestore.h
+++ b/gtk/gtktreestore.h
@@ -70,7 +70,7 @@ struct _GtkTreeStoreClass
GtkType gtk_tree_store_get_type (void);
GtkTreeStore *gtk_tree_store_new (void);
-GtkTreeStore *gtk_tree_store_new_with_values (gint n_columns,
+GtkTreeStore *gtk_tree_store_new_with_types (gint n_columns,
...);
void gtk_tree_store_set_n_columns (GtkTreeStore *tree_store,
gint n_columns);
diff --git a/gtk/treestoretest.c b/gtk/treestoretest.c
index 3835d9d170..15ac08230e 100644
--- a/gtk/treestoretest.c
+++ b/gtk/treestoretest.c
@@ -261,7 +261,7 @@ main (int argc, char *argv[])
{
gtk_init (&argc, &argv);
- model = gtk_tree_store_new_with_values (2, G_TYPE_STRING, G_TYPE_STRING);
+ model = gtk_tree_store_new_with_types (2, G_TYPE_STRING, G_TYPE_STRING);
make_window ();
make_window ();