static gint pencil_handle_key_release(SPPencilContext *const pc, guint const keyval, guint const /*state*/) { gint ret = FALSE; switch (keyval) { case GDK_Alt_L: case GDK_Alt_R: case GDK_Meta_L: case GDK_Meta_R: if (pc->state == SP_PENCIL_CONTEXT_SKETCH) { spdc_concat_colors_and_flush(pc, FALSE); pc->sketch_n = 0; pc->sa = NULL; pc->ea = NULL; if (pc->green_anchor) { pc->green_anchor = sp_draw_anchor_destroy(pc->green_anchor); } pc->state = SP_PENCIL_CONTEXT_IDLE; pc->desktop->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Finishing freehand sketch")); ret = TRUE; } break; default: break; } return ret; }
static void spdc_pen_finish (SPPenContext *pc, gboolean closed) { SPDrawContext *dc; dc = SP_DRAW_CONTEXT (pc); g_print ("Finishing pen\n"); sp_curve_reset (dc->red_curve); spdc_concat_colors_and_flush (dc, closed); dc->sa = NULL; dc->ea = NULL; dc->npoints = 0; pc->state = SP_PEN_CONTEXT_POINT; sp_canvas_item_hide (pc->c0); sp_canvas_item_hide (pc->c1); sp_canvas_item_hide (pc->cl0); sp_canvas_item_hide (pc->cl1); if (dc->green_anchor) { dc->green_anchor = sp_draw_anchor_destroy (dc->green_anchor); } }
static void pencil_cancel (SPPencilContext *const pc) { if (pc->grab) { /* Release grab now */ sp_canvas_item_ungrab(pc->grab, 0); pc->grab = NULL; } pc->is_drawing = false; pc->state = SP_PENCIL_CONTEXT_IDLE; pc->red_curve->reset(); sp_canvas_bpath_set_bpath(SP_CANVAS_BPATH(pc->red_bpath), NULL); while (pc->green_bpaths) { gtk_object_destroy(GTK_OBJECT(pc->green_bpaths->data)); pc->green_bpaths = g_slist_remove(pc->green_bpaths, pc->green_bpaths->data); } pc->green_curve->reset(); if (pc->green_anchor) { pc->green_anchor = sp_draw_anchor_destroy(pc->green_anchor); } pc->_message_context->clear(); pc->_message_context->flash(Inkscape::NORMAL_MESSAGE, _("Drawing cancelled")); sp_canvas_end_forced_full_redraws(pc->desktop->canvas); }
static void spdc_free_colors (SPDrawContext *dc) { /* Red */ if (dc->red_bpath) { gtk_object_destroy (GTK_OBJECT (dc->red_bpath)); dc->red_bpath = NULL; } if (dc->red_curve) { dc->red_curve = sp_curve_unref (dc->red_curve); } /* Blue */ if (dc->blue_bpath) { gtk_object_destroy (GTK_OBJECT (dc->blue_bpath)); dc->blue_bpath = NULL; } if (dc->blue_curve) { dc->blue_curve = sp_curve_unref (dc->blue_curve); } /* Green */ while (dc->green_bpaths) { gtk_object_destroy (GTK_OBJECT (dc->green_bpaths->data)); dc->green_bpaths = g_slist_remove (dc->green_bpaths, dc->green_bpaths->data); } if (dc->green_curve) { dc->green_curve = sp_curve_unref (dc->green_curve); } if (dc->green_anchor) { dc->green_anchor = sp_draw_anchor_destroy (dc->green_anchor); } /* White */ if (dc->white_item) { /* We do not hold refcount */ dc->white_item = NULL; } while (dc->white_curves) { sp_curve_unref ((SPCurve *) dc->white_curves->data); dc->white_curves = g_slist_remove (dc->white_curves, dc->white_curves->data); } while (dc->white_anchors) { sp_draw_anchor_destroy ((SPDrawAnchor *) dc->white_anchors->data); dc->white_anchors = g_slist_remove (dc->white_anchors, dc->white_anchors->data); } }
static void spdc_reset_white (SPDrawContext *dc) { if (dc->white_item) { /* We do not hold refcount */ dc->white_item = NULL; } while (dc->white_curves) { sp_curve_unref ((SPCurve *) dc->white_curves->data); dc->white_curves = g_slist_remove (dc->white_curves, dc->white_curves->data); } while (dc->white_anchors) { sp_draw_anchor_destroy ((SPDrawAnchor *) dc->white_anchors->data); dc->white_anchors = g_slist_remove (dc->white_anchors, dc->white_anchors->data); } }
static void spdc_reset_colors (SPDrawContext *dc) { /* Red */ sp_curve_reset (dc->red_curve); sp_canvas_bpath_set_bpath (SP_CANVAS_BPATH (dc->red_bpath), NULL); /* Blue */ sp_curve_reset (dc->blue_curve); sp_canvas_bpath_set_bpath (SP_CANVAS_BPATH (dc->blue_bpath), NULL); /* Green */ while (dc->green_bpaths) { gtk_object_destroy (GTK_OBJECT (dc->green_bpaths->data)); dc->green_bpaths = g_slist_remove (dc->green_bpaths, dc->green_bpaths->data); } sp_curve_reset (dc->green_curve); if (dc->green_anchor) { dc->green_anchor = sp_draw_anchor_destroy (dc->green_anchor); } dc->sa = NULL; dc->ea = NULL; dc->npoints = 0; }
static gint pencil_handle_button_release(SPPencilContext *const pc, GdkEventButton const &revent) { gint ret = FALSE; SPEventContext *event_context = SP_EVENT_CONTEXT(pc); if ( revent.button == 1 && pc->is_drawing && !event_context->space_panning) { SPDesktop *const dt = pc->desktop; pc->is_drawing = false; /* Find desktop coordinates */ Geom::Point p = dt->w2d(Geom::Point(revent.x, revent.y)); /* Test whether we hit any anchor. */ SPDrawAnchor *anchor = spdc_test_inside(pc, Geom::Point(revent.x, revent.y)); switch (pc->state) { case SP_PENCIL_CONTEXT_IDLE: /* Releasing button in idle mode means single click */ /* We have already set up start point/anchor in button_press */ if (!(revent.state & GDK_CONTROL_MASK)) { // Ctrl+click creates a single point so only set context in ADDLINE mode when Ctrl isn't pressed pc->state = SP_PENCIL_CONTEXT_ADDLINE; } ret = TRUE; break; case SP_PENCIL_CONTEXT_ADDLINE: /* Finish segment now */ if (anchor) { p = anchor->dp; } else { spdc_endpoint_snap(pc, p, revent.state); } pc->ea = anchor; spdc_set_endpoint(pc, p); spdc_finish_endpoint(pc); pc->state = SP_PENCIL_CONTEXT_IDLE; ret = TRUE; break; case SP_PENCIL_CONTEXT_FREEHAND: if (revent.state & GDK_MOD1_MASK) { /* sketch mode: interpolate the sketched path and improve the current output path with the new interpolation. don't finish sketch */ sketch_interpolate(pc); if (pc->green_anchor) { pc->green_anchor = sp_draw_anchor_destroy(pc->green_anchor); } pc->state = SP_PENCIL_CONTEXT_SKETCH; } else { /* Finish segment now */ /// \todo fixme: Clean up what follows (Lauris) if (anchor) { p = anchor->dp; } pc->ea = anchor; /* Write curves to object */ dt->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Finishing freehand")); interpolate(pc); spdc_concat_colors_and_flush(pc, FALSE); pc->sa = NULL; pc->ea = NULL; if (pc->green_anchor) { pc->green_anchor = sp_draw_anchor_destroy(pc->green_anchor); } pc->state = SP_PENCIL_CONTEXT_IDLE; // reset sketch mode too pc->sketch_n = 0; } ret = TRUE; break; case SP_PENCIL_CONTEXT_SKETCH: default: break; } if (pc->grab) { /* Release grab now */ sp_canvas_item_ungrab(pc->grab, revent.time); pc->grab = NULL; } ret = TRUE; } return ret; }
gint sp_pencil_context_root_handler (SPEventContext *ec, GdkEvent *event) { SPDrawContext *dc; SPPencilContext *pc; SPDesktop *dt; NRPointF p; gint ret; SPDrawAnchor *anchor; NRPointF fp; dc = SP_DRAW_CONTEXT (ec); pc = SP_PENCIL_CONTEXT (ec); dt = ec->desktop; ret = FALSE; switch (event->type) { case GDK_BUTTON_PRESS: if (event->button.button == 1) { NRPointF fp; #if 0 /* Grab mouse, so release will not pass unnoticed */ dc->grab = SP_CANVAS_ITEM (dt->acetate); sp_canvas_item_grab (dc->grab, SPDC_EVENT_MASK, NULL, event->button.time); #endif /* Find desktop coordinates */ sp_desktop_w2d_xy_point (dt, &fp, event->button.x, event->button.y); p.x = fp.x; p.y = fp.y; /* Test, whether we hit any anchor */ anchor = test_inside (dc, event->button.x, event->button.y); switch (pc->state) { case SP_PENCIL_CONTEXT_ADDLINE: /* Current segment will be finished with release */ ret = TRUE; break; default: /* Set first point of sequence */ if (anchor) { p = anchor->dp; } dc->sa = anchor; spdc_set_startpoint (pc, &p, event->button.state); ret = TRUE; break; } } break; case GDK_MOTION_NOTIFY: #if 1 if ((event->motion.state & GDK_BUTTON1_MASK) && !dc->grab) { /* Grab mouse, so release will not pass unnoticed */ dc->grab = SP_CANVAS_ITEM (dt->acetate); sp_canvas_item_grab (dc->grab, SPDC_EVENT_MASK, NULL, event->button.time); } #endif /* Find desktop coordinates */ sp_desktop_w2d_xy_point (dt, &fp, event->motion.x, event->motion.y); p.x = fp.x; p.y = fp.y; /* Test, whether we hit any anchor */ anchor = test_inside (dc, event->button.x, event->button.y); switch (pc->state) { case SP_PENCIL_CONTEXT_ADDLINE: /* Set red endpoint */ if (anchor) { p = anchor->dp; } spdc_set_endpoint (pc, &p, event->motion.state); ret = TRUE; break; default: /* We may be idle or already freehand */ if (event->motion.state & GDK_BUTTON1_MASK) { pc->state = SP_PENCIL_CONTEXT_FREEHAND; if (!dc->sa && !dc->green_anchor) { /* Create green anchor */ dc->green_anchor = sp_draw_anchor_new (dc, dc->green_curve, TRUE, dc->p[0].x, dc->p[0].y); } /* fixme: I am not sure, whether we want to snap to anchors in middle of freehand (Lauris) */ if (anchor) { p = anchor->dp; } else { sp_desktop_free_snap (dt, &p); } spdc_add_freehand_point (pc, &p, event->motion.state); ret = TRUE; } break; } break; case GDK_BUTTON_RELEASE: if (event->button.button == 1) { NRPointF fp; /* Find desktop coordinates */ sp_desktop_w2d_xy_point (dt, &fp, event->motion.x, event->motion.y); p.x = fp.x; p.y = fp.y; /* Test, whether we hit any anchor */ anchor = test_inside (dc, event->button.x, event->button.y); switch (pc->state) { case SP_PENCIL_CONTEXT_IDLE: /* Releasing button in idle mode means single click */ /* We have already set up start point/anchor in button_press */ pc->state = SP_PENCIL_CONTEXT_ADDLINE; ret = TRUE; break; case SP_PENCIL_CONTEXT_ADDLINE: /* Finish segment now */ if (anchor) { p = anchor->dp; } dc->ea = anchor; spdc_finish_endpoint (pc, &p, !anchor, event->button.state); pc->state = SP_PENCIL_CONTEXT_IDLE; ret = TRUE; break; case SP_PENCIL_CONTEXT_FREEHAND: /* Finish segment now */ /* fixme: Clean up what follows (Lauris) */ if (anchor) { p = anchor->dp; } dc->ea = anchor; /* Write curves to object */ g_print ("Finishing freehand\n"); spdc_concat_colors_and_flush (dc, FALSE); dc->sa = NULL; dc->ea = NULL; if (dc->green_anchor) { dc->green_anchor = sp_draw_anchor_destroy (dc->green_anchor); } pc->state = SP_PENCIL_CONTEXT_IDLE; ret = TRUE; break; default: break; } #if 1 if (dc->grab) { /* Release grab now */ sp_canvas_item_ungrab (dc->grab, event->button.time); dc->grab = NULL; } #endif dc->grab = NULL; ret = TRUE; } break; default: break; } if (!ret) { if (((SPEventContextClass *) pencil_parent_class)->root_handler) ret = ((SPEventContextClass *) pencil_parent_class)->root_handler (ec, event); } return ret; }