X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fnodepath.cpp;h=78d76404df2b0aacbb732d59eac5558760b35edb;hb=6ec35538b3387ac72af1c9e921e531b75250f2d4;hp=8371c8241825d00a153c1305b2de858b44c75a0a;hpb=e9f66287a57ce7990d83927da9fd400bd5bcf5f8;p=inkscape.git diff --git a/src/nodepath.cpp b/src/nodepath.cpp index 8371c8241..78d76404d 100644 --- a/src/nodepath.cpp +++ b/src/nodepath.cpp @@ -31,6 +31,7 @@ #include "message-stack.h" #include "message-context.h" #include "node-context.h" +#include "shape-editor.h" #include "selection-chemistry.h" #include "selection.h" #include "xml/repr.h" @@ -184,7 +185,7 @@ Inkscape::NodePath::Path *sp_nodepath_new(SPDesktop *desktop, SPItem *item, bool np->path = path; np->subpaths = NULL; np->selected = NULL; - np->nodeContext = NULL; //Let the context that makes this set it + np->shape_editor = NULL; //Let the shapeeditor that makes this set it np->livarot_path = NULL; np->local_change = 0; np->show_handles = show_handles; @@ -217,7 +218,7 @@ Inkscape::NodePath::Path *sp_nodepath_new(SPDesktop *desktop, SPItem *item, bool } /** - * Destroys nodepath's subpaths, then itself, also tell context about it. + * Destroys nodepath's subpaths, then itself, also tell parent ShapeEditor about it. */ void sp_nodepath_destroy(Inkscape::NodePath::Path *np) { @@ -228,9 +229,9 @@ void sp_nodepath_destroy(Inkscape::NodePath::Path *np) { sp_nodepath_subpath_destroy((Inkscape::NodePath::SubPath *) np->subpaths->data); } - //Inform the context that made me, if any, that I am gone. - if (np->nodeContext) - np->nodeContext->nodepath = NULL; + //Inform the ShapeEditor that made me, if any, that I am gone. + if (np->shape_editor) + np->shape_editor->nodepath_destroyed(); g_assert(!np->selected); @@ -662,7 +663,7 @@ static gchar *create_typestr(Inkscape::NodePath::Path *np) } /** - * Returns current path in context. + * Returns current path in context. // later eliminate this function at all! */ static Inkscape::NodePath::Path *sp_nodepath_current() { @@ -676,7 +677,7 @@ static Inkscape::NodePath::Path *sp_nodepath_current() return NULL; } - return SP_NODE_CONTEXT(event_context)->nodepath; + return SP_NODE_CONTEXT(event_context)->shape_editor->get_nodepath(); } @@ -1727,8 +1728,11 @@ void sp_node_selected_join() Inkscape::NodePath::Node *b = (Inkscape::NodePath::Node *) nodepath->selected->next->data; g_assert(a != b); - g_assert(a->p.other || a->n.other); - g_assert(b->p.other || b->n.other); + if (!(a->p.other || a->n.other) || !(b->p.other || b->n.other)) { + // someone tried to join an orphan node (i.e. a single-node subpath). + // this is not worth an error message, just fail silently. + return; + } if (((a->subpath->closed) || (b->subpath->closed)) || (a->p.other && a->n.other) || (b->p.other && b->n.other)) { nodepath->desktop->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("To join, you must have two endnodes selected.")); @@ -1826,8 +1830,11 @@ void sp_node_selected_join_segment() Inkscape::NodePath::Node *b = (Inkscape::NodePath::Node *) nodepath->selected->next->data; g_assert(a != b); - g_assert(a->p.other || a->n.other); - g_assert(b->p.other || b->n.other); + if (!(a->p.other || a->n.other) || !(b->p.other || b->n.other)) { + // someone tried to join an orphan node (i.e. a single-node subpath). + // this is not worth an error message, just fail silently. + return; + } if (((a->subpath->closed) || (b->subpath->closed)) || (a->p.other && a->n.other) || (b->p.other && b->n.other)) { nodepath->desktop->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("To join, you must have two endnodes selected.")); @@ -2213,7 +2220,10 @@ sp_node_selected_delete_segment(void) //Copy everything after 'end' to a new subpath Inkscape::NodePath::SubPath *t = sp_nodepath_subpath_new(nodepath); for (curr=end ; curr ; curr=curr->n.other) { - sp_nodepath_node_new(t, NULL, (Inkscape::NodePath::NodeType)curr->type, (NRPathcode)curr->code, + NRPathcode code = (NRPathcode) curr->code; + if (curr == end) + code = NR_MOVETO; + sp_nodepath_node_new(t, NULL, (Inkscape::NodePath::NodeType)curr->type, code, &curr->p.pos, &curr->pos, &curr->n.pos); } @@ -3313,7 +3323,6 @@ 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); } /** @@ -4029,6 +4038,7 @@ static void sp_nodepath_node_destroy(Inkscape::NodePath::Node *node) g_signal_handlers_disconnect_by_func(G_OBJECT(node->p.knot), (gpointer) G_CALLBACK(node_handle_moved), node); g_signal_handlers_disconnect_by_func(G_OBJECT(node->p.knot), (gpointer) G_CALLBACK(node_handle_event), node); g_object_unref(G_OBJECT(node->p.knot)); + node->p.knot = NULL; } if (node->n.knot) { @@ -4039,6 +4049,7 @@ static void sp_nodepath_node_destroy(Inkscape::NodePath::Node *node) g_signal_handlers_disconnect_by_func(G_OBJECT(node->n.knot), (gpointer) G_CALLBACK(node_handle_moved), node); g_signal_handlers_disconnect_by_func(G_OBJECT(node->n.knot), (gpointer) G_CALLBACK(node_handle_event), node); g_object_unref(G_OBJECT(node->n.knot)); + node->n.knot = NULL; } if (node->p.line) @@ -4223,7 +4234,7 @@ static gchar const *sp_node_type_description(Inkscape::NodePath::Node *node) * Handles content of statusbar as long as node tool is active. */ void -sp_nodepath_update_statusbar(Inkscape::NodePath::Path *nodepath) +sp_nodepath_update_statusbar(Inkscape::NodePath::Path *nodepath)//!!!move to ShapeEditorsCollection { gchar const *when_selected = _("Drag nodes or node handles; Alt+drag nodes to sculpt; arrow keys to move nodes, < > to scale, [ ] to rotate"); gchar const *when_selected_one = _("Drag the node or its handles; arrow keys to move the node");