X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fnodepath.cpp;h=e58a8b31da3056c9494ff62163559b3d6bc2f186;hb=9778e170b43ef3ab1416d84092061ff7d29325e3;hp=067cf5435428d6a2b2452d900532bd464ffaa652;hpb=6c2f88ab09e534e564966d6bbd6ff5dd198fff34;p=inkscape.git diff --git a/src/nodepath.cpp b/src/nodepath.cpp index 067cf5435..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. */ @@ -482,21 +490,16 @@ void sp_nodepath_update_repr(Inkscape::NodePath::Path *np, const gchar *annotati //fixme: np can be NULL, so check before proceeding g_return_if_fail(np != NULL); - update_repr_internal(np); - sp_document_done(sp_desktop_document(np->desktop), 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_canvas_end_forced_full_redraws(np->desktop->canvas); + + sp_document_done(sp_desktop_document(np->desktop), SP_VERB_CONTEXT_NODE, + annotation); } /** @@ -504,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); } /** @@ -1550,6 +1547,7 @@ 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 @@ -1581,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 @@ -2865,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: @@ -2876,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: @@ -2986,6 +3012,7 @@ static void node_grabbed(SPKnot *knot, guint state, gpointer data) } n->is_dragging = true; + sp_canvas_force_full_redraw_after_interruptions(n->subpath->nodepath->desktop->canvas, 5); sp_nodepath_remember_origins (n->subpath->nodepath); } @@ -2999,6 +3026,7 @@ static void node_ungrabbed(SPKnot *knot, guint state, gpointer 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")); } @@ -3261,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); } /** @@ -3282,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); } /**