summaryrefslogtreecommitdiff
path: root/gtk/gtktreestore.c
diff options
context:
space:
mode:
authorJonathan Blandford <jrb@redhat.com>2001-03-10 01:34:48 +0000
committerJonathan Blandford <jrb@src.gnome.org>2001-03-10 01:34:48 +0000
commit351052e1662110612b2c850977a70f2948a68496 (patch)
tree6620125ed4b3386fac6ac4d8c101f84abe5640f2 /gtk/gtktreestore.c
parent79fed460d99ffeb75d8b4f71654a01ebf657b5e9 (diff)
downloadgtk+-351052e1662110612b2c850977a70f2948a68496.tar.gz
Make select_all not work if you're in SINGLE mode (it doesn't make that
Fri Mar 9 20:36:21 2001 Jonathan Blandford <jrb@redhat.com> * gtk/gtktreeselection.c (gtk_tree_selection_select_all): Make select_all not work if you're in SINGLE mode (it doesn't make that much sense, anyway.) * gtk/gtktreedatalist.c (_gtk_tree_data_list_node_to_value): handle types more sanely. (_gtk_tree_data_list_value_to_node): handle types more sanely. (_gtk_tree_data_list_node_copy): handle types more sanely. * gtk/gtkliststore.c (gtk_list_store_set_cell): fix to work with GValue better. Converts the type as well. * gtk/gtktreestore.c (gtk_tree_store_set_cell): fix to work with GValue better. Converts the type as well.
Diffstat (limited to 'gtk/gtktreestore.c')
-rw-r--r--gtk/gtktreestore.c77
1 files changed, 68 insertions, 9 deletions
diff --git a/gtk/gtktreestore.c b/gtk/gtktreestore.c
index d26e3a21ca..f632ed3460 100644
--- a/gtk/gtktreestore.c
+++ b/gtk/gtktreestore.c
@@ -213,8 +213,16 @@ gtk_tree_store_new_with_types (gint n_columns,
va_start (args, n_columns);
for (i = 0; i < n_columns; i++)
- gtk_tree_store_set_column_type (retval, i, va_arg (args, GType));
-
+ {
+ GType type = va_arg (args, GType);
+ if (! _gtk_tree_data_list_check_type (type))
+ {
+ g_warning ("%s: Invalid type %s passed to gtk_tree_store_new_with_types\n", G_STRLOC, g_type_name (type));
+ g_object_unref (G_OBJECT (retval));
+ return NULL;
+ }
+ gtk_tree_store_set_column_type (retval, i, type);
+ }
va_end (args);
return retval;
@@ -248,6 +256,18 @@ gtk_tree_store_set_n_columns (GtkTreeStore *tree_store,
tree_store->n_columns = n_columns;
}
+/**
+ * gtk_tree_store_set_column_type:
+ * @tree_store: a #GtkTreeStore
+ * @column: column number
+ * @type: type of the data to be stored in @column
+ *
+ * Supported types include: %G_TYPE_UINT, %G_TYPE_INT, %G_TYPE_UCHAR,
+ * %G_TYPE_CHAR, %G_TYPE_BOOLEAN, %G_TYPE_POINTER, %G_TYPE_FLOAT,
+ * %G_TYPE_DOUBLE, %G_TYPE_STRING, %G_TYPE_OBJECT, and %G_TYPE_BOXED, along with
+ * subclasses of those types such as %GDK_TYPE_PIXBUF.
+ *
+ **/
void
gtk_tree_store_set_column_type (GtkTreeStore *tree_store,
gint column,
@@ -256,7 +276,11 @@ gtk_tree_store_set_column_type (GtkTreeStore *tree_store,
g_return_if_fail (tree_store != NULL);
g_return_if_fail (GTK_IS_TREE_STORE (tree_store));
g_return_if_fail (column >=0 && column < tree_store->n_columns);
-
+ if (!_gtk_tree_data_list_check_type (type))
+ {
+ g_warning ("%s: Invalid type %s passed to gtk_tree_store_new_with_types\n", G_STRLOC, g_type_name (type));
+ return;
+ }
tree_store->column_headers[column] = type;
}
@@ -533,10 +557,36 @@ gtk_tree_store_set_cell (GtkTreeStore *tree_store,
GtkTreeDataList *list;
GtkTreeDataList *prev;
GtkTreePath *path = NULL;
+ GValue real_value = {0, };
+ gboolean converted = FALSE;
g_return_if_fail (tree_store != NULL);
g_return_if_fail (GTK_IS_TREE_STORE (tree_store));
g_return_if_fail (column >= 0 && column < tree_store->n_columns);
+ g_return_if_fail (value != NULL);
+
+ if (! g_type_is_a (G_VALUE_TYPE (value), column->type))
+ {
+ if (! (g_value_type_compatible (G_VALUE_TYPE (value), column->type) &&
+ g_value_type_compatible (column->type, G_VALUE_TYPE (value))))
+ {
+ g_warning ("%s: Unable to convert from %s to %s\n",
+ G_STRLOC,
+ g_type_name (G_VALUE_TYPE (value)),
+ g_type_name (column->type));
+ return;
+ }
+ if (!g_value_transform (value, &real_value))
+ {
+ g_warning ("%s: Unable to make conversion from %s to %s\n",
+ G_STRLOC,
+ g_type_name (G_VALUE_TYPE (value)),
+ g_type_name (column->type));
+ g_value_unset (&real_value);
+ return;
+ }
+ converted = TRUE;
+ }
prev = list = G_NODE (iter->user_data)->data;
@@ -546,9 +596,14 @@ gtk_tree_store_set_cell (GtkTreeStore *tree_store,
{
if (column == 0)
{
- _gtk_tree_data_list_value_to_node (list, value);
+ if (converted)
+ _gtk_tree_data_list_value_to_node (list, &real_value);
+ else
+ _gtk_tree_data_list_value_to_node (list, value);
gtk_tree_model_changed (GTK_TREE_MODEL (tree_store), path, iter);
gtk_tree_path_free (path);
+ if (converted)
+ g_value_unset (&real_value);
return;
}
@@ -575,9 +630,14 @@ gtk_tree_store_set_cell (GtkTreeStore *tree_store,
list->next = NULL;
column --;
}
- _gtk_tree_data_list_value_to_node (list, value);
+ if (converted)
+ _gtk_tree_data_list_value_to_node (list, real_value);
+ else
+ _gtk_tree_data_list_value_to_node (list, value);
gtk_tree_model_changed (GTK_TREE_MODEL (tree_store), path, iter);
gtk_tree_path_free (path);
+ if (converted)
+ g_value_unset (&real_value);
}
/**
@@ -1004,8 +1064,7 @@ copy_node_data (GtkTreeStore *tree_store,
col = 0;
while (dl)
{
- copy_iter = _gtk_tree_data_list_node_copy (dl,
- tree_store->column_headers[col]);
+ copy_iter = _gtk_tree_data_list_node_copy (dl, tree_store->column_headers[col]);
if (copy_head == NULL)
copy_head = copy_iter;
@@ -1018,10 +1077,10 @@ copy_node_data (GtkTreeStore *tree_store,
dl = dl->next;
++col;
}
-
+
G_NODE (dest_iter->user_data)->data = copy_head;
- path = gtk_tree_store_get_path (tree_store, dest_iter);
+ path = gtk_tree_store_get_path (GTK_TREE_MODEL (tree_store), dest_iter);
gtk_tree_model_changed (GTK_TREE_MODEL (tree_store), path, dest_iter);
gtk_tree_path_free (path);
}