From daf094b1dd89cc349f8c8fd7df9abea80b11c0e3 Mon Sep 17 00:00:00 2001 From: johanengelen Date: Wed, 15 Jul 2009 17:37:41 +0000 Subject: [PATCH] shapeeditor: save separate listerner's repr_keys for KnotHolder and NodePaths, to fix bug #387298 --- src/shape-editor.cpp | 30 +++++++++++++++--------------- src/shape-editor.h | 3 ++- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/shape-editor.cpp b/src/shape-editor.cpp index dc1ec1c7e..b44d889e0 100644 --- a/src/shape-editor.cpp +++ b/src/shape-editor.cpp @@ -54,7 +54,8 @@ ShapeEditor::ShapeEditor(SPDesktop *dt) { this->nodepath = NULL; this->knotholder = NULL; this->hit = false; - this->listener_attached_for = NULL; + this->knotholder_listener_attached_for = NULL; + this->nodepath_listener_attached_for = NULL; } ShapeEditor::~ShapeEditor() { @@ -69,10 +70,10 @@ void ShapeEditor::unset_item(SubType type, bool keep_knotholder) { case SH_NODEPATH: if (this->nodepath) { old_repr = this->nodepath->repr; - if (old_repr && old_repr == listener_attached_for) { + if (old_repr && old_repr == nodepath_listener_attached_for) { sp_repr_remove_listener_by_data(old_repr, this); Inkscape::GC::release(old_repr); - listener_attached_for = NULL; + nodepath_listener_attached_for = NULL; } this->grab_node = -1; @@ -83,10 +84,10 @@ void ShapeEditor::unset_item(SubType type, bool keep_knotholder) { case SH_KNOTHOLDER: if (this->knotholder) { old_repr = this->knotholder->repr; - if (old_repr && old_repr == listener_attached_for) { + if (old_repr && old_repr == knotholder_listener_attached_for) { sp_repr_remove_listener_by_data(old_repr, this); Inkscape::GC::release(old_repr); - listener_attached_for = NULL; + knotholder_listener_attached_for = NULL; } if (!keep_knotholder) { @@ -256,10 +257,10 @@ void ShapeEditor::set_item(SPItem *item, SubType type, bool keep_knotholder) { // setting new listener repr = SP_OBJECT_REPR(item); - if (repr != listener_attached_for) { + if (repr != nodepath_listener_attached_for) { Inkscape::GC::anchor(repr); sp_repr_add_listener(repr, &shapeeditor_repr_events, this); - listener_attached_for = repr; + nodepath_listener_attached_for = repr; } } break; @@ -273,10 +274,10 @@ void ShapeEditor::set_item(SPItem *item, SubType type, bool keep_knotholder) { this->knotholder->update_knots(); // setting new listener repr = this->knotholder->repr; - if (repr != listener_attached_for) { + if (repr != knotholder_listener_attached_for) { Inkscape::GC::anchor(repr); sp_repr_add_listener(repr, &shapeeditor_repr_events, this); - listener_attached_for = repr; + knotholder_listener_attached_for = repr; } } break; @@ -303,10 +304,10 @@ void ShapeEditor::set_item_lpe_path_parameter(SPItem *item, LivePathEffectObject // setting new listener Inkscape::XML::Node *repr = SP_OBJECT_REPR(lpeobject); - if (repr && repr != listener_attached_for) { + if (repr && repr != nodepath_listener_attached_for) { Inkscape::GC::anchor(repr); sp_repr_add_listener(repr, &shapeeditor_repr_events, this); - listener_attached_for = repr; + nodepath_listener_attached_for = repr; } } } @@ -317,9 +318,6 @@ void ShapeEditor::set_item_lpe_path_parameter(SPItem *item, LivePathEffectObject Why not make a reload function in NodePath and in KnotHolder? */ void ShapeEditor::reset_item (SubType type, bool keep_knotholder) { - /// note that it is not certain that this is an SPItem; it could be a LivePathEffectObject. - SPObject *obj = sp_desktop_document(desktop)->getObjectByRepr(listener_attached_for); - switch (type) { case SH_NODEPATH: if ( (nodepath) && (IS_LIVEPATHEFFECT(nodepath->object)) ) { @@ -327,11 +325,13 @@ void ShapeEditor::reset_item (SubType type, bool keep_knotholder) set_item_lpe_path_parameter(nodepath->item, LIVEPATHEFFECT(nodepath->object), key); // the above checks for nodepath, so it is indeed a path that we are editing g_free(key); } else { + SPObject *obj = sp_desktop_document(desktop)->getObjectByRepr(nodepath_listener_attached_for); /// note that it is not certain that this is an SPItem; it could be a LivePathEffectObject. set_item(SP_ITEM(obj), SH_NODEPATH); } break; case SH_KNOTHOLDER: - if (this->knotholder) { + if ( knotholder ) { + SPObject *obj = sp_desktop_document(desktop)->getObjectByRepr(knotholder_listener_attached_for); /// note that it is not certain that this is an SPItem; it could be a LivePathEffectObject. set_item(SP_ITEM(obj), SH_KNOTHOLDER, keep_knotholder); } break; diff --git a/src/shape-editor.h b/src/shape-editor.h index ef81540ae..98dbb35d7 100644 --- a/src/shape-editor.h +++ b/src/shape-editor.h @@ -143,7 +143,8 @@ private: Geom::Point curvepoint_event; // int coords from event Geom::Point curvepoint_doc; // same, in doc coords - Inkscape::XML::Node *listener_attached_for; + Inkscape::XML::Node *knotholder_listener_attached_for; + Inkscape::XML::Node *nodepath_listener_attached_for; }; -- 2.30.2