[gimp/soc-2013-n-point-deformation-tool: 4/23] app: npd-tool: move (multi)selected control points



commit 6594433aa01a726c9a5d44891e75a24e99449245
Author: Marek Dvoroznak <dvoromar gmail com>
Date:   Sun Aug 4 17:25:21 2013 +0200

    app: npd-tool: move (multi)selected control points

 app/tools/gimpnpointdeformationtool.c |  105 ++++++++++++++++++++++-----------
 app/tools/gimpnpointdeformationtool.h |   38 +++++-------
 2 files changed, 87 insertions(+), 56 deletions(-)
---
diff --git a/app/tools/gimpnpointdeformationtool.c b/app/tools/gimpnpointdeformationtool.c
index 219979d..2b42acf 100644
--- a/app/tools/gimpnpointdeformationtool.c
+++ b/app/tools/gimpnpointdeformationtool.c
@@ -168,7 +168,7 @@ gimp_n_point_deformation_tool_init (GimpNPointDeformationTool *npd_tool)
   npd_tool->selected_cp = NULL;
   npd_tool->hovering_cp = NULL;
   npd_tool->selected_cps = NULL;
-  npd_tool->previous_cp_positions = NULL;
+  npd_tool->previous_cps_positions = NULL;
 }
 
 static void
