=== modified file 'src/live_effects/parameter/path.cpp' --- src/live_effects/parameter/path.cpp 2016-03-18 17:34:07 +0000 +++ src/live_effects/parameter/path.cpp 2016-06-09 22:37:13 +0000 @@ -38,6 +38,8 @@ #include "uri.h" #include "sp-shape.h" #include "sp-text.h" +#include "sp-defs.h" +#include "sp-namedview.h" #include "display/curve.h" #include "ui/tools/node-tool.h" @@ -213,21 +215,62 @@ if (!tools_isactive(dt, TOOLS_NODES)) { tools_switch(dt, TOOLS_NODES); } - - Inkscape::UI::Tools::NodeTool *nt = static_cast(dt->event_context); - std::set shapes; - ShapeRecord r; - - r.role = SHAPE_ROLE_LPE_PARAM; - r.edit_transform = item->i2dt_affine(); // TODO is it right? if (!href) { + SPDesktop *desktop = SP_ACTIVE_DESKTOP; + SPDocument *doc = desktop->getDocument(); + bool saved = DocumentUndo::getUndoSensitive(doc); + DocumentUndo::setUndoSensitive(doc, false); + Inkscape::UI::Tools::NodeTool *nt = static_cast(dt->event_context); + std::set shapes; + ShapeRecord r; + + r.role = SHAPE_ROLE_LPE_PARAM; + Inkscape::Util::Unit const * unit = desktop->getNamedView()->getDisplayUnit(); + Geom::Affine inverse = Geom::Scale(1, -1) * Geom::Translate(0, doc->getHeight().value("px")); + r.edit_transform = item->i2dt_affine() * inverse; // TODO is it right? + SPDefs *defs = doc->getDefs(); + Inkscape::XML::Node *path; + Inkscape::XML::Document *xml_doc = doc->getReprDoc(); + path = xml_doc->createElement("svg:path"); + + path->setAttribute("d", sp_svg_write_path(_pathvector)); r.item = reinterpret_cast(param_effect->getLPEObj()); + gchar * path_parameter_id = g_strdup_printf("%s%s", r.item->getAttribute("id"),"_pathparameter"); + SPObject * previous_item = doc->getObjectById(path_parameter_id); + if (previous_item) { + Inkscape::XML::Node * prev = previous_item->getRepr(); + prev->setAttribute("d", sp_svg_write_path(_pathvector)); + Inkscape::GC::release(prev); + previous_item->updateRepr(); + SPItem *path_param = SP_ITEM(previous_item); + r.item = path_param; + } else { + path->setAttribute("id", path_parameter_id); + SPItem *path_param = SP_ITEM(defs->appendChildRepr(path)); + Inkscape::GC::release(path); + path_param->updateRepr(); + r.item = path_param; + } r.lpe_key = param_key; + href = g_strdup_printf("#%s", path_parameter_id); + param_write_to_repr(g_strdup_printf("#%s", path_parameter_id)); + DocumentUndo::setUndoSensitive(doc, saved); + param_editOncanvas(item, dt); } else { + Inkscape::UI::Tools::NodeTool *nt = static_cast(dt->event_context); + std::set shapes; + ShapeRecord r; + + r.role = SHAPE_ROLE_LPE_PARAM; + SPDesktop *desktop = SP_ACTIVE_DESKTOP; + SPDocument *doc = desktop->getDocument(); + Inkscape::Util::Unit const * unit = desktop->getNamedView()->getDisplayUnit(); + Geom::Affine inverse = Geom::Scale(1, -1) * Geom::Translate(0, doc->getHeight().value("px")); + r.edit_transform = item->i2dt_affine() * inverse; // TODO is it right? r.item = ref.getObject(); + shapes.insert(r); + nt->_multipath->setItems(shapes); } - shapes.insert(r); - nt->_multipath->setItems(shapes); } void