[gnome-control-center] Use cairo to draw an arrow
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-control-center] Use cairo to draw an arrow
- Date: Tue, 25 Jan 2011 04:43:22 +0000 (UTC)
commit f503381455a1fbca112553e79e9e786466879290
Author: Matthias Clasen <mclasen redhat com>
Date: Mon Jan 24 23:42:27 2011 -0500
Use cairo to draw an arrow
Misusing gtk_paint_expander() turned out to not be a good
idea, now that the theme has started to draw +/- for expanders
instead of arrows.
panels/user-accounts/Makefile.am | 3 +-
panels/user-accounts/um-password-dialog.c | 13 ++----
panels/user-accounts/um-photo-dialog.c | 13 ++----
panels/user-accounts/um-utils.c | 62 +++++++++++++++++++++++++++++
panels/user-accounts/um-utils.h | 7 +++
5 files changed, 81 insertions(+), 17 deletions(-)
---
diff --git a/panels/user-accounts/Makefile.am b/panels/user-accounts/Makefile.am
index 583af08..d216503 100644
--- a/panels/user-accounts/Makefile.am
+++ b/panels/user-accounts/Makefile.am
@@ -82,7 +82,8 @@ libuser_accounts_la_LIBADD = \
$(GIO_LIBS) \
$(CAPPLET_LIBS) \
$(top_builddir)/panels/common/liblanguage.la \
- -lcrypt
+ -lcrypt \
+ -lm
libuser_accounts_la_LDFLAGS = $(PANEL_LDFLAGS)
diff --git a/panels/user-accounts/um-password-dialog.c b/panels/user-accounts/um-password-dialog.c
index a7c9223..feff4d4 100644
--- a/panels/user-accounts/um-password-dialog.c
+++ b/panels/user-accounts/um-password-dialog.c
@@ -84,14 +84,11 @@ generate_draw (GtkWidget *widget,
if (!gtk_widget_is_sensitive (widget))
return;
- gtk_paint_expander (gtk_widget_get_style (widget),
- cr,
- gtk_widget_get_state (widget),
- widget,
- NULL,
- gtk_widget_get_allocated_width (widget) - 12,
- gtk_widget_get_allocated_height (widget) - 12,
- GTK_EXPANDER_EXPANDED);
+ down_arrow (gtk_widget_get_style_context (widget),
+ cr,
+ gtk_widget_get_allocated_width (widget) - 12,
+ gtk_widget_get_allocated_height (widget) - 12,
+ 12, 12);
}
static void
diff --git a/panels/user-accounts/um-photo-dialog.c b/panels/user-accounts/um-photo-dialog.c
index d632948..ef9c2fd 100644
--- a/panels/user-accounts/um-photo-dialog.c
+++ b/panels/user-accounts/um-photo-dialog.c
@@ -522,14 +522,11 @@ popup_button_draw (GtkWidget *widget,
return;
}
- gtk_paint_expander (gtk_widget_get_style (widget),
- cr,
- gtk_widget_get_state (widget),
- widget,
- NULL,
- gtk_widget_get_allocated_width (widget) - 12,
- gtk_widget_get_allocated_height (widget) - 12,
- GTK_EXPANDER_EXPANDED);
+ down_arrow (gtk_widget_get_style_context (widget),
+ cr,
+ gtk_widget_get_allocated_width (widget) - 12,
+ gtk_widget_get_allocated_height (widget) - 12,
+ 12, 12);
}
static void
diff --git a/panels/user-accounts/um-utils.c b/panels/user-accounts/um-utils.c
index 86a8add..d2de050 100644
--- a/panels/user-accounts/um-utils.c
+++ b/panels/user-accounts/um-utils.c
@@ -21,6 +21,8 @@
#include "config.h"
+#include <math.h>
+
#include <glib.h>
#include <glib/gi18n.h>
@@ -380,3 +382,63 @@ rounded_rectangle (cairo_t *cr,
cairo_close_path (cr);
}
+void
+down_arrow (GtkStyleContext *context,
+ cairo_t *cr,
+ gint x,
+ gint y,
+ gint width,
+ gint height)
+{
+ GtkStateFlags flags;
+ GdkRGBA fg_color;
+ GdkRGBA outline_color;
+ gdouble vertical_overshoot;
+ gint diameter;
+ gdouble radius;
+ gdouble x_double, y_double;
+ gdouble angle;
+ gint line_width;
+
+ flags = gtk_style_context_get_state (context);
+
+ gtk_style_context_get_color (context, flags, &fg_color);
+ gtk_style_context_get_border_color (context, flags, &outline_color);
+
+ line_width = 1;
+ angle = G_PI / 2;
+ vertical_overshoot = line_width / 2.0 * (1. / tan (G_PI / 8));
+ if (line_width % 2 == 1)
+ vertical_overshoot = ceil (0.5 + vertical_overshoot) - 0.5;
+ else
+ vertical_overshoot = ceil (vertical_overshoot);
+ diameter = (gint) MAX (3, width - 2 * vertical_overshoot);
+ diameter -= (1 - (diameter + line_width) % 2);
+ radius = diameter / 2.;
+ x_double = floor ((x + width / 2) - (radius + line_width) / 2.) + (radius + line_width) / 2.;
+
+ y_double = (y + height / 2) - 0.5;
+
+ cairo_save (cr);
+
+ cairo_translate (cr, x_double, y_double);
+ cairo_rotate (cr, angle);
+
+ cairo_move_to (cr, - radius / 2., - radius);
+ cairo_line_to (cr, radius / 2., 0);
+ cairo_line_to (cr, - radius / 2., radius);
+
+ cairo_close_path (cr);
+
+ cairo_set_line_width (cr, line_width);
+
+ gdk_cairo_set_source_rgba (cr, &fg_color);
+
+ cairo_fill_preserve (cr);
+
+ gdk_cairo_set_source_rgba (cr, &outline_color);
+ cairo_stroke (cr);
+
+ cairo_restore (cr);
+}
+
diff --git a/panels/user-accounts/um-utils.h b/panels/user-accounts/um-utils.h
index d6a227e..d1c565d 100644
--- a/panels/user-accounts/um-utils.h
+++ b/panels/user-accounts/um-utils.h
@@ -51,6 +51,13 @@ void rounded_rectangle (cairo_t *cr,
gdouble width,
gdouble height);
+void down_arrow (GtkStyleContext *context,
+ cairo_t *cr,
+ gint x,
+ gint y,
+ gint width,
+ gint height);
+
G_END_DECLS
#endif
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]