[gnome-control-center] Use cairo to draw an arrow



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]