X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fnodepath.cpp;h=e58a8b31da3056c9494ff62163559b3d6bc2f186;hb=9778e170b43ef3ab1416d84092061ff7d29325e3;hp=d4aada20c32c48a85f713c8d9ad5e2ed4dd4c362;hpb=a664fdf3f96f645309f750daf844f172dcd9c51c;p=inkscape.git diff --git a/src/nodepath.cpp b/src/nodepath.cpp index d4aada20c..e58a8b31d 100644 --- a/src/nodepath.cpp +++ b/src/nodepath.cpp @@ -211,9 +211,7 @@ Inkscape::NodePath::Path *sp_nodepath_new(SPDesktop *desktop, SPItem *item, bool sp_curve_unref(curve); // create the livarot representation from the same item - np->livarot_path = Path_for_item(item, true, true); - if (np->livarot_path) - np->livarot_path->ConvertWithBackData(0.01); + sp_nodepath_ensure_livarot_path(np); return np; } @@ -247,6 +245,16 @@ void sp_nodepath_destroy(Inkscape::NodePath::Path *np) { } +void sp_nodepath_ensure_livarot_path(Inkscape::NodePath::Path *np) +{ + if (np && np->livarot_path == NULL && np->path && SP_IS_ITEM(np->path)) { + np->livarot_path = Path_for_item (np->path, true, true); + if (np->livarot_path) + np->livarot_path->ConvertWithBackData(0.01); + } +} + + /** * Return the node count of a given NodeSubPath. */ @@ -479,18 +487,17 @@ static void update_repr_internal(Inkscape::NodePath::Path *np) */ void sp_nodepath_update_repr(Inkscape::NodePath::Path *np, const gchar *annotation) { + //fixme: np can be NULL, so check before proceeding + g_return_if_fail(np != NULL); + if (np->livarot_path) { delete np->livarot_path; np->livarot_path = NULL; } - if (np->path && SP_IS_ITEM(np->path)) { - np->livarot_path = Path_for_item (np->path, true, true); - if (np->livarot_path) - np->livarot_path->ConvertWithBackData(0.01); - } - update_repr_internal(np); + sp_canvas_end_forced_full_redraws(np->desktop->canvas); + sp_document_done(sp_desktop_document(np->desktop), SP_VERB_CONTEXT_NODE, annotation); } @@ -500,20 +507,14 @@ void sp_nodepath_update_repr(Inkscape::NodePath::Path *np, const gchar *annotati */ static void sp_nodepath_update_repr_keyed(Inkscape::NodePath::Path *np, gchar const *key, const gchar *annotation) { - update_repr_internal(np); - sp_document_maybe_done(sp_desktop_document(np->desktop), key, SP_VERB_CONTEXT_NODE, - annotation); - if (np->livarot_path) { delete np->livarot_path; np->livarot_path = NULL; } - if (np->path && SP_IS_ITEM(np->path)) { - np->livarot_path = Path_for_item (np->path, true, true); - if (np->livarot_path) - np->livarot_path->ConvertWithBackData(0.01); - } + update_repr_internal(np); + sp_document_maybe_done(sp_desktop_document(np->desktop), key, SP_VERB_CONTEXT_NODE, + annotation); } /** @@ -988,7 +989,7 @@ static void sp_nodepath_selected_nodes_move(Inkscape::NodePath::Path *nodepath, } for (GList *l = nodepath->selected; l != NULL; l = l->next) { - Inkscape::NodePath::Node *n = (Inkscape::NodePath::Node *) l->data; + Inkscape::NodePath::Node *n = (Inkscape::NodePath::Node *) l->data; sp_node_moveto(n, n->pos + best_pt); } @@ -1546,11 +1547,15 @@ sp_nodepath_select_segment_near_point(Inkscape::NodePath::Path *nodepath, NR::Po return; } + sp_nodepath_ensure_livarot_path(nodepath); Path::cut_position position = get_nearest_position_on_Path(nodepath->livarot_path, p); //find segment to segment Inkscape::NodePath::Node *e = sp_nodepath_get_node_by_index(position.piece); + //fixme: this can return NULL, so check before proceeding. + g_return_if_fail(e != NULL); + gboolean force = FALSE; if (!(e->selected && (!e->p.other || e->p.other->selected))) { force = TRUE; @@ -1574,6 +1579,7 @@ sp_nodepath_add_node_near_point(Inkscape::NodePath::Path *nodepath, NR::Point p) return; } + sp_nodepath_ensure_livarot_path(nodepath); Path::cut_position position = get_nearest_position_on_Path(nodepath->livarot_path, p); //find segment to split @@ -1604,6 +1610,10 @@ sp_nodepath_add_node_near_point(Inkscape::NodePath::Path *nodepath, NR::Point p) void sp_nodepath_curve_drag(Inkscape::NodePath::Node * e, double t, NR::Point delta) { + //fixme: e and e->p can be NULL, so check for those before proceeding + g_return_if_fail(e != NULL); + g_return_if_fail(&e->p != NULL); + /* feel good is an arbitrary parameter that distributes the delta between handles * if t of the drag point is less than 1/6 distance form the endpoint only * the corresponding hadle is adjusted. This matches the behavior in GIMP @@ -2854,6 +2864,33 @@ static gboolean node_event(SPKnot *knot, GdkEvent *event, Inkscape::NodePath::No case GDK_LEAVE_NOTIFY: active_node = NULL; break; + case GDK_SCROLL: + if ((event->scroll.state & GDK_CONTROL_MASK) && !(event->scroll.state & GDK_SHIFT_MASK)) { // linearly + switch (event->scroll.direction) { + case GDK_SCROLL_UP: + nodepath_grow_selection_linearly (n->subpath->nodepath, n, +1); + break; + case GDK_SCROLL_DOWN: + nodepath_grow_selection_linearly (n->subpath->nodepath, n, -1); + break; + default: + break; + } + ret = TRUE; + } else if (!(event->scroll.state & GDK_SHIFT_MASK)) { // spatially + switch (event->scroll.direction) { + case GDK_SCROLL_UP: + nodepath_grow_selection_spatially (n->subpath->nodepath, n, +1); + break; + case GDK_SCROLL_DOWN: + nodepath_grow_selection_spatially (n->subpath->nodepath, n, -1); + break; + default: + break; + } + ret = TRUE; + } + break; case GDK_KEY_PRESS: switch (get_group0_keyval (&event->key)) { case GDK_space: @@ -2865,16 +2902,16 @@ static gboolean node_event(SPKnot *knot, GdkEvent *event, Inkscape::NodePath::No break; case GDK_Page_Up: if (event->key.state & GDK_CONTROL_MASK) { - nodepath_grow_selection_spatially (n->subpath->nodepath, n, +1); - } else { nodepath_grow_selection_linearly (n->subpath->nodepath, n, +1); + } else { + nodepath_grow_selection_spatially (n->subpath->nodepath, n, +1); } break; case GDK_Page_Down: if (event->key.state & GDK_CONTROL_MASK) { - nodepath_grow_selection_spatially (n->subpath->nodepath, n, -1); - } else { nodepath_grow_selection_linearly (n->subpath->nodepath, n, -1); + } else { + nodepath_grow_selection_spatially (n->subpath->nodepath, n, -1); } break; default: @@ -2974,6 +3011,9 @@ static void node_grabbed(SPKnot *knot, guint state, gpointer data) sp_nodepath_node_select(n, (state & GDK_SHIFT_MASK), FALSE); } + n->is_dragging = true; + sp_canvas_force_full_redraw_after_interruptions(n->subpath->nodepath->desktop->canvas, 5); + sp_nodepath_remember_origins (n->subpath->nodepath); } @@ -2985,6 +3025,8 @@ static void node_ungrabbed(SPKnot *knot, guint state, gpointer data) Inkscape::NodePath::Node *n = (Inkscape::NodePath::Node *) data; n->dragging_out = NULL; + n->is_dragging = false; + sp_canvas_end_forced_full_redraws(n->subpath->nodepath->desktop->canvas); sp_nodepath_update_repr(n->subpath->nodepath, _("Move nodes")); } @@ -3187,14 +3229,16 @@ node_request(SPKnot *knot, NR::Point *p, guint state, gpointer data) } } } else { // move freely - if (state & GDK_MOD1_MASK) { // sculpt - sp_nodepath_selected_nodes_sculpt(n->subpath->nodepath, n, (*p) - n->origin); - } else { - sp_nodepath_selected_nodes_move(n->subpath->nodepath, - (*p)[NR::X] - n->pos[NR::X], - (*p)[NR::Y] - n->pos[NR::Y], - (state & GDK_SHIFT_MASK) == 0); - } + if (n->is_dragging) { + if (state & GDK_MOD1_MASK) { // sculpt + sp_nodepath_selected_nodes_sculpt(n->subpath->nodepath, n, (*p) - n->origin); + } else { + sp_nodepath_selected_nodes_move(n->subpath->nodepath, + (*p)[NR::X] - n->pos[NR::X], + (*p)[NR::Y] - n->pos[NR::Y], + (state & GDK_SHIFT_MASK) == 0); + } + } } n->subpath->nodepath->desktop->scroll_to_point(p); @@ -3245,6 +3289,7 @@ static void node_handle_grabbed(SPKnot *knot, guint state, gpointer data) g_assert_not_reached(); } + sp_canvas_force_full_redraw_after_interruptions(n->subpath->nodepath->desktop->canvas, 5); } /** @@ -3266,6 +3311,7 @@ static void node_handle_ungrabbed(SPKnot *knot, guint state, gpointer data) } sp_nodepath_update_repr(n->subpath->nodepath, _("Move node handle")); + sp_canvas_end_forced_full_redraws(n->subpath->nodepath->desktop->canvas); } /**