[gimp] app: don't let the vectors tool draw the active vectors



commit 5ab83e72ac2e4e0be5ef8b98edf870e60419ff67
Author: Sven Neumann <sven gimp org>
Date:   Sun Sep 12 00:08:17 2010 +0200

    app: don't let the vectors tool draw the active vectors
    
    Let the display shell deal with drawing the vectors. The vectors
    tool only draws the handles on the active vectors object.

 app/display/gimpdisplayshell-draw.c     |   54 +++++++++++++++++++--
 app/display/gimpdisplayshell-handlers.c |   18 +++++++
 app/tools/gimpdrawtool.h                |    2 -
 app/tools/gimpvectortool.c              |   77 ++++---------------------------
 4 files changed, 75 insertions(+), 76 deletions(-)
---
diff --git a/app/display/gimpdisplayshell-draw.c b/app/display/gimpdisplayshell-draw.c
index 65daa94..b93607b 100644
--- a/app/display/gimpdisplayshell-draw.c
+++ b/app/display/gimpdisplayshell-draw.c
@@ -584,10 +584,40 @@ gimp_display_shell_draw_selection_in (GimpDisplayShell   *shell,
 }
 
 static void
-gimp_display_shell_draw_one_vectors (GimpDisplayShell *shell,
-                                     cairo_t          *cr,
-                                     GimpVectors      *vectors,
-                                     gdouble           width)
+gimp_display_shell_draw_active_vectors (GimpDisplayShell *shell,
+                                        cairo_t          *cr,
+                                        GimpVectors      *vectors,
+                                        gdouble           width)
+{
+  GimpStroke *stroke = NULL;
+
+  while ((stroke = gimp_vectors_stroke_get_next (vectors, stroke)))
+    {
+      GimpBezierDesc *desc = gimp_vectors_make_bezier (vectors);
+
+      if (desc)
+        {
+          cairo_append_path (cr, (cairo_path_t *) desc);
+
+          cairo_set_line_width (cr, 1.6 * width);
+          cairo_set_source_rgb (cr, 0.0, 0.7, 1.0);
+          cairo_stroke_preserve (cr);
+
+          cairo_set_line_width (cr, width);
+          cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
+          cairo_stroke (cr);
+
+          g_free (desc->data);
+          g_free (desc);
+        }
+    }
+}
+
+static void
+gimp_display_shell_draw_inactive_vectors (GimpDisplayShell *shell,
+                                          cairo_t          *cr,
+                                          GimpVectors      *vectors,
+                                          gdouble           width)
 {
   GimpStroke *stroke = NULL;
 
@@ -612,6 +642,7 @@ gimp_display_shell_draw_one_vectors (GimpDisplayShell *shell,
         }
     }
 }
+
 void
 gimp_display_shell_draw_vectors (GimpDisplayShell *shell,
                                  cairo_t          *cr)
