[gimp/soc-2013-n-point-deformation-tool: 3/22] app: npd-tool: remove last added control point using backspace
- From: Marek Dvoroznak <dvoromar src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp/soc-2013-n-point-deformation-tool: 3/22] app: npd-tool: remove last added control point using backspace
- Date: Sat, 5 Oct 2013 02:17:39 +0000 (UTC)
commit 0be05e90c0b004faa097a4f91b881db3fa8c7659
Author: Marek Dvoroznak <dvoromar gmail com>
Date: Fri Aug 2 16:26:32 2013 +0200
app: npd-tool: remove last added control point using backspace
app/tools/gimpnpointdeformationtool.c | 77 +++++++++++++++++++++------------
app/tools/gimpnpointdeformationtool.h | 7 ++-
2 files changed, 54 insertions(+), 30 deletions(-)
---
diff --git a/app/tools/gimpnpointdeformationtool.c b/app/tools/gimpnpointdeformationtool.c
index ebbd44c..219979d 100644
--- a/app/tools/gimpnpointdeformationtool.c
+++ b/app/tools/gimpnpointdeformationtool.c
@@ -22,6 +22,7 @@
#include <gegl.h>
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
+#include <glib/gprintf.h>
#include "libgimpwidgets/gimpwidgets.h"
@@ -51,6 +52,8 @@
#include <npd/npd_common.h>
+#define GIMP_NPD_DEBUG
+
void gimp_n_point_deformation_tool_start (GimpNPointDeformationTool *npd_tool,
GimpDisplay *display);
void gimp_n_point_deformation_tool_halt (GimpNPointDeformationTool *npd_tool);
@@ -82,9 +85,6 @@ static void gimp_n_point_deformation_tool_cursor_update (GimpTool
GdkModifierType state,
GimpDisplay *display);
static void gimp_n_point_deformation_tool_draw (GimpDrawTool *draw_tool);
-
-static void gimp_n_point_deformation_add_handle (GimpNPointDeformationTool *npd_tool,
- NPDPoint *coords);
static void gimp_n_point_deformation_tool_control (GimpTool *tool,
GimpToolAction action,
GimpDisplay *display);
@@ -98,6 +98,11 @@ static void gimp_n_point_deformation_tool_motion (GimpTool
guint32 time,
GdkModifierType state,
GimpDisplay *display);
+#ifdef GIMP_NPD_DEBUG
+#define gimp_npd_debug(x) g_printf x
+#else
+#define gimp_npd_debug(x)
+#endif
G_DEFINE_TYPE (GimpNPointDeformationTool, gimp_n_point_deformation_tool, GIMP_TYPE_DRAW_TOOL)
@@ -241,10 +246,10 @@ gimp_n_point_deformation_tool_start (GimpNPointDeformationTool *npd_tool,
npd_tool->graph = graph;
npd_tool->model = model;
npd_tool->node = node;
+ npd_tool->source = source;
npd_tool->shadow = shadow;
npd_tool->sink = sink;
npd_tool->selected_cp = NULL;
-
}
void
@@ -274,19 +279,41 @@ gimp_n_point_deformation_tool_key_press (GimpTool *tool,
GdkEventKey *kevent,
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;
+
switch (kevent->keyval)
{
case GDK_KEY_BackSpace:
- return TRUE;
+ /* if there is at least one control point,
+ * remove last added control point */
+ if (cps->len > 0)
+ {
+ cp = &g_array_index (cps, NPDControlPoint, cps->len - 1);
+ gimp_npd_debug (("removing cp %p\n", cp));
+ npd_remove_control_point (model, cp);
+ *selected_cps = g_list_remove (*selected_cps, cp);
+ }
+ break;
+ case GDK_KEY_Delete:
+
+ break;
case GDK_KEY_Return:
case GDK_KEY_KP_Enter:
case GDK_KEY_ISO_Enter:
case GDK_KEY_Escape:
- return TRUE;
+ break;
default:
return FALSE;
}
+
+ return TRUE;
}
static void
@@ -318,8 +345,8 @@ gimp_n_point_deformation_tool_button_press (GimpTool *tool,
NPDModel *model;
NPDPoint p;
NPDControlPoint *cp;
- GSList **selected_cps = &npd_tool->selected_cps;
- GSList **previous_cp_positions = &npd_tool->previous_cp_positions;
+ GList **selected_cps = &npd_tool->selected_cps;
+ GList **previous_cp_positions = &npd_tool->previous_cp_positions;
if (display != tool->display)
{
@@ -337,11 +364,11 @@ 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_slist_find (*selected_cps, cp) && !(state & GDK_SHIFT_MASK)))
+ if (cp == NULL || (cp != NULL && !g_list_find (*selected_cps, cp) && !(state & GDK_SHIFT_MASK)))
{
- g_slist_free (*selected_cps);
+ g_list_free (*selected_cps);
*selected_cps = NULL;
- g_slist_free_full (*previous_cp_positions, g_free);
+ g_list_free_full (*previous_cp_positions, g_free);
*previous_cp_positions = NULL;
}
@@ -354,8 +381,8 @@ gimp_n_point_deformation_tool_button_press (GimpTool *tool,
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_slist_append (*selected_cps, cp);
- *previous_cp_positions = g_slist_append (*previous_cp_positions, cp_point_copy);
+ *selected_cps = g_list_append (*selected_cps, cp);
+ *previous_cp_positions = g_list_append (*previous_cp_positions, cp_point_copy);
}
@@ -384,11 +411,13 @@ gimp_n_point_deformation_tool_button_release (GimpTool *tool,
if (release_type == GIMP_BUTTON_RELEASE_CLICK)
{
+ /* TODO - solve bug */
p.x = coords->x; p.y = coords->y;
cp = npd_get_control_point_at (model, &p);
if (cp == NULL)
{
- gimp_n_point_deformation_add_handle (npd_tool, &p);
+ gimp_npd_debug (("cp doesn't exist, adding\n"));
+ npd_add_control_point (model, &p);
}
}
else
@@ -403,7 +432,7 @@ gimp_n_point_deformation_tool_button_release (GimpTool *tool,
buffer = npd_tool->drawable->private->buffer;
gegl_node_invalidated (npd_tool->node, NULL, FALSE);
-
+
gegl_node_process (npd_tool->sink);
gegl_buffer_copy (npd_tool->shadow, NULL,
npd_tool->buf, NULL);
@@ -443,14 +472,6 @@ gimp_n_point_deformation_tool_oper_update (GimpTool *tool,
}
static void
-gimp_n_point_deformation_add_handle (GimpNPointDeformationTool *npd_tool,
- NPDPoint *coords)
-{
- NPDModel *model = npd_tool->model;
- npd_add_control_point (model, coords);
-}
-
-static void
gimp_n_point_deformation_tool_draw (GimpDrawTool *draw_tool)
{
GimpNPointDeformationTool *npd_tool = GIMP_N_POINT_DEFORMATION_TOOL (draw_tool);
@@ -478,7 +499,7 @@ gimp_n_point_deformation_tool_draw (GimpDrawTool *draw_tool)
GIMP_TOOL_HANDLE_SIZE_CIRCLE,
GIMP_HANDLE_ANCHOR_CENTER);
- if (g_slist_find (npd_tool->selected_cps, cp) != NULL)
+ if (g_list_find (npd_tool->selected_cps, cp) != NULL)
{
gimp_draw_tool_add_handle (draw_tool,
GIMP_HANDLE_SQUARE,
@@ -501,8 +522,8 @@ gimp_n_point_deformation_tool_motion (GimpTool *tool,
{
GimpNPointDeformationTool *npd_tool = GIMP_N_POINT_DEFORMATION_TOOL (tool);
NPDControlPoint *selected_cp = npd_tool->selected_cp;
- GSList *selected_cps = npd_tool->selected_cps;
- GSList *previous_cp_positions = npd_tool->previous_cp_positions;
+ 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;
@@ -518,8 +539,8 @@ gimp_n_point_deformation_tool_motion (GimpTool *tool,
p->x = prev->x + movement_x;
p->y = prev->y + movement_y;
- selected_cps = g_slist_next (selected_cps);
- previous_cp_positions = g_slist_next (previous_cp_positions);
+ selected_cps = g_list_next (selected_cps);
+ previous_cp_positions = g_list_next (previous_cp_positions);
}
}
diff --git a/app/tools/gimpnpointdeformationtool.h b/app/tools/gimpnpointdeformationtool.h
index 8efe47c..655b1d2 100644
--- a/app/tools/gimpnpointdeformationtool.h
+++ b/app/tools/gimpnpointdeformationtool.h
@@ -43,6 +43,7 @@ struct _GimpNPointDeformationTool
GimpDrawTool parent_instance;
GeglNode *graph;
+ GeglNode *source;
GeglNode *node;
GeglNode *sink;
@@ -52,7 +53,7 @@ struct _GimpNPointDeformationTool
NPDModel *model;
NPDControlPoint *selected_cp; /* last selected control point */
- GSList *selected_cps; /* list of selected control points */
+ GList *selected_cps; /* list of selected control points */
NPDControlPoint *hovering_cp;
gdouble cursor_x;
@@ -64,9 +65,11 @@ struct _GimpNPointDeformationTool
gdouble movement_start_x;
gdouble movement_start_y;
- GSList *previous_cp_positions; /* list of NPDPoints holding previous control points positions */
+ GList *previous_cp_positions; /* list of NPDPoints holding previous control points positions */
gboolean active;
+
+ GimpImageMap *image_map;
};
struct _GimpNPointDeformationToolClass
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]