summaryrefslogtreecommitdiffstats
path: root/src/knotholder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/knotholder.cpp')
-rw-r--r--src/knotholder.cpp29
1 files changed, 27 insertions, 2 deletions
diff --git a/src/knotholder.cpp b/src/knotholder.cpp
index 0a3cb2957..1ca280d48 100644
--- a/src/knotholder.cpp
+++ b/src/knotholder.cpp
@@ -58,7 +58,16 @@ KnotHolder::KnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolderReleasedFun
KnotHolder::~KnotHolder() {
g_object_unref(G_OBJECT(item));
for(std::list<KnotHolderEntity *>::iterator i = entity.begin(); i != entity.end(); ++i) {
- delete *i;
+ KnotHolderEntity* e = (*i);
+ if (!e->isLPEParam()) {
+ // knotholder entity may be deleted
+ delete (*i);
+ } else {
+ // we must not delete the entity since it's an LPE parameter,
+ // but the handle should be destroyed
+ g_object_unref(e->knot);
+ }
+ (*i) = NULL;
}
entity.clear(); // this shouldn't be necessary, though
}
@@ -145,7 +154,7 @@ KnotHolder::knot_moved_handler(SPKnot *knot, NR::Point const *p, guint state)
}
void
-KnotHolder::knot_ungrabbed_handler()
+KnotHolder::knot_ungrabbed_handler(SPKnot *knot)
{
if (this->released) {
this->released(this->item);
@@ -153,6 +162,16 @@ KnotHolder::knot_ungrabbed_handler()
SPObject *object = (SPObject *) this->item;
object->updateRepr(object->repr, SP_OBJECT_WRITE_EXT);
+ /* do cleanup tasks (e.g., for LPE items write the parameter values
+ * that were changed by dragging the handle to SVG)
+ */
+ for(std::list<KnotHolderEntity *>::iterator i = this->entity.begin(); i != this->entity.end(); ++i) {
+ KnotHolderEntity *e = *i;
+ if (e->knot == knot) {
+ e->onKnotUngrabbed(); // for most KnotHolderEntitys this does nothing
+ }
+ }
+
unsigned int object_verb = SP_VERB_NONE;
if (SP_IS_RECT(object))
@@ -178,6 +197,12 @@ KnotHolder::knot_ungrabbed_handler()
}
void
+KnotHolder::add(KnotHolderEntity *e)
+{
+ entity.push_back(e);
+}
+
+void
KnotHolder::add_pattern_knotholder()
{
if ((SP_OBJECT(item)->style->fill.isPaintserver())