[gimp] app: change the default item line cap to round



commit b0a22bc28573e9aafde33a80c3337c6677fa4271
Author: Michael Natterer <mitch gimp org>
Date:   Sun Sep 26 17:40:10 2010 +0200

    app: change the default item line cap to round
    
    but add and API to configure it and set it to suare for handles which
    are always axis-aligned.

 app/display/gimpcanvashandle.c       |    3 +
 app/display/gimpcanvasitem.c         |  117 +++++++++++++++++++++++++++++++---
 app/display/gimpcanvasitem.h         |    2 +
 app/display/gimpdisplayshell-style.c |    2 -
 4 files changed, 113 insertions(+), 11 deletions(-)
---
diff --git a/app/display/gimpcanvashandle.c b/app/display/gimpcanvashandle.c
index e77034d..d13b83b 100644
--- a/app/display/gimpcanvashandle.c
+++ b/app/display/gimpcanvashandle.c
@@ -156,6 +156,9 @@ gimp_canvas_handle_init (GimpCanvasHandle *handle)
 {
   GimpCanvasHandlePrivate *private = GET_PRIVATE (handle);
 
+  gimp_canvas_item_set_line_cap (GIMP_CANVAS_ITEM (handle),
+                                 CAIRO_LINE_CAP_SQUARE);
+
   private->start_angle = 0.0;
   private->slice_angle = 2.0 * G_PI;
 }
diff --git a/app/display/gimpcanvasitem.c b/app/display/gimpcanvasitem.c
index 2bdf056..ed9a256 100644
--- a/app/display/gimpcanvasitem.c
+++ b/app/display/gimpcanvasitem.c
@@ -32,12 +32,21 @@
 #include "gimpdisplayshell-style.h"
 
 
+enum
+{
+  PROP_0,
+  PROP_LINE_CAP,
+  PROP_HIGHLIGHT
+};
+
+
 typedef struct _GimpCanvasItemPrivate GimpCanvasItemPrivate;
 
 struct _GimpCanvasItemPrivate
 {
-  gboolean highlight;
-  gint     suspend_stroking;
+  cairo_line_cap_t line_cap;
+  gboolean         highlight;
+  gint             suspend_stroking;
 };
 
 #define GET_PRIVATE(item) \
@@ -48,6 +57,15 @@ struct _GimpCanvasItemPrivate
 
 /*  local function prototypes  */
 
+static void        gimp_canvas_item_set_property     (GObject          *object,
+                                                      guint             property_id,
+                                                      const GValue     *value,
+                                                      GParamSpec       *pspec);
+static void        gimp_canvas_item_get_property     (GObject          *object,
+                                                      guint             property_id,
+                                                      GValue           *value,
+                                                      GParamSpec       *pspec);
+
 static void        gimp_canvas_item_real_draw        (GimpCanvasItem   *item,
                                                       GimpDisplayShell *shell,
                                                       cairo_t          *cr);
