Change rounded_rectange to support per-corner flag for rounded and use it for all...
authorArtem Garmash <artemgarmash@gmail.com>
Sun, 24 Jan 2010 17:04:57 +0000 (19:04 +0200)
committerArtem Garmash <artem.garmash@nokia.com>
Sun, 27 Jun 2010 19:13:44 +0000 (22:13 +0300)
src/el-home-applet.c

index 606b92e..44dcf4b 100644 (file)
@@ -154,34 +154,79 @@ el_home_applet_realize (GtkWidget *widget)
         GTK_WIDGET_CLASS (el_home_applet_parent_class)->realize (widget);
 }
 
-/*
- * Thanks http://cairographics.org/cookbook/roundedrectangles/
+enum {
+        ROUND_CORNER_TL = 1,
+        ROUND_CORNER_TR = 1<<1,
+        ROUND_CORNER_BL = 1<<2,
+        ROUND_CORNER_BR = 1<<3,
+        ROUND_CORNER_ALL = ROUND_CORNER_TL | ROUND_CORNER_TR |
+                           ROUND_CORNER_BL | ROUND_CORNER_BR
+};
+
+/**
+ * Draw rectangle with optional round corners.
+ *
+ * @x
+ * @y
+ * @w width
+ * @h height
+ * @r round corner radious
+ * @round_corners define which corners draw round, ROUND_CORNER_TL,
+ *                ROUND_CORNER_TR, ROUND_CORNER_BL, ROUND_CORNER_BR
  */
 static void
 rounded_rectangle (cairo_t *cr,
-                   double   x,
-                   double   y,
-                   double   w,
-                   double   h,
-                   double   r)
+                   double x,
+                   double y,
+                   double w,
+                   double h,
+                   double r,
+                   guint round_corners)
 {
-        cairo_move_to (cr, x + r, y);
-        cairo_line_to (cr, x + w - r, y);
-        cairo_curve_to (cr, x + w, y,
-                        x + w, y,
-                        x + w, y + r);
-        cairo_line_to (cr, x + w, y + h - r);
-        cairo_curve_to (cr, x + w, y + h,
-                        x + w, y + h,
-                        x + w - r, y + h);
-        cairo_line_to (cr, x + r, y + h);
-        cairo_curve_to (cr, x, y + h,
-                        x, y + h,
-                        x, y + h - r);
-        cairo_line_to (cr, x, y + r);
-        cairo_curve_to (cr, x, y,
-                        x, y,
-                        x + r, y);
+        if (round_corners & ROUND_CORNER_TL)
+                cairo_move_to (cr, x + r, y);
+        else
+                cairo_move_to (cr, x, y);
+
+        if (round_corners & ROUND_CORNER_TR) {
+                cairo_line_to (cr, x + w - r, y);
+                cairo_rel_curve_to (cr,
+                                    r, 0,
+                                    r, 0,
+                                    r, r);
+        }
+        else
+                cairo_line_to (cr, x + w, y);
+
+        if (round_corners & ROUND_CORNER_BR) {
+                cairo_line_to (cr, x + w, y + h - r);
+                cairo_rel_curve_to (cr,
+                                    0, r,
+                                    0, r,
+                                    -r, r);
+        }
+        else
+                cairo_line_to (cr, x + w, y + h);
+
+        if (round_corners & ROUND_CORNER_BL) {
+                cairo_line_to (cr, x + r, y + h);
+                cairo_rel_curve_to (cr,
+                                    -r, 0,
+                                    -r, 0,
+                                    -r, -r);
+        }
+        else
+                cairo_line_to (cr, x, y + h);
+
+        if (round_corners & ROUND_CORNER_TL) {
+                cairo_line_to (cr, x, y + r);
+                cairo_rel_curve_to (cr,
+                                    0, -r,
+                                    0, -r,
+                                    r, -r);
+        }
+        else
+                cairo_line_to (cr, x, y);
 }
 
 static cairo_surface_t*
@@ -332,7 +377,8 @@ expose_event (GtkWidget *self, GdkEventExpose *event)
                            CONTENT_OFFSET_Y_TOP,
                            BOX_WIDTH - 2*CONTENT_OFFSET_X,
                            BOX_HEIGHT - (CONTENT_OFFSET_Y_TOP + CONTENT_OFFSET_Y_BOTTOM),
-                           BOX_RADIOUS);
+                           BOX_RADIOUS,
+                           ROUND_CORNER_ALL);
 
         cairo_close_path (cr);
         cairo_stroke (cr);
@@ -341,14 +387,11 @@ expose_event (GtkWidget *self, GdkEventExpose *event)
         cairo_set_line_width (cr, 1.0f);
 
         cairo_translate (cr, CONTENT_OFFSET_X, CONTENT_OFFSET_Y_TOP);
