aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/table/e-table-header-utils.c
diff options
context:
space:
mode:
authorCosimo Cecchi <cosimoc@gnome.org>2011-09-30 23:34:38 +0800
committerMatthew Barnes <mbarnes@redhat.com>2011-09-30 23:44:21 +0800
commitb73a8f243ea4446f39012d7a64c107c25ff6d854 (patch)
tree1fce505e0670540cff0fd9ede4a822e75b89e20c /widgets/table/e-table-header-utils.c
parent6b1663a63d6d49fa9a74420a61c126a3f7ab390a (diff)
downloadgsoc2013-evolution-b73a8f243ea4446f39012d7a64c107c25ff6d854.tar
gsoc2013-evolution-b73a8f243ea4446f39012d7a64c107c25ff6d854.tar.gz
gsoc2013-evolution-b73a8f243ea4446f39012d7a64c107c25ff6d854.tar.bz2
gsoc2013-evolution-b73a8f243ea4446f39012d7a64c107c25ff6d854.tar.lz
gsoc2013-evolution-b73a8f243ea4446f39012d7a64c107c25ff6d854.tar.xz
gsoc2013-evolution-b73a8f243ea4446f39012d7a64c107c25ff6d854.tar.zst
gsoc2013-evolution-b73a8f243ea4446f39012d7a64c107c25ff6d854.zip
ETableHeader: Rework the header button drawing code for GTK+ 3
The code in ETable that draws the button headers is outdated, and uses deprecated gtk_paint_* functions mixed with cairo. Port the code to use the GtkStyleContext API, which allows themes to give the header the same appearance of a regular GtkTreeView header.
Diffstat (limited to 'widgets/table/e-table-header-utils.c')
-rw-r--r--widgets/table/e-table-header-utils.c119
1 files changed, 61 insertions, 58 deletions
diff --git a/widgets/table/e-table-header-utils.c b/widgets/table/e-table-header-utils.c
index 34f93a701b..431009016f 100644
--- a/widgets/table/e-table-header-utils.c
+++ b/widgets/table/e-table-header-utils.c
@@ -60,6 +60,23 @@ build_header_layout (GtkWidget *widget,
return layout;
}
+static void
+get_button_padding (GtkWidget *widget,
+ GtkBorder *padding)
+{
+ GtkStyleContext *context;
+ GtkStateFlags state_flags;
+
+ context = gtk_widget_get_style_context (widget);
+ state_flags = gtk_widget_get_state_flags (widget);
+
+ gtk_style_context_save (context);
+ gtk_style_context_add_class (context, GTK_STYLE_CLASS_BUTTON);
+ gtk_style_context_get_padding (context, state_flags, padding);
+
+ gtk_style_context_restore (context);
+}
+
/**
* e_table_header_compute_height:
* @ecol: Table column description.
@@ -73,15 +90,15 @@ gdouble
e_table_header_compute_height (ETableCol *ecol,
GtkWidget *widget)
{
- gint ythick;
gint height;
PangoLayout *layout;
+ GtkBorder padding;
g_return_val_if_fail (ecol != NULL, -1);
g_return_val_if_fail (E_IS_TABLE_COL (ecol), -1);
g_return_val_if_fail (GTK_IS_WIDGET (widget), -1);
- ythick = gtk_widget_get_style (widget)->ythickness;
+ get_button_padding (widget, &padding);
layout = build_header_layout (widget, ecol->text);
@@ -93,8 +110,7 @@ e_table_header_compute_height (ETableCol *ecol,
}
height = MAX (height, MIN_ARROW_SIZE);
-
- height += 2 * (ythick + HEADER_PADDING);
+ height += padding.top + padding.bottom + 2 * HEADER_PADDING;
g_object_unref (layout);
@@ -102,11 +118,12 @@ e_table_header_compute_height (ETableCol *ecol,
}
gdouble
-e_table_header_width_extras (GtkStyle *style)
+e_table_header_width_extras (GtkWidget *widget)
{
- g_return_val_if_fail (style != NULL, -1);
+ GtkBorder padding;
- return 2 * (style->xthickness + HEADER_PADDING);
+ get_button_padding (widget, &padding);
+ return padding.left + padding.right + 2 * HEADER_PADDING;
}
/* Creates a pixmap that is a composite of a background color and the upper-left
@@ -233,8 +250,6 @@ make_composite_pixmap (GdkDrawable *drawable,
* e_table_header_draw_button:
* @drawable: Destination drawable.
* @ecol: Table column for the header information.
- * @style: Style to use for drawing the button.
- * @state: State of the table widget.
* @widget: The table widget.
* @x: Leftmost coordinate of the button.
* @y: Topmost coordinate of the button.
@@ -249,8 +264,6 @@ make_composite_pixmap (GdkDrawable *drawable,
void
e_table_header_draw_button (cairo_t *cr,
ETableCol *ecol,
- GtkStyle *style,
- GtkStateType state,
GtkWidget *widget,
gint x,
gint y,
@@ -260,58 +273,49 @@ e_table_header_draw_button (cairo_t *cr,
gint button_height,
ETableColArrow arrow)
{
- gint xthick, ythick;
gint inner_x, inner_y;
gint inner_width, inner_height;
gint arrow_width = 0, arrow_height = 0;
PangoLayout *layout;
- static gpointer g_label = NULL;
+ GtkStyleContext *context;
+ GtkBorder padding;
+ GtkStateFlags state_flags;
g_return_if_fail (cr != NULL);
g_return_if_fail (ecol != NULL);
g_return_if_fail (E_IS_TABLE_COL (ecol));
- g_return_if_fail (style != NULL);
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_WIDGET (widget));
g_return_if_fail (button_width > 0 && button_height > 0);
- if (g_label == NULL) {
- GtkWidget *button = gtk_button_new_with_label("Hi");
- GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_container_add (GTK_CONTAINER (window), button);
- gtk_widget_ensure_style (window);
- gtk_widget_ensure_style (button);
- g_label = gtk_bin_get_child (GTK_BIN (button));
- g_object_add_weak_pointer (G_OBJECT (g_label), &g_label);
- gtk_widget_ensure_style (g_label);
- gtk_widget_realize (g_label);
- }
-
- cairo_save (cr);
- gdk_cairo_set_source_color (
- cr, &gtk_widget_get_style (GTK_WIDGET (g_label))->fg[state]);
+ /* Button bevel */
+ context = gtk_widget_get_style_context (widget);
+ state_flags = gtk_widget_get_state_flags (widget);
- xthick = style->xthickness;
- ythick = style->ythickness;
+ gtk_style_context_save (context);
+ gtk_style_context_set_state (context, state_flags);
+ gtk_style_context_add_class (context, GTK_STYLE_CLASS_BUTTON);
- /* Button bevel */
+ gtk_style_context_get_padding (context, state_flags, &padding);
- gtk_paint_box (style, cr, state, GTK_SHADOW_OUT,
- widget, "button",
- x, y, button_width, button_height);
+ gtk_render_background (
+ context, cr, x, y,
+ button_width, button_height);
+ gtk_render_frame (
+ context, cr, x, y,
+ button_width, button_height);
/* Inside area */
- inner_width = button_width - 2 * (xthick + HEADER_PADDING);
- inner_height = button_height - 2 * (ythick + HEADER_PADDING);
+ inner_width = button_width - (padding.left + padding.right + 2 * HEADER_PADDING);
+ inner_height = button_height - (padding.top + padding.bottom + 2 * HEADER_PADDING);
if (inner_width < 1 || inner_height < 1) {
- cairo_restore (cr);
return; /* nothing fits */
}
- inner_x = x + xthick + HEADER_PADDING;
- inner_y = y + ythick + HEADER_PADDING;
+ inner_x = x + padding.left + HEADER_PADDING;
+ inner_y = y + padding.top + HEADER_PADDING;
/* Arrow space */
@@ -328,12 +332,11 @@ e_table_header_draw_button (cairo_t *cr,
inner_width -= arrow_width + HEADER_PADDING;
break;
default:
- cairo_restore (cr);
g_return_if_reached ();
}
if (inner_width < 1) {
- cairo_restore (cr);
+ gtk_style_context_restore (context);
return; /* nothing else fits */
}
@@ -370,18 +373,19 @@ e_table_header_draw_button (cairo_t *cr,
layout, (inner_width - (xpos - inner_x)) *
PANGO_SCALE);
- cairo_move_to (cr, xpos + pwidth + 1, ypos);
- pango_cairo_show_layout (cr, layout);
+ gtk_render_layout (
+ context, cr, xpos + pwidth + 1,
+ ypos, layout);
}
- gdk_cairo_set_source_pixbuf (cr, ecol->pixbuf,
- xpos, inner_y + (inner_height - clip_height) / 2);
- cairo_paint (cr);
+ gtk_render_icon (
+ context, cr, ecol->pixbuf, xpos,
+ inner_y + (inner_height - clip_height) / 2);
+
} else {
pango_layout_set_width (layout, inner_width * PANGO_SCALE);
- cairo_move_to (cr, inner_x, inner_y);
- pango_cairo_show_layout (cr, layout);
+ gtk_render_layout (context, cr, inner_x, inner_y, layout);
}
switch (arrow) {
@@ -393,21 +397,20 @@ e_table_header_draw_button (cairo_t *cr,
if (ecol->icon_name == NULL)
inner_width += arrow_width + HEADER_PADDING;
- gtk_paint_arrow (style, cr, state,
- GTK_SHADOW_NONE, widget, "header",
- (arrow == E_TABLE_COL_ARROW_UP) ? GTK_ARROW_UP : GTK_ARROW_DOWN,
- (ecol->icon_name == NULL),
- inner_x + inner_width - arrow_width,
- inner_y + (inner_height - arrow_height) / 2,
- arrow_width, arrow_height);
+ gtk_render_arrow (
+ context, cr,
+ (arrow == E_TABLE_COL_ARROW_UP) ? 0 : G_PI,
+ inner_x + inner_width - arrow_width,
+ inner_y + (inner_height - arrow_height) / 2,
+ MAX (arrow_width, arrow_height));
+
break;
}
default:
- cairo_restore (cr);
g_return_if_reached ();
}
g_object_unref (layout);
- cairo_restore (cr);
+ gtk_style_context_restore (context);
}