From cb3c5cc14d4d7f8619ff2742bf6c4e6d7bd6a503 Mon Sep 17 00:00:00 2001 From: Kristian Rietveld Date: Tue, 23 Apr 2002 16:39:01 +0000 Subject: [PATCH] This commit adds a cell_background property for cell renderers. With this Tue Apr 23 18:35:34 2002 Kristian Rietveld This commit adds a cell_background property for cell renderers. With this property you can make your TreeView look incredibly ugly. * gtk/gtkcellrenderer.c: add cell_background, cell_background_gdk and cell_background_set properties, (set_cell_bg_color): new function, (gtk_cell_renderer_get_property), (gtk_cell_renderer_set_property): support for new properties, (gtk_cell_renderer_render): render a background when set. * gtk/gtkcellrenderer.h: add cell_background_set and cell_background fields. * gtk/gtktreeviewcolumn.c (gtk_tree_view_column_cell_process_action): when rendering, pass in just the background_area of the cell and not the background_area of the entire column. --- ChangeLog | 20 ++++++- ChangeLog.pre-2-10 | 20 ++++++- ChangeLog.pre-2-2 | 20 ++++++- ChangeLog.pre-2-4 | 20 ++++++- ChangeLog.pre-2-6 | 20 ++++++- ChangeLog.pre-2-8 | 20 ++++++- gtk/gtkcellrenderer.c | 112 +++++++++++++++++++++++++++++++++++++++- gtk/gtkcellrenderer.h | 4 ++ gtk/gtktreeviewcolumn.c | 17 +++++- 9 files changed, 244 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5f02ccdd77..cf08577264 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +Tue Apr 23 18:35:34 2002 Kristian Rietveld + + This commit adds a cell_background property for cell renderers. With + this property you can make your TreeView look incredibly ugly. + + * gtk/gtkcellrenderer.c: add cell_background, cell_background_gdk and + cell_background_set properties, + (set_cell_bg_color): new function, + (gtk_cell_renderer_get_property), (gtk_cell_renderer_set_property): + support for new properties, + (gtk_cell_renderer_render): render a background when set. + + * gtk/gtkcellrenderer.h: add cell_background_set and cell_background + fields. + + * gtk/gtktreeviewcolumn.c (gtk_tree_view_column_cell_process_action): + when rendering, pass in just the background_area of the cell and not + the background_area of the entire column. + 2002-04-22 Anders Carlsson * gtk/gtkentry.c (gtk_entry_drag_data_get): Use @@ -18,7 +37,6 @@ Mon Apr 22 19:24:29 2002 Kristian Rietveld icon stuff in the cellrendererpixbuf instead of its own stock icon rendering code. - 2002-04-21 Alexander Larsson * gdk/x11/gdkwindow-x11.c (gdk_window_reparent): diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 5f02ccdd77..cf08577264 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,22 @@ +Tue Apr 23 18:35:34 2002 Kristian Rietveld + + This commit adds a cell_background property for cell renderers. With + this property you can make your TreeView look incredibly ugly. + + * gtk/gtkcellrenderer.c: add cell_background, cell_background_gdk and + cell_background_set properties, + (set_cell_bg_color): new function, + (gtk_cell_renderer_get_property), (gtk_cell_renderer_set_property): + support for new properties, + (gtk_cell_renderer_render): render a background when set. + + * gtk/gtkcellrenderer.h: add cell_background_set and cell_background + fields. + + * gtk/gtktreeviewcolumn.c (gtk_tree_view_column_cell_process_action): + when rendering, pass in just the background_area of the cell and not + the background_area of the entire column. + 2002-04-22 Anders Carlsson * gtk/gtkentry.c (gtk_entry_drag_data_get): Use @@ -18,7 +37,6 @@ Mon Apr 22 19:24:29 2002 Kristian Rietveld icon stuff in the cellrendererpixbuf instead of its own stock icon rendering code. - 2002-04-21 Alexander Larsson * gdk/x11/gdkwindow-x11.c (gdk_window_reparent): diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 5f02ccdd77..cf08577264 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,22 @@ +Tue Apr 23 18:35:34 2002 Kristian Rietveld + + This commit adds a cell_background property for cell renderers. With + this property you can make your TreeView look incredibly ugly. + + * gtk/gtkcellrenderer.c: add cell_background, cell_background_gdk and + cell_background_set properties, + (set_cell_bg_color): new function, + (gtk_cell_renderer_get_property), (gtk_cell_renderer_set_property): + support for new properties, + (gtk_cell_renderer_render): render a background when set. + + * gtk/gtkcellrenderer.h: add cell_background_set and cell_background + fields. + + * gtk/gtktreeviewcolumn.c (gtk_tree_view_column_cell_process_action): + when rendering, pass in just the background_area of the cell and not + the background_area of the entire column. + 2002-04-22 Anders Carlsson * gtk/gtkentry.c (gtk_entry_drag_data_get): Use @@ -18,7 +37,6 @@ Mon Apr 22 19:24:29 2002 Kristian Rietveld icon stuff in the cellrendererpixbuf instead of its own stock icon rendering code. - 2002-04-21 Alexander Larsson * gdk/x11/gdkwindow-x11.c (gdk_window_reparent): diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 5f02ccdd77..cf08577264 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,22 @@ +Tue Apr 23 18:35:34 2002 Kristian Rietveld + + This commit adds a cell_background property for cell renderers. With + this property you can make your TreeView look incredibly ugly. + + * gtk/gtkcellrenderer.c: add cell_background, cell_background_gdk and + cell_background_set properties, + (set_cell_bg_color): new function, + (gtk_cell_renderer_get_property), (gtk_cell_renderer_set_property): + support for new properties, + (gtk_cell_renderer_render): render a background when set. + + * gtk/gtkcellrenderer.h: add cell_background_set and cell_background + fields. + + * gtk/gtktreeviewcolumn.c (gtk_tree_view_column_cell_process_action): + when rendering, pass in just the background_area of the cell and not + the background_area of the entire column. + 2002-04-22 Anders Carlsson * gtk/gtkentry.c (gtk_entry_drag_data_get): Use @@ -18,7 +37,6 @@ Mon Apr 22 19:24:29 2002 Kristian Rietveld icon stuff in the cellrendererpixbuf instead of its own stock icon rendering code. - 2002-04-21 Alexander Larsson * gdk/x11/gdkwindow-x11.c (gdk_window_reparent): diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 5f02ccdd77..cf08577264 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,22 @@ +Tue Apr 23 18:35:34 2002 Kristian Rietveld + + This commit adds a cell_background property for cell renderers. With + this property you can make your TreeView look incredibly ugly. + + * gtk/gtkcellrenderer.c: add cell_background, cell_background_gdk and + cell_background_set properties, + (set_cell_bg_color): new function, + (gtk_cell_renderer_get_property), (gtk_cell_renderer_set_property): + support for new properties, + (gtk_cell_renderer_render): render a background when set. + + * gtk/gtkcellrenderer.h: add cell_background_set and cell_background + fields. + + * gtk/gtktreeviewcolumn.c (gtk_tree_view_column_cell_process_action): + when rendering, pass in just the background_area of the cell and not + the background_area of the entire column. + 2002-04-22 Anders Carlsson * gtk/gtkentry.c (gtk_entry_drag_data_get): Use @@ -18,7 +37,6 @@ Mon Apr 22 19:24:29 2002 Kristian Rietveld icon stuff in the cellrendererpixbuf instead of its own stock icon rendering code. - 2002-04-21 Alexander Larsson * gdk/x11/gdkwindow-x11.c (gdk_window_reparent): diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 5f02ccdd77..cf08577264 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,22 @@ +Tue Apr 23 18:35:34 2002 Kristian Rietveld + + This commit adds a cell_background property for cell renderers. With + this property you can make your TreeView look incredibly ugly. + + * gtk/gtkcellrenderer.c: add cell_background, cell_background_gdk and + cell_background_set properties, + (set_cell_bg_color): new function, + (gtk_cell_renderer_get_property), (gtk_cell_renderer_set_property): + support for new properties, + (gtk_cell_renderer_render): render a background when set. + + * gtk/gtkcellrenderer.h: add cell_background_set and cell_background + fields. + + * gtk/gtktreeviewcolumn.c (gtk_tree_view_column_cell_process_action): + when rendering, pass in just the background_area of the cell and not + the background_area of the entire column. + 2002-04-22 Anders Carlsson * gtk/gtkentry.c (gtk_entry_drag_data_get): Use @@ -18,7 +37,6 @@ Mon Apr 22 19:24:29 2002 Kristian Rietveld icon stuff in the cellrendererpixbuf instead of its own stock icon rendering code. - 2002-04-21 Alexander Larsson * gdk/x11/gdkwindow-x11.c (gdk_window_reparent): diff --git a/gtk/gtkcellrenderer.c b/gtk/gtkcellrenderer.c index 8b13966226..6327da9eb3 100644 --- a/gtk/gtkcellrenderer.c +++ b/gtk/gtkcellrenderer.c @@ -30,6 +30,8 @@ static void gtk_cell_renderer_set_property (GObject *object, guint param_id, const GValue *value, GParamSpec *pspec); +static void set_cell_bg_color (GtkCellRenderer *cell, + GdkColor *color); enum { @@ -43,7 +45,10 @@ enum { PROP_WIDTH, PROP_HEIGHT, PROP_IS_EXPANDER, - PROP_IS_EXPANDED + PROP_IS_EXPANDED, + PROP_CELL_BACKGROUND, + PROP_CELL_BACKGROUND_GDK, + PROP_CELL_BACKGROUND_SET }; @@ -200,6 +205,29 @@ gtk_cell_renderer_class_init (GtkCellRendererClass *class) FALSE, G_PARAM_READABLE | G_PARAM_WRITABLE)); + + g_object_class_install_property (object_class, + PROP_CELL_BACKGROUND, + g_param_spec_string ("cell_background", + _("Cell background color name"), + _("Cell background color as a string"), + NULL, + G_PARAM_WRITABLE)); + + g_object_class_install_property (object_class, + PROP_CELL_BACKGROUND_GDK, + g_param_spec_boxed ("cell_background_gdk", + _("Cell background color"), + _("Cell background color as a GdkColor"), + GDK_TYPE_COLOR, + G_PARAM_READABLE | G_PARAM_WRITABLE)); + + +#define ADD_SET_PROP(propname, propval, nick, blurb) g_object_class_install_property (object_class, propval, g_param_spec_boolean (propname, nick, blurb, FALSE, G_PARAM_READABLE | G_PARAM_WRITABLE)) + + ADD_SET_PROP ("cell_background_set", PROP_CELL_BACKGROUND_SET, + _("Cell background set"), + _("Whether this tag affects the cell background color")); } static void @@ -242,6 +270,21 @@ gtk_cell_renderer_get_property (GObject *object, case PROP_IS_EXPANDED: g_value_set_int (value, cell->is_expanded); break; + case PROP_CELL_BACKGROUND_GDK: + { + GdkColor color; + + color.red = cell->cell_background.red; + color.green = cell->cell_background.green; + color.blue = cell->cell_background.blue; + + g_value_set_boxed (value, &color); + } + break; + case PROP_CELL_BACKGROUND_SET: + g_value_set_boolean (value, cell->cell_background_set); + break; + case PROP_CELL_BACKGROUND: default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); break; @@ -289,12 +332,58 @@ gtk_cell_renderer_set_property (GObject *object, case PROP_IS_EXPANDED: cell->is_expanded = g_value_get_boolean (value); break; + case PROP_CELL_BACKGROUND: + { + GdkColor color; + + if (!g_value_get_string (value)) + set_cell_bg_color (cell, NULL); + else if (gdk_color_parse (g_value_get_string (value), &color)) + set_cell_bg_color (cell, &color); + else + g_warning ("Don't know color `%s'", g_value_get_string (value)); + + g_object_notify (object, "cell_background_gdk"); + } + break; + case PROP_CELL_BACKGROUND_GDK: + set_cell_bg_color (cell, g_value_get_boxed (value)); + break; + case PROP_CELL_BACKGROUND_SET: + cell->cell_background_set = g_value_get_boolean (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); break; } } +static void +set_cell_bg_color (GtkCellRenderer *cell, + GdkColor *color) +{ + if (color) + { + if (!cell->cell_background_set) + { + cell->cell_background_set = TRUE; + g_object_notify (G_OBJECT (cell), "cell_background_set"); + } + + cell->cell_background.red = color->red; + cell->cell_background.green = color->green; + cell->cell_background.blue = color->blue; + } + else + { + if (cell->cell_background_set) + { + cell->cell_background_set = FALSE; + g_object_notify (G_OBJECT (cell), "cell_background_set"); + } + } +} + /** * gtk_cell_renderer_get_size: * @cell: a #GtkCellRenderer @@ -369,9 +458,30 @@ gtk_cell_renderer_render (GtkCellRenderer *cell, GdkRectangle *expose_area, GtkCellRendererState flags) { + gboolean selected = FALSE; + g_return_if_fail (GTK_IS_CELL_RENDERER (cell)); g_return_if_fail (GTK_CELL_RENDERER_GET_CLASS (cell)->render != NULL); + selected = (flags & GTK_CELL_RENDERER_SELECTED) == GTK_CELL_RENDERER_SELECTED; + + if (cell->cell_background_set && !selected) + { + GdkColor color; + GdkGC *gc; + + color.red = cell->cell_background.red; + color.green = cell->cell_background.green; + color.blue = cell->cell_background.blue; + + gc = gdk_gc_new (window); + gdk_gc_set_rgb_fg_color (gc, &color); + gdk_draw_rectangle (window, gc, TRUE, + background_area->x, background_area->y, + background_area->width, background_area->height); + g_object_unref (G_OBJECT (gc)); + } + GTK_CELL_RENDERER_GET_CLASS (cell)->render (cell, window, widget, diff --git a/gtk/gtkcellrenderer.h b/gtk/gtkcellrenderer.h index ce9085d8b5..16e9ca97a5 100644 --- a/gtk/gtkcellrenderer.h +++ b/gtk/gtkcellrenderer.h @@ -69,6 +69,10 @@ struct _GtkCellRenderer guint visible : 1; guint is_expander : 1; guint is_expanded : 1; + + guint cell_background_set : 1; + + GdkColor cell_background; }; struct _GtkCellRendererClass diff --git a/gtk/gtktreeviewcolumn.c b/gtk/gtktreeviewcolumn.c index 6f7eb3e50d..d5db622c56 100644 --- a/gtk/gtktreeviewcolumn.c +++ b/gtk/gtktreeviewcolumn.c @@ -2326,11 +2326,13 @@ gtk_tree_view_column_cell_process_action (GtkTreeViewColumn *tree_column, { GList *list; GdkRectangle real_cell_area; + GdkRectangle real_background_area; gint expand_cell_count = 0; gint full_requested_width = 0; gint extra_space; gint min_x, min_y, max_x, max_y; gint focus_line_width; + gint dx; min_x = G_MAXINT; min_y = G_MAXINT; @@ -2338,6 +2340,8 @@ gtk_tree_view_column_cell_process_action (GtkTreeViewColumn *tree_column, max_y = 0; real_cell_area = *cell_area; + real_background_area = *background_area; + dx = real_cell_area.x - real_background_area.x; gtk_widget_style_get (GTK_WIDGET (tree_column->tree_view), "focus-line-width", &focus_line_width, @@ -2373,12 +2377,18 @@ gtk_tree_view_column_cell_process_action (GtkTreeViewColumn *tree_column, (info->expand?extra_space:0); info->real_width = real_cell_area.width; real_cell_area.x += focus_line_width; + + real_background_area.width = real_cell_area.width; + real_background_area.x += focus_line_width; + if (!list->prev) + real_background_area.width += dx; + if (action == CELL_ACTION_RENDER) { gtk_cell_renderer_render (info->cell, window, tree_column->tree_view, - background_area, + &real_background_area, &real_cell_area, expose_area, flags); @@ -2457,6 +2467,7 @@ gtk_tree_view_column_cell_process_action (GtkTreeViewColumn *tree_column, } } real_cell_area.x += (info->requested_width + tree_column->spacing); + real_background_area.x += (info->requested_width + tree_column->spacing); } for (list = g_list_last (tree_column->cell_list); list; list = list->prev) { @@ -2471,12 +2482,13 @@ gtk_tree_view_column_cell_process_action (GtkTreeViewColumn *tree_column, real_cell_area.width = info->requested_width + (info->expand?extra_space:0); info->real_width = real_cell_area.width; + real_background_area.width = real_background_area.width; if (action == CELL_ACTION_RENDER) { gtk_cell_renderer_render (info->cell, window, tree_column->tree_view, - background_area, + &real_background_area, &real_cell_area, expose_area, flags); @@ -2501,6 +2513,7 @@ gtk_tree_view_column_cell_process_action (GtkTreeViewColumn *tree_column, max_y = real_cell_area.y + y_offset + height; } real_cell_area.x += (info->requested_width + tree_column->spacing); + real_background_area.x += (info->requested_width + tree_column->spacing); } if (action == CELL_ACTION_FOCUS)