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");