@@ -625,6 +656,7 @@ gimp_display_shell_draw_vectors (GimpDisplayShell *shell,
   if (image && TRUE /* gimp_display_shell_get_show_vectors (shell) */)
     {
       GList       *all_vectors = gimp_image_get_vectors_list (image);
+      GimpVectors *active      = gimp_image_get_active_vectors (image);
       const GList *list;
       gdouble      xscale;
       gdouble      yscale;
@@ -646,8 +678,18 @@ gimp_display_shell_draw_vectors (GimpDisplayShell *shell,
         {
           GimpVectors *vectors = list->data;
 
-          if (gimp_item_get_visible (GIMP_ITEM (vectors)))
-            gimp_display_shell_draw_one_vectors (shell, cr, vectors, width);
+          if (vectors != active &&
+              gimp_item_get_visible (GIMP_ITEM (vectors)))
+            {
+              gimp_display_shell_draw_inactive_vectors (shell, cr,
+                                                        vectors, width);
+            }
+        }
+
+      /*  the active vector is always rendered on top  */
+      if (active)
+        {
+          gimp_display_shell_draw_active_vectors (shell, cr, active, width);
         }
 
       g_list_free (all_vectors);
diff --git a/app/display/gimpdisplayshell-handlers.c b/app/display/gimpdisplayshell-handlers.c
index 9e03122..cf80fa3 100644
--- a/app/display/gimpdisplayshell-handlers.c
+++ b/app/display/gimpdisplayshell-handlers.c
@@ -104,6 +104,9 @@ static void   gimp_display_shell_exported_handler           (GimpImage        *i
                                                              const gchar      *uri,
                                                              GimpDisplayShell *shell);
 
+static void   gimp_display_shell_active_vectors_handler     (GimpImage        *image,
+                                                             GimpDisplayShell *shell);
+
 static void   gimp_display_shell_vectors_freeze_handler     (GimpVectors      *vectors,
                                                              GimpDisplayShell *shell);
 static void   gimp_display_shell_vectors_thaw_handler       (GimpVectors      *vectors,
@@ -202,6 +205,10 @@ gimp_display_shell_connect (GimpDisplayShell *shell)
                     G_CALLBACK (gimp_display_shell_exported_handler),
                     shell);
 
+  g_signal_connect (image, "active-vectors-changed",
+                    G_CALLBACK (gimp_display_shell_active_vectors_handler),
+                    shell);
+
   shell->vectors_freeze_handler =
     gimp_tree_handler_connect (vectors, "freeze",
                                G_CALLBACK (gimp_display_shell_vectors_freeze_handler),
@@ -346,6 +353,10 @@ gimp_display_shell_disconnect (GimpDisplayShell *shell)
   shell->vectors_freeze_handler = NULL;
 
   g_signal_handlers_disconnect_by_func (image,
+                                        gimp_display_shell_active_vectors_handler,
+                                        shell);
+
+  g_signal_handlers_disconnect_by_func (image,
                                         gimp_display_shell_exported_handler,
                                         shell);
   g_signal_handlers_disconnect_by_func (image,
@@ -604,6 +615,13 @@ gimp_display_shell_exported_handler (GimpImage        *image,
 }
 
 static void
+gimp_display_shell_active_vectors_handler (GimpImage        *image,
+                                           GimpDisplayShell *shell)
+{
+  gimp_display_shell_expose_full (shell);
+}
+
+static void
 gimp_display_shell_vectors_freeze_handler (GimpVectors      *vectors,
                                            GimpDisplayShell *shell)
 {
diff --git a/app/tools/gimpdrawtool.h b/app/tools/gimpdrawtool.h
index 0b7894b..f4616e6 100644
--- a/app/tools/gimpdrawtool.h
+++ b/app/tools/gimpdrawtool.h
@@ -78,8 +78,6 @@ void       gimp_draw_tool_resume                   (GimpDrawTool     *draw_tool)
 
 gboolean   gimp_draw_tool_is_drawn                 (GimpDrawTool     *draw_tool);
 
-void       gimp_draw_tool_set_vectors              (GimpDrawTool     *draw_tool,
-                                                    GList            *vectors);
 void       gimp_draw_tool_set_transform            (GimpDrawTool     *draw_tool,
                                                     GimpMatrix3      *transform);
 
diff --git a/app/tools/gimpvectortool.c b/app/tools/gimpvectortool.c
index 5a57a68..5b870db 100644
--- a/app/tools/gimpvectortool.c
+++ b/app/tools/gimpvectortool.c
@@ -118,8 +118,6 @@ static void     gimp_vector_tool_vectors_changed (GimpImage             *image,
                                                   GimpVectorTool        *vector_tool);
 static void     gimp_vector_tool_vectors_removed (GimpVectors           *vectors,
                                                   GimpVectorTool        *vector_tool);
-static void     gimp_vector_tool_vectors_visible (GimpVectors           *vectors,
-                                                  GimpVectorTool        *vector_tool);
 static void     gimp_vector_tool_vectors_freeze  (GimpVectors           *vectors,
                                                   GimpVectorTool        *vector_tool);
 static void     gimp_vector_tool_vectors_thaw    (GimpVectors           *vectors,
@@ -1399,18 +1397,15 @@ gimp_vector_tool_cursor_update (GimpTool         *tool,
 static void
 gimp_vector_tool_draw (GimpDrawTool *draw_tool)
 {
-  GimpVectorTool  *vector_tool = GIMP_VECTOR_TOOL (draw_tool);
-  GimpAnchor      *cur_anchor  = NULL;
-  GimpStroke      *cur_stroke  = NULL;
-  GimpVectors     *vectors;
-  GArray          *coords;
-  gboolean         closed;
-  GList           *draw_anchors;
-  GList           *list;
-
-  vectors = vector_tool->vectors;
-
-  if (!vectors)
+  GimpVectorTool *vector_tool = GIMP_VECTOR_TOOL (draw_tool);
+  GimpVectors    *vectors     = vector_tool->vectors;
+  GimpAnchor     *cur_anchor  = NULL;
+  GimpStroke     *cur_stroke  = NULL;
+  GArray         *coords;
+  GList          *draw_anchors;
+  GList          *list;
+
+  if (! vectors)
     return;
 
   while ((cur_stroke = gimp_vectors_stroke_get_next (vectors, cur_stroke)))
@@ -1483,23 +1478,6 @@ gimp_vector_tool_draw (GimpDrawTool *draw_tool)
               g_array_free (coords, TRUE);
             }
         }
-
-      /* the stroke itself */
-      if (! gimp_item_get_visible (GIMP_ITEM (vectors)))
-        {
-          coords = gimp_stroke_interpolate (cur_stroke, 1.0, &closed);
-
-          if (coords)
-            {
-              if (coords->len)
-                gimp_draw_tool_draw_strokes (draw_tool,
-                                             &g_array_index (coords,
-                                                             GimpCoords, 0),
-                                             coords->len, FALSE, FALSE);
-
-              g_array_free (coords, TRUE);
-            }
-        }
     }
 }
 
@@ -1519,37 +1497,6 @@ gimp_vector_tool_vectors_removed (GimpVectors    *vectors,
 }
 
 static void
-gimp_vector_tool_vectors_visible (GimpVectors    *vectors,
-                                  GimpVectorTool *vector_tool)
-{
-  GimpDrawTool *draw_tool = GIMP_DRAW_TOOL (vector_tool);
-
-  if (gimp_draw_tool_is_active (draw_tool) && draw_tool->paused_count == 0)
-    {
-      GimpStroke *stroke = NULL;
-
-      while ((stroke = gimp_vectors_stroke_get_next (vectors, stroke)))
-        {
-          GArray   *coords;
-          gboolean  closed;
-
-          coords = gimp_stroke_interpolate (stroke, 1.0, &closed);
-
-          if (coords)
-            {
-              if (coords->len)
-                gimp_draw_tool_draw_strokes (draw_tool,
-                                             &g_array_index (coords,
-                                                             GimpCoords, 0),
-                                             coords->len, FALSE, FALSE);
-
-              g_array_free (coords, TRUE);
-            }
-        }
-    }
-}
-
-static void
 gimp_vector_tool_vectors_freeze (GimpVectors    *vectors,
                                  GimpVectorTool *vector_tool)
 {
@@ -1611,9 +1558,6 @@ gimp_vector_tool_set_vectors (GimpVectorTool *vector_tool,
                                             gimp_vector_tool_vectors_removed,
                                             vector_tool);
       g_signal_handlers_disconnect_by_func (vector_tool->vectors,
-                                            gimp_vector_tool_vectors_visible,
-                                            vector_tool);
-      g_signal_handlers_disconnect_by_func (vector_tool->vectors,
                                             gimp_vector_tool_vectors_freeze,
                                             vector_tool);
       g_signal_handlers_disconnect_by_func (vector_tool->vectors,
@@ -1665,9 +1609,6 @@ gimp_vector_tool_set_vectors (GimpVectorTool *vector_tool,
   g_signal_connect_object (vectors, "removed",
                            G_CALLBACK (gimp_vector_tool_vectors_removed),
                            vector_tool, 0);
-  g_signal_connect_object (vectors, "visibility-changed",
-                           G_CALLBACK (gimp_vector_tool_vectors_visible),
-                           vector_tool, 0);
   g_signal_connect_object (vectors, "freeze",
                            G_CALLBACK (gimp_vector_tool_vectors_freeze),
                            vector_tool, 0);



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