diff options
author | Jonathan Blandford <jrb@redhat.com> | 2001-06-27 23:44:53 +0000 |
---|---|---|
committer | Jonathan Blandford <jrb@src.gnome.org> | 2001-06-27 23:44:53 +0000 |
commit | 8eaa071617f29f267bb0ffb05976fa5885dbf595 (patch) | |
tree | d8b495aa301d76f90b55a04ed68aa3197b4a1cc9 /gtk/gtktreeviewcolumn.c | |
parent | f10e18bfd6b404fdad125cbc3bbfc894c16073aa (diff) | |
download | gtk+-8eaa071617f29f267bb0ffb05976fa5885dbf595.tar.gz |
New function to reflect that you can (hypothetically) pack cell renderers
Wed Jun 27 19:40:31 2001 Jonathan Blandford <jrb@redhat.com>
* gtk/gtktreeviewcolumn.c
(gtk_tree_view_column_pack_start_cell_renderer): New function to
reflect that you can (hypothetically) pack cell renderers into a
column.
(gtk_tree_view_column_pack_end_cell_renderer): ditto.
(gtk_tree_view_column_cell_is_visible): Move more functionality to
the column.
(gtk_tree_view_column_cell_can_focus): Move more functionality to
the column.
* gtk/gtktreeview.c: Move to use new column-packing code.
(gtk_tree_view_real_expand_row): remove totally braindead code.
(gtk_tree_view_real_collapse_row): ditto.
Diffstat (limited to 'gtk/gtktreeviewcolumn.c')
-rw-r--r-- | gtk/gtktreeviewcolumn.c | 348 |
1 files changed, 238 insertions, 110 deletions
diff --git a/gtk/gtktreeviewcolumn.c b/gtk/gtktreeviewcolumn.c index 30bd8eb6d7..1310e235c9 100644 --- a/gtk/gtktreeviewcolumn.c +++ b/gtk/gtktreeviewcolumn.c @@ -32,8 +32,6 @@ enum { PROP_0, - - PROP_CELL_RENDERER, PROP_VISIBLE, PROP_SIZING, PROP_WIDTH, @@ -54,6 +52,19 @@ enum LAST_SIGNAL }; +typedef struct _GtkTreeViewColumnCellInfo GtkTreeViewColumnCellInfo; +struct _GtkTreeViewColumnCellInfo +{ + GtkCellRenderer *cell; + GSList *attributes; + GtkTreeCellDataFunc func; + gpointer func_data; + GtkDestroyNotify destroy; + guint16 padding; + guint expand : 1; + guint fill : 1; + guint pack : 1; +}; /* Type methods */ static void gtk_tree_view_column_init (GtkTreeViewColumn *tree_column); @@ -92,8 +103,10 @@ static void gtk_tree_view_column_sort (GtkTreeViewColum gpointer data); static void gtk_tree_view_column_setup_sort_column_id_callback (GtkTreeViewColumn *tree_column); static void gtk_tree_view_column_set_attributesv (GtkTreeViewColumn *tree_column, + GtkCellRenderer *cell_renderer, va_list args); - +static GtkTreeViewColumnCellInfo *gtk_tree_view_column_get_cell_info (GtkTreeViewColumn *tree_column, + GtkCellRenderer *cell_renderer); @@ -152,14 +165,6 @@ gtk_tree_view_column_class_init (GtkTreeViewColumnClass *class) GTK_TYPE_NONE, 0); g_object_class_install_property (object_class, - PROP_CELL_RENDERER, - g_param_spec_object ("cell_renderer", - _("Cell renderer"), - _("Cell renderer object to use for rendering the cell"), - GTK_TYPE_CELL_RENDERER, - G_PARAM_READABLE | G_PARAM_WRITABLE)); - - g_object_class_install_property (object_class, PROP_VISIBLE, g_param_spec_boolean ("visible", _("Visible"), @@ -281,8 +286,6 @@ gtk_tree_view_column_init (GtkTreeViewColumn *tree_column) tree_column->requested_width = -1; tree_column->min_width = -1; tree_column->max_width = -1; - tree_column->cell = NULL; - tree_column->attributes = NULL; tree_column->column_type = GTK_TREE_VIEW_COLUMN_AUTOSIZE; tree_column->visible = TRUE; tree_column->clickable = FALSE; @@ -301,11 +304,19 @@ static void gtk_tree_view_column_finalize (GObject *object) { GtkTreeViewColumn *tree_column = (GtkTreeViewColumn *) object; + GList *list; + - if (tree_column->func_data && tree_column->destroy) - (tree_column->destroy) (tree_column->func_data); + for (list = tree_column->cell_list; list; list = list->next) + { + GtkTreeViewColumnCellInfo *info = (GtkTreeViewColumnCellInfo *) list->data; + if (info->func_data && info->destroy) + (info->destroy) (info->func_data); + gtk_tree_view_column_clear_attributes (tree_column, info->cell); + g_object_unref (G_OBJECT (info->cell)); + g_free (info); + } - g_slist_free (tree_column->attributes); g_free (tree_column->title); } @@ -321,12 +332,6 @@ gtk_tree_view_column_set_property (GObject *object, switch (prop_id) { - case PROP_CELL_RENDERER: - gtk_tree_view_column_set_cell_renderer (tree_column, - (GtkCellRenderer*) - g_value_get_object (value)); - break; - case PROP_VISIBLE: gtk_tree_view_column_set_visible (tree_column, g_value_get_boolean (value)); @@ -405,11 +410,6 @@ gtk_tree_view_column_get_property (GObject *object, switch (prop_id) { - case PROP_CELL_RENDERER: - g_value_set_object (value, - (GObject*) gtk_tree_view_column_get_cell_renderer (tree_column)); - break; - case PROP_VISIBLE: g_value_set_boolean (value, gtk_tree_view_column_get_visible (tree_column)); @@ -1040,7 +1040,7 @@ gtk_tree_view_column_new_with_attributes (const gchar *title, gtk_tree_view_column_set_cell_renderer (retval, cell); va_start (args, cell); - gtk_tree_view_column_set_attributesv (retval, args); + gtk_tree_view_column_set_attributesv (retval, cell, args); va_end (args); return retval; @@ -1059,42 +1059,115 @@ void gtk_tree_view_column_set_cell_renderer (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell) { + gtk_tree_view_column_pack_start_cell_renderer (tree_column, cell, TRUE, TRUE, 0); +} + +static GtkTreeViewColumnCellInfo * +gtk_tree_view_column_get_cell_info (GtkTreeViewColumn *tree_column, + GtkCellRenderer *cell_renderer) +{ + GList *list; + for (list = tree_column->cell_list; list; list = list->next) + if (((GtkTreeViewColumnCellInfo *)list->data)->cell == cell_renderer) + return (GtkTreeViewColumnCellInfo *) list->data; + return NULL; +} + +/** + * gtk_tree_view_column_pack_start_cell_renderer: + * @tree_column: A #GtkTreeViewColumn. + * @cell: The #GtkCellRenderer, + * @expand: TRUE if @cell is to be given extra space allocated to box. + * @fill: TRUE if @cell is to fill space allocated to it. + * @padding: extra space in pixels to place on the outside of the cell + * + * Packs a cell into + **/ +void +gtk_tree_view_column_pack_start_cell_renderer (GtkTreeViewColumn *tree_column, + GtkCellRenderer *cell, + gboolean expand, + gboolean fill, + guint padding) +{ + GtkTreeViewColumnCellInfo *cell_info; + g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column)); + g_return_if_fail (GTK_IS_CELL_RENDERER (cell)); + g_return_if_fail (! gtk_tree_view_column_get_cell_info (tree_column, cell)); - if (cell) - g_return_if_fail (GTK_IS_CELL_RENDERER (cell)); + g_object_ref (G_OBJECT (cell)); - if (cell) - g_object_ref (G_OBJECT (cell)); + cell_info = g_new0 (GtkTreeViewColumnCellInfo, 1); + cell_info->cell = cell; + cell_info->expand = expand ? TRUE : FALSE; + cell_info->fill = fill ? TRUE : FALSE; + cell_info->pack = GTK_PACK_START; + cell_info->attributes = NULL; - if (tree_column->cell) - g_object_unref (G_OBJECT (tree_column->cell)); + tree_column->cell_list = g_list_append (tree_column->cell_list, cell_info); +} - tree_column->cell = cell; +void +gtk_tree_view_column_pack_end_cell_renderer (GtkTreeViewColumn *tree_column, + GtkCellRenderer *cell, + gboolean expand, + gboolean fill, + guint padding) +{ + GtkTreeViewColumnCellInfo *cell_info; - if (tree_column->tree_view) + g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column)); + g_return_if_fail (GTK_IS_CELL_RENDERER (cell)); + g_return_if_fail (! gtk_tree_view_column_get_cell_info (tree_column, cell)); + + g_object_ref (G_OBJECT (cell)); + + cell_info = g_new (GtkTreeViewColumnCellInfo, 1); + cell_info->cell = cell; + cell_info->expand = expand ? TRUE : FALSE; + cell_info->fill = fill ? TRUE : FALSE; + cell_info->pack = GTK_PACK_END; + cell_info->attributes = NULL; + + tree_column->cell_list = g_list_append (tree_column->cell_list, cell_info); +} + + +void +gtk_tree_view_column_clear_cell_renderers (GtkTreeViewColumn *tree_column) +{ + GList *list; + g_return_if_fail (tree_column != NULL); + + for (list = tree_column->cell_list; list; list = list->next) { - tree_column->dirty = TRUE; - gtk_widget_queue_resize (tree_column->tree_view); + GtkTreeViewColumnCellInfo *info = (GtkTreeViewColumnCellInfo *)list->data; + + g_object_unref (G_OBJECT (info->cell)); + gtk_tree_view_column_clear_attributes (tree_column, info->cell); + g_free (info); } - g_object_notify (G_OBJECT (tree_column), "cell_renderer"); + g_list_free (tree_column->cell_list); + tree_column->cell_list = NULL; } -/** - * gtk_tree_view_column_get_cell_renderer: - * @tree_column: a #GtkTreeViewColumn - * - * Gets the value set with gtk_tree_view_column_set_cell_renderer(). - * - * Return value: cell renderer for the column, or %NULL if unset - **/ -GtkCellRenderer* -gtk_tree_view_column_get_cell_renderer (GtkTreeViewColumn *tree_column) +GList * +gtk_tree_view_column_get_cell_renderers (GtkTreeViewColumn *tree_column) { - g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), NULL); - - return tree_column->cell; + GList *retval = NULL, *list; + + g_return_val_if_fail (tree_column != NULL, NULL); + + for (list = tree_column->cell_list; list; list = list->next) + { + GtkTreeViewColumnCellInfo *info = (GtkTreeViewColumnCellInfo *)list->data; + + retval = g_list_append (retval, info->cell); + } + + return retval; } /** @@ -1109,16 +1182,19 @@ gtk_tree_view_column_get_cell_renderer (GtkTreeViewColumn *tree_column) **/ void gtk_tree_view_column_add_attribute (GtkTreeViewColumn *tree_column, + GtkCellRenderer *cell_renderer, const gchar *attribute, gint column) { + GtkTreeViewColumnCellInfo *info; + g_return_if_fail (tree_column != NULL); g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column)); + info = gtk_tree_view_column_get_cell_info (tree_column, cell_renderer); + g_return_if_fail (info != NULL); - tree_column->attributes = g_slist_prepend (tree_column->attributes, - GINT_TO_POINTER (column)); - tree_column->attributes = g_slist_prepend (tree_column->attributes, - g_strdup (attribute)); + info->attributes = g_slist_prepend (info->attributes, GINT_TO_POINTER (column)); + info->attributes = g_slist_prepend (info->attributes, g_strdup (attribute)); if (tree_column->tree_view) { @@ -1130,24 +1206,20 @@ gtk_tree_view_column_add_attribute (GtkTreeViewColumn *tree_column, static void gtk_tree_view_column_set_attributesv (GtkTreeViewColumn *tree_column, + GtkCellRenderer *cell_renderer, va_list args) { gchar *attribute; gint column; - g_return_if_fail (tree_column != NULL); - g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column)); - attribute = va_arg (args, gchar *); - gtk_tree_view_column_clear_attributes (tree_column); + gtk_tree_view_column_clear_attributes (tree_column, cell_renderer); while (attribute != NULL) { column = va_arg (args, gint); - gtk_tree_view_column_add_attribute (tree_column, - attribute, - column); + gtk_tree_view_column_add_attribute (tree_column, cell_renderer, attribute, column); attribute = va_arg (args, gchar *); } } @@ -1164,17 +1236,17 @@ gtk_tree_view_column_set_attributesv (GtkTreeViewColumn *tree_column, **/ void gtk_tree_view_column_set_attributes (GtkTreeViewColumn *tree_column, + GtkCellRenderer *cell_renderer, ...) { va_list args; - g_return_if_fail (tree_column != NULL); g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column)); + g_return_if_fail (GTK_IS_CELL_RENDERER (cell_renderer)); + g_return_if_fail (gtk_tree_view_column_get_cell_info (tree_column, cell_renderer)); - va_start (args, tree_column); - - gtk_tree_view_column_set_attributesv (tree_column, args); - + va_start (args, cell_renderer); + gtk_tree_view_column_set_attributesv (tree_column, cell_renderer, args); va_end (args); } @@ -1193,24 +1265,30 @@ gtk_tree_view_column_set_attributes (GtkTreeViewColumn *tree_column, **/ void gtk_tree_view_column_set_cell_data_func (GtkTreeViewColumn *tree_column, + GtkCellRenderer *cell_renderer, GtkTreeCellDataFunc func, gpointer func_data, GtkDestroyNotify destroy) { - g_return_if_fail (tree_column != NULL); + GtkTreeViewColumnCellInfo *info; + g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column)); + g_return_if_fail (GTK_IS_CELL_RENDERER (cell_renderer)); + info = gtk_tree_view_column_get_cell_info (tree_column, cell_renderer); + + g_return_if_fail (info != NULL); - if (func == tree_column->func && - func_data == tree_column->func_data && - destroy == tree_column->destroy) + if (func == info->func && + func_data == info->func_data && + destroy == info->destroy) return; - if (tree_column->func_data && tree_column->destroy) - (tree_column->destroy) (tree_column->func_data); + if (info->func_data && info->destroy) + (info->destroy) (info->func_data); - tree_column->func = func; - tree_column->func_data = func_data; - tree_column->destroy = destroy; + info->func = func; + info->func_data = func_data; + info->destroy = destroy; if (tree_column->tree_view) { @@ -1223,26 +1301,31 @@ gtk_tree_view_column_set_cell_data_func (GtkTreeViewColumn *tree_column, /** * gtk_tree_view_column_clear_attributes: * @tree_column: a #GtkTreeViewColumn + *@cell_renderer: a #GtkCellRenderer to clear the attribute mapping on. * * Clears all existing attributes previously set with * gtk_tree_view_column_set_attributes(). **/ void -gtk_tree_view_column_clear_attributes (GtkTreeViewColumn *tree_column) +gtk_tree_view_column_clear_attributes (GtkTreeViewColumn *tree_column, + GtkCellRenderer *cell_renderer) { + GtkTreeViewColumnCellInfo *info; GSList *list; - + g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column)); + g_return_if_fail (GTK_IS_CELL_RENDERER (cell_renderer)); + info = gtk_tree_view_column_get_cell_info (tree_column, cell_renderer); - list = tree_column->attributes; + list = info->attributes; while (list && list->next) { g_free (list->data); list = list->next->next; } - g_slist_free (tree_column->attributes); - tree_column->attributes = NULL; + g_slist_free (info->attributes); + info->attributes = NULL; if (tree_column->tree_view) { @@ -1923,35 +2006,39 @@ gtk_tree_view_column_cell_set_cell_data (GtkTreeViewColumn *tree_column, { GSList *list; GValue value = { 0, }; - GObject *cell; + GList *cell_list; g_return_if_fail (tree_column != NULL); g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column)); - g_return_if_fail (tree_column->cell != NULL); + g_return_if_fail (tree_column->cell_list != NULL); if (tree_model == NULL) return; - cell = (GObject *) tree_column->cell; - list = tree_column->attributes; + for (cell_list = tree_column->cell_list; cell_list; cell_list = cell_list->next) + { + GtkTreeViewColumnCellInfo *info = (GtkTreeViewColumnCellInfo *) cell_list->data; + GObject *cell = (GObject *) info->cell; + + list = info->attributes; - g_object_freeze_notify (cell); + g_object_freeze_notify (cell); - while (list && list->next) - { - gtk_tree_model_get_value (tree_model, iter, - GPOINTER_TO_INT (list->next->data), - &value); - g_object_set_property (cell, (gchar *) list->data, &value); - g_value_unset (&value); - list = list->next->next; + while (list && list->next) + { + gtk_tree_model_get_value (tree_model, iter, + GPOINTER_TO_INT (list->next->data), + &value); + g_object_set_property (cell, (gchar *) list->data, &value); + g_value_unset (&value); + list = list->next->next; + } + if (info->func) + (* info->func) (tree_column, info->cell, tree_model, iter, info->func_data); + g_object_thaw_notify (G_OBJECT (info->cell)); } - if (tree_column->func) - (* tree_column->func) (tree_column, tree_column->cell, tree_model, iter, tree_column->func_data); - - g_object_thaw_notify (cell); } /** @@ -1976,7 +2063,7 @@ gtk_tree_view_column_cell_get_size (GtkTreeViewColumn *tree_column, { g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column)); - gtk_cell_renderer_get_size (tree_column->cell, + gtk_cell_renderer_get_size (((GtkTreeViewColumnCellInfo *) tree_column->cell_list->data)->cell, tree_column->tree_view, cell_area, x_offset, @@ -2009,15 +2096,15 @@ gtk_tree_view_column_cell_render (GtkTreeViewColumn *tree_column, gboolean visible; g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column)); - g_object_get (G_OBJECT (tree_column->cell), "visible", &visible, NULL); + g_object_get (G_OBJECT ((((GtkTreeViewColumnCellInfo *) tree_column->cell_list->data)->cell)), "visible", &visible, NULL); if (visible) - gtk_cell_renderer_render (tree_column->cell, - window, - tree_column->tree_view, - background_area, - cell_area, - expose_area, - flags); + gtk_cell_renderer_render (((GtkTreeViewColumnCellInfo *) tree_column->cell_list->data)->cell, + window, + tree_column->tree_view, + background_area, + cell_area, + expose_area, + flags); } /** @@ -2045,13 +2132,13 @@ gtk_tree_view_column_cell_event (GtkTreeViewColumn *tree_column, g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), FALSE); - g_object_get (G_OBJECT (tree_column->cell), + g_object_get (G_OBJECT (((GtkTreeViewColumnCellInfo *) tree_column->cell_list->data)->cell), "visible", &visible, "can_activate", &can_activate, NULL); if (visible && can_activate) { - if (gtk_cell_renderer_event (tree_column->cell, + if (gtk_cell_renderer_event (((GtkTreeViewColumnCellInfo *) tree_column->cell_list->data)->cell, event, tree_column->tree_view, path_string, @@ -2063,3 +2150,44 @@ gtk_tree_view_column_cell_event (GtkTreeViewColumn *tree_column, } return FALSE; } + +gboolean +gtk_tree_view_column_cell_can_focus (GtkTreeViewColumn *tree_column) +{ + GList *list; + gboolean visible; + gboolean can_activate; + + for (list = tree_column->cell_list; list; list = list->next) + { + GtkTreeViewColumnCellInfo *info = (GtkTreeViewColumnCellInfo *) list->data; + g_object_get (G_OBJECT (info->cell), + "can_activate", &can_activate, + "visible", &visible, + NULL); + if (can_activate && visible) + return TRUE; + } + + return FALSE; +} + + +gboolean +gtk_tree_view_column_cell_is_visible (GtkTreeViewColumn *tree_column) +{ + GList *list; + gboolean visible; + + for (list = tree_column->cell_list; list; list = list->next) + { + GtkTreeViewColumnCellInfo *info = (GtkTreeViewColumnCellInfo *) list->data; + g_object_get (G_OBJECT (info->cell), + "visible", &visible, + NULL); + if (visible) + return TRUE; + } + + return FALSE; +} |