@@ -195,7 +195,7 @@ gimp_n_point_deformation_tool_control (GimpTool       *tool,
 
 void
 gimp_n_point_deformation_tool_start (GimpNPointDeformationTool *npd_tool,
-                                     GimpDisplay  *display)
+                                     GimpDisplay               *display)
 {
   GimpTool      *tool       = GIMP_TOOL (npd_tool);
   GimpDrawTool  *draw_tool  = GIMP_DRAW_TOOL (npd_tool);
@@ -280,12 +280,12 @@ gimp_n_point_deformation_tool_key_press (GimpTool    *tool,
                                          GimpDisplay *display)
 {
   GimpNPointDeformationTool *npd_tool = GIMP_N_POINT_DEFORMATION_TOOL (tool);
-  NPDModel *model = npd_tool->model;
-  GList **selected_cps = &npd_tool->selected_cps;
-  GList *last_selected_cp;
-  NPDControlPoint *cp;
-  GArray *cps = model->control_points;
-  gint i;
+  NPDModel                  *model = npd_tool->model;
+  GList                    **selected_cps = &npd_tool->selected_cps;
+  GList                     *last_selected_cp;
+  NPDControlPoint           *cp;
+  GArray                    *cps = model->control_points;
+  gint                       i;
   
   switch (kevent->keyval)
     {
@@ -333,6 +333,12 @@ gimp_n_point_deformation_tool_cursor_update (GimpTool         *tool,
 {
 }
 
+#define gimp_n_point_deformation_tool_clear_selected_points_list()             \
+g_list_free      (*selected_cps);                                              \
+g_list_free_full (*previous_cps_positions, g_free);                            \
+*selected_cps           = NULL;                                                \
+*previous_cps_positions = NULL
+
 static void
 gimp_n_point_deformation_tool_button_press (GimpTool            *tool,
                                             const GimpCoords    *coords,
@@ -346,7 +352,7 @@ gimp_n_point_deformation_tool_button_press (GimpTool            *tool,
   NPDPoint                   p;
   NPDControlPoint           *cp;
   GList                    **selected_cps = &npd_tool->selected_cps;
-  GList                    **previous_cp_positions = &npd_tool->previous_cp_positions;
+  GList                    **previous_cps_positions = &npd_tool->previous_cps_positions;
   
   if (display != tool->display)
     {
@@ -364,28 +370,56 @@ gimp_n_point_deformation_tool_button_press (GimpTool            *tool,
       p.x = coords->x; p.y = coords->y;
       cp = npd_get_control_point_at (model, &p);
       
-      if (cp == NULL || (cp != NULL && !g_list_find (*selected_cps, cp) && !(state & GDK_SHIFT_MASK)))
+      if (cp == NULL)
         {
-          g_list_free (*selected_cps);
-          *selected_cps = NULL;
-          g_list_free_full (*previous_cp_positions, g_free);
-          *previous_cp_positions = NULL;
+          /* there isn't a control point at cursor's position - clear the list
+           * of selected control points */
+          gimp_n_point_deformation_tool_clear_selected_points_list ();
         }
-      
-      
-      if (cp != NULL)
+      else
         {
-          NPDPoint *cp_point_copy = g_new (NPDPoint, 1);
-          *cp_point_copy = cp->point;
-        
+          /* there is a control point at cursor's position */
           npd_tool->selected_cp = cp;
-          npd_tool->delta_x = cp->point.x - coords->x;
-          npd_tool->delta_y = cp->point.y - coords->y;
-          *selected_cps = g_list_append (*selected_cps, cp);
-          *previous_cp_positions = g_list_append (*previous_cp_positions, cp_point_copy);
+
+          if (!g_list_find (*selected_cps, cp))
+            {
+              /* control point isn't selected, so we add it to the list
+               * of selected control points */
+              NPDPoint *cp_point_copy = g_new (NPDPoint, 1);
+
+              if (!(state & GDK_SHIFT_MASK))
+                {
+                  /* <SHIFT> isn't pressed, so this isn't a multiselection -
+                   * clear the list of selected control points */
+                  gimp_n_point_deformation_tool_clear_selected_points_list ();
+                }
+
+              *cp_point_copy = cp->point;
+
+              *selected_cps           = g_list_append (*selected_cps,
+                                                        cp);
+              *previous_cps_positions = g_list_append (*previous_cps_positions,
+                                                       cp_point_copy);
+
+              gimp_npd_debug (("prev length: %d\n", g_list_length (*previous_cps_positions)));
+            }
+
+          /* update previous positions of control points */
+          while (*selected_cps != NULL)
+            {
+              NPDPoint *p = (*previous_cps_positions)->data;
+              cp          = (*selected_cps)->data;
+              npd_set_point_coordinates (p, &cp->point);
+
+              if (g_list_next (*selected_cps) == NULL) break;
+              *selected_cps           = g_list_next (*selected_cps);
+              *previous_cps_positions = g_list_next (*previous_cps_positions);
+            }
+
+          *selected_cps          = g_list_first (*selected_cps);
+          *previous_cps_positions = g_list_first (*previous_cps_positions);
         }
       
-      
       npd_tool->movement_start_x = coords->x;
       npd_tool->movement_start_y = coords->y;
     }
@@ -510,7 +544,6 @@ gimp_n_point_deformation_tool_draw (GimpDrawTool *draw_tool)
                                      GIMP_HANDLE_ANCHOR_CENTER);
         }
     }
-
 }
 
 static void
@@ -520,12 +553,13 @@ gimp_n_point_deformation_tool_motion (GimpTool         *tool,
                                       GdkModifierType   state,
                                       GimpDisplay      *display)
 {
-  GimpNPointDeformationTool *npd_tool = GIMP_N_POINT_DEFORMATION_TOOL (tool);
-  NPDControlPoint           *selected_cp = npd_tool->selected_cp;
+  GimpNPointDeformationTool *npd_tool     = GIMP_N_POINT_DEFORMATION_TOOL (tool);
+  GimpDrawTool              *draw_tool    = GIMP_DRAW_TOOL (tool);
+  NPDControlPoint           *selected_cp  = npd_tool->selected_cp;
   GList                     *selected_cps = npd_tool->selected_cps;
-  GList                     *previous_cp_positions = npd_tool->previous_cp_positions;
-  gdouble                    movement_x = coords->x - npd_tool->movement_start_x;
-  gdouble                    movement_y = coords->y - npd_tool->movement_start_y;
+  GList                     *previous_cps_positions = npd_tool->previous_cps_positions;
+  gdouble                    shift_x      = coords->x - npd_tool->movement_start_x;
+  gdouble                    shift_y      = coords->y - npd_tool->movement_start_y;
 
   gimp_draw_tool_pause (GIMP_DRAW_TOOL (tool));
 
@@ -535,12 +569,13 @@ gimp_n_point_deformation_tool_motion (GimpTool         *tool,
         {
           NPDControlPoint *cp = selected_cps->data;
           NPDPoint *p = &cp->point;
-          NPDPoint *prev = previous_cp_positions->data;
-          p->x = prev->x + movement_x;
-          p->y = prev->y + movement_y;
+          NPDPoint *prev = previous_cps_positions->data;
+
+          p->x = prev->x + shift_x;
+          p->y = prev->y + shift_y;
           
           selected_cps = g_list_next (selected_cps);
-          previous_cp_positions = g_list_next (previous_cp_positions);
+          previous_cps_positions = g_list_next (previous_cps_positions);
         }
     }
   
diff --git a/app/tools/gimpnpointdeformationtool.h b/app/tools/gimpnpointdeformationtool.h
index 655b1d2..8af9b76 100644
--- a/app/tools/gimpnpointdeformationtool.h
+++ b/app/tools/gimpnpointdeformationtool.h
@@ -40,36 +40,32 @@ typedef struct _GimpNPointDeformationToolClass GimpNPointDeformationToolClass;
 
 struct _GimpNPointDeformationTool
 {
-  GimpDrawTool parent_instance;
+  GimpDrawTool     parent_instance;
   
-  GeglNode     *graph;
-  GeglNode     *source;
-  GeglNode     *node;
-  GeglNode     *sink;
+  GeglNode        *graph;
+  GeglNode        *source;
+  GeglNode        *node;
+  GeglNode        *sink;
   
-  GeglBuffer   *shadow, *buf;
+  GeglBuffer      *shadow, *buf;
   
-  GimpDrawable *drawable;
+  GimpDrawable    *drawable;
   
-  NPDModel     *model;
-  NPDControlPoint *selected_cp; /* last selected control point */
-  GList       *selected_cps;   /* list of selected control points */
+  NPDModel        *model;
+  NPDControlPoint *selected_cp;    /* last selected control point */
+  GList           *selected_cps;   /* list of selected control points */
   NPDControlPoint *hovering_cp;
 
-  gdouble       cursor_x;
-  gdouble       cursor_y;
+  gdouble          cursor_x;
+  gdouble          cursor_y;
   
-  gdouble       delta_x;
-  gdouble       delta_y;
+  gdouble          movement_start_x;
+  gdouble          movement_start_y;
   
-  gdouble       movement_start_x;
-  gdouble       movement_start_y;
+  GList           *previous_cps_positions; /* list of NPDPoints holding previous
+                                            * positions of control points */
   
-  GList       *previous_cp_positions; /* list of NPDPoints holding previous control points positions */
-  
-  gboolean active;
-  
-  GimpImageMap *image_map;
+  gboolean         active;
 };
 
 struct _GimpNPointDeformationToolClass


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