-        cairo_move_to (cr, 0, HEADER_HEIGHT);
-        cairo_line_to (cr, 0, BOX_RADIOUS);
-        cairo_curve_to (cr, 0, 0, 0, 0, BOX_RADIOUS, 0);
-        cairo_line_to (cr, C_WIDTH - BOX_RADIOUS, 0);
-        cairo_curve_to (cr, C_WIDTH, 0, C_WIDTH, 0, C_WIDTH, BOX_RADIOUS);
-        cairo_line_to (cr, C_WIDTH, HEADER_HEIGHT);
-        cairo_line_to (cr, 0, HEADER_HEIGHT);
-
+        rounded_rectangle (cr,
+                           0, 0,
+                           C_WIDTH, HEADER_HEIGHT,
+                           BOX_RADIOUS,
+                           ROUND_CORNER_TL | ROUND_CORNER_TR);
         cairo_close_path (cr);
 
         switch (priv->active) {
@@ -376,13 +419,11 @@ expose_event (GtkWidget *self, GdkEventExpose *event)
 
         /* draw body */
         if (!priv->message) {
-                cairo_move_to (cr, 0, HEADER_HEIGHT);
-                cairo_line_to (cr, 0, C_HEIGHT - BOX_RADIOUS);
-                cairo_curve_to (cr, 0, C_HEIGHT, 0, C_HEIGHT, BOX_RADIOUS, C_HEIGHT);
-                cairo_line_to (cr, C_WIDTH - BOX_RADIOUS, C_HEIGHT);
-                cairo_curve_to (cr, C_WIDTH, C_HEIGHT, C_WIDTH, C_HEIGHT, C_WIDTH, C_HEIGHT - BOX_RADIOUS);
-                cairo_line_to (cr, C_WIDTH, HEADER_HEIGHT);
-                cairo_line_to (cr, 0, HEADER_HEIGHT);
+                rounded_rectangle (cr,
+                                   0, HEADER_HEIGHT,
+                                   C_WIDTH, C_HEIGHT,
+                                   BOX_RADIOUS,
+                                   ROUND_CORNER_BL | ROUND_CORNER_BR);
                 cairo_close_path (cr);
         }
         else
@@ -422,12 +463,11 @@ expose_event (GtkWidget *self, GdkEventExpose *event)
 
         if (priv->message) {
                 /* draw footer unread part bg */
-                cairo_move_to (cr, 0, C_HEIGHT - FOOTER_HEIGHT);
-                cairo_line_to (cr, 0, C_HEIGHT - BOX_RADIOUS);
-                cairo_curve_to (cr, 0, C_HEIGHT, 0, C_HEIGHT, BOX_RADIOUS, C_HEIGHT);
-                cairo_line_to (cr, FOOTER_WIDTH, C_HEIGHT);
-                cairo_line_to (cr, FOOTER_WIDTH, C_HEIGHT - FOOTER_HEIGHT);
-                cairo_line_to (cr, 0, C_HEIGHT - FOOTER_HEIGHT);
+                rounded_rectangle (cr,
+                                   0, C_HEIGHT - FOOTER_HEIGHT,
+                                   FOOTER_WIDTH, FOOTER_HEIGHT,
+                                   BOX_RADIOUS,
+                                   ROUND_CORNER_BL);
                 cairo_close_path (cr);
 
                 /* draw body filling depending on (in)active state */
@@ -445,12 +485,11 @@ expose_event (GtkWidget *self, GdkEventExpose *event)
                 cairo_fill (cr);
 
                 /* draw footer received part bg */
-                cairo_move_to (cr, FOOTER_WIDTH, C_HEIGHT - FOOTER_HEIGHT);
-                cairo_rel_line_to (cr, 0, FOOTER_HEIGHT);
-                cairo_rel_line_to (cr, C_WIDTH - FOOTER_WIDTH - BOX_RADIOUS, 0);
-                cairo_rel_curve_to (cr, BOX_RADIOUS, 0, BOX_RADIOUS, 0, BOX_RADIOUS, -BOX_RADIOUS);
-                cairo_rel_line_to (cr, 0, -(FOOTER_HEIGHT - BOX_RADIOUS));
-                cairo_rel_line_to (cr, -(C_WIDTH - FOOTER_WIDTH), 0);
+                rounded_rectangle (cr,
+                                   FOOTER_WIDTH, C_HEIGHT - FOOTER_HEIGHT,
+                                   C_WIDTH - FOOTER_WIDTH, FOOTER_HEIGHT,
+                                   BOX_RADIOUS,
+                                   ROUND_CORNER_BR);
                 cairo_close_path (cr);
 
                 cairo_set_source_rgba (cr, 0.2f, 0.2f, 0.2f, 0.8f);