@@ -64,8 +82,27 @@ G_DEFINE_TYPE (GimpCanvasItem, gimp_canvas_item,
 static void
 gimp_canvas_item_class_init (GimpCanvasItemClass *klass)
 {
-  klass->draw        = gimp_canvas_item_real_draw;
-  klass->get_extents = gimp_canvas_item_real_get_extents;
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->set_property = gimp_canvas_item_set_property;
+  object_class->get_property = gimp_canvas_item_get_property;
+
+  klass->draw                = gimp_canvas_item_real_draw;
+  klass->get_extents         = gimp_canvas_item_real_get_extents;
+
+  g_object_class_install_property (object_class, PROP_LINE_CAP,
+                                   g_param_spec_int ("line-cap",
+                                                     NULL, NULL,
+                                                     CAIRO_LINE_CAP_BUTT,
+                                                     CAIRO_LINE_CAP_SQUARE,
+                                                     CAIRO_LINE_CAP_ROUND,
+                                                     GIMP_PARAM_READWRITE));
+
+  g_object_class_install_property (object_class, PROP_HIGHLIGHT,
+                                   g_param_spec_boolean ("highlight",
+                                                         NULL, NULL,
+                                                         FALSE,
+                                                         GIMP_PARAM_READWRITE));
 
   g_type_class_add_private (klass, sizeof (GimpCanvasItemPrivate));
 }
@@ -73,6 +110,57 @@ gimp_canvas_item_class_init (GimpCanvasItemClass *klass)
 static void
 gimp_canvas_item_init (GimpCanvasItem *item)
 {
+  GimpCanvasItemPrivate *private = GET_PRIVATE (item);
+
+  private->line_cap         = CAIRO_LINE_CAP_ROUND;
+  private->highlight        = FALSE;
+  private->suspend_stroking = 0;
+}
+
+static void
+gimp_canvas_item_set_property (GObject      *object,
+                               guint         property_id,
+                               const GValue *value,
+                               GParamSpec   *pspec)
+{
+  GimpCanvasItemPrivate *private = GET_PRIVATE (object);
+
+  switch (property_id)
+    {
+    case PROP_LINE_CAP:
+      private->line_cap = g_value_get_int (value);
+      break;
+    case PROP_HIGHLIGHT:
+      private->highlight = g_value_get_boolean (value);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+      break;
+    }
+}
+
+static void
+gimp_canvas_item_get_property (GObject    *object,
+                               guint       property_id,
+                               GValue     *value,
+                               GParamSpec *pspec)
+{
+  GimpCanvasItemPrivate *private = GET_PRIVATE (object);
+
+  switch (property_id)
+    {
+    case PROP_LINE_CAP:
+      g_value_set_int (value, private->line_cap);
+      break;
+    case PROP_HIGHLIGHT:
+      g_value_set_boolean (value, private->highlight);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+      break;
+    }
 }
 
 static void
@@ -120,16 +208,25 @@ gimp_canvas_item_get_extents (GimpCanvasItem   *item,
 }
 
 void
+gimp_canvas_item_set_line_cap (GimpCanvasItem   *item,
+                               cairo_line_cap_t  line_cap)
+{
+  g_return_if_fail (GIMP_IS_CANVAS_ITEM (item));
+
+  g_object_set (item,
+                "line-cap", line_cap,
+                NULL);
+}
+
+void
 gimp_canvas_item_set_highlight (GimpCanvasItem *item,
                                 gboolean        highlight)
 {
-  GimpCanvasItemPrivate *private;
-
   g_return_if_fail (GIMP_IS_CANVAS_ITEM (item));
 
-  private = GET_PRIVATE (item);
-
-  private->highlight = highlight ? TRUE : FALSE;
+  g_object_set (item,
+                "highlight", highlight,
+                NULL);
 }
 
 void
@@ -170,6 +267,8 @@ _gimp_canvas_item_stroke (GimpCanvasItem   *item,
 
   if (private->suspend_stroking == 0)
     {
+      cairo_set_line_cap (cr, private->line_cap);
+
       gimp_display_shell_set_tool_bg_style (shell, cr);
       cairo_stroke_preserve (cr);
 
diff --git a/app/display/gimpcanvasitem.h b/app/display/gimpcanvasitem.h
index fa14af6..4a3182e 100644
--- a/app/display/gimpcanvasitem.h
+++ b/app/display/gimpcanvasitem.h
@@ -60,6 +60,8 @@ void        gimp_canvas_item_draw             (GimpCanvasItem   *item,
 GdkRegion * gimp_canvas_item_get_extents      (GimpCanvasItem   *item,
                                                GimpDisplayShell *shell);
 
+void        gimp_canvas_item_set_line_cap     (GimpCanvasItem   *item,
+                                               cairo_line_cap_t  line_cap);
 void        gimp_canvas_item_set_highlight    (GimpCanvasItem   *item,
                                                gboolean          highlight);
 
diff --git a/app/display/gimpdisplayshell-style.c b/app/display/gimpdisplayshell-style.c
index 3feb98b..a78633a 100644
--- a/app/display/gimpdisplayshell-style.c
+++ b/app/display/gimpdisplayshell-style.c
@@ -330,7 +330,6 @@ gimp_display_shell_set_tool_bg_style (GimpDisplayShell *shell,
   g_return_if_fail (cr != NULL);
 
   cairo_set_line_width (cr, 3.0);
-  cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE);
   cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND);
 
   gimp_cairo_set_source_rgba (cr, &tool_bg);
@@ -345,7 +344,6 @@ gimp_display_shell_set_tool_fg_style (GimpDisplayShell *shell,
   g_return_if_fail (cr != NULL);
 
   cairo_set_line_width (cr, 1.0);
-  cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE);
   cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND);
 
   if (highlight)



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]