summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/live_effects/lpe-clone-original.cpp18
-rw-r--r--src/live_effects/parameter/item.cpp26
-rw-r--r--src/live_effects/parameter/originalitem.cpp21
-rw-r--r--src/live_effects/parameter/originalitem.h5
4 files changed, 26 insertions, 44 deletions
diff --git a/src/live_effects/lpe-clone-original.cpp b/src/live_effects/lpe-clone-original.cpp
index 4fc74b275..33abd685a 100644
--- a/src/live_effects/lpe-clone-original.cpp
+++ b/src/live_effects/lpe-clone-original.cpp
@@ -24,7 +24,7 @@ LPECloneOriginal::LPECloneOriginal(LivePathEffectObject *lpeobject) :
linked_item(_("Linked Item:"), _("Item from which to take the original data"), "linked_item", &wr, this),
scale(_("Scale %"), _("Scale item %"), "scale", &wr, this, 100.0),
preserve_position(_("Preserve position"), _("Preserve position"), "preserve_position", &wr, this, false),
- inverse(_("Inverse clone"), _("Use LPE item as origin. Destructive"), "inverse", &wr, this, false),
+ inverse(_("Inverse clone"), _("Use LPE item as origin"), "inverse", &wr, this, false),
use_center(_("Relative center of element"), _("Relative center of element"), "use_center", &wr, this, true),
attributes("Attributes linked", "Attributes linked", "attributes", &wr, this,""),
style_attributes("Style attributes linked", "Style attributes linked", "style_attributes", &wr, this,"")
@@ -136,7 +136,11 @@ LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, co
}
} else if ( shape_dest && shape_origin && live && (std::strcmp(attribute, "d") == 0)) {
SPCurve *c = NULL;
- c = shape_origin->getCurve();
+ if (inverse) {
+ c = shape_origin->getCurveBeforeLPE();
+ } else {
+ c = shape_origin->getCurve();
+ }
if (c) {
Geom::PathVector c_pv = c->get_pathvector();
Geom::OptRect orig_bbox = SP_ITEM(origin)->geometricBounds();
@@ -155,13 +159,12 @@ LPECloneOriginal::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, co
c_pv *= scale;
c_pv *= Geom::Translate(orig_point);
}
- if (preserve_position && hasLinkedTransform(attributes)) {
+ if (preserve_position) {
c_pv *= Geom::Translate(dest_point - orig_point);
}
}
if (inverse) {
c_pv *= i2anc_affine(origin, sp_lpe_item);
- origin->getRepr()->setAttribute("inkscape:original-d", sp_svg_write_path(c_pv));
} else {
c_pv *= i2anc_affine(dest, sp_lpe_item);
}
@@ -218,17 +221,16 @@ LPECloneOriginal::doBeforeEffect (SPLPEItem const* lpeitem){
}
if (linked_item.linksToItem()) {
- if ( preserve_position_changed != preserve_position ) {
+ linked_item.setInverse(inverse);
+ if ( preserve_position_changed != preserve_position ) {
if (!preserve_position) {
sp_svg_transform_read(SP_ITEM(sp_lpe_item)->getAttribute("transform"), &preserve_affine);
}
preserve_position_changed = preserve_position;
}
if (inverse) {
- linked_item.param_quit_listening();
cloneAttrbutes(SP_OBJECT(sp_lpe_item), linked_item.getObject(), true, attributes.param_getSVGValue(), style_attributes.param_getSVGValue(), true);
} else {
- linked_item.param_start_listening(linked_item.getObject());
cloneAttrbutes(linked_item.getObject(), SP_OBJECT(sp_lpe_item), true, attributes.param_getSVGValue(), style_attributes.param_getSVGValue(), true);
}
}
@@ -299,7 +301,7 @@ LPECloneOriginal::transform_multiply(Geom::Affine const& postmul, bool set)
void
LPECloneOriginal::doEffect (SPCurve * curve)
{
- if (linked_item.linksToItem()) {
+ if (linked_item.linksToItem() && !inverse) {
SPShape * shape = getCurrentShape();
if(shape){
curve->set_pathvector(shape->getCurve()->get_pathvector());
diff --git a/src/live_effects/parameter/item.cpp b/src/live_effects/parameter/item.cpp
index 0a46ec7ce..8caea4e26 100644
--- a/src/live_effects/parameter/item.cpp
+++ b/src/live_effects/parameter/item.cpp
@@ -135,31 +135,25 @@ ItemParam::addCanvasIndicators(SPLPEItem const*/*lpeitem*/, std::vector<Geom::Pa
void
-ItemParam::start_listening(SPObject * to, bool force)
+ItemParam::start_listening(SPObject * to)
{
if ( to == NULL ) {
return;
}
- if (!linked_delete_connection.connected() || force) {
- std::cout << "111111111111111111\n";
- linked_delete_connection = to->connectDelete(sigc::mem_fun(*this, &ItemParam::linked_delete));
- linked_modified_connection = to->connectModified(sigc::mem_fun(*this, &ItemParam::linked_modified));
- if (SP_IS_ITEM(to)) {
- linked_transformed_connection = SP_ITEM(to)->connectTransformed(sigc::mem_fun(*this, &ItemParam::linked_transformed));
- }
- linked_modified(to, SP_OBJECT_MODIFIED_FLAG); // simulate linked_modified signal, so that path data is updated
+ linked_delete_connection = to->connectDelete(sigc::mem_fun(*this, &ItemParam::linked_delete));
+ linked_modified_connection = to->connectModified(sigc::mem_fun(*this, &ItemParam::linked_modified));
+ if (SP_IS_ITEM(to)) {
+ linked_transformed_connection = SP_ITEM(to)->connectTransformed(sigc::mem_fun(*this, &ItemParam::linked_transformed));
}
+ linked_modified(to, SP_OBJECT_MODIFIED_FLAG); // simulate linked_modified signal, so that path data is updated
}
void
ItemParam::quit_listening(void)
{
- if (linked_delete_connection.connected()) {
- std::cout << "2222222222222222222222\n";
- linked_modified_connection.disconnect();
- linked_delete_connection.disconnect();
- linked_transformed_connection.disconnect();
- }
+ linked_modified_connection.disconnect();
+ linked_delete_connection.disconnect();
+ linked_transformed_connection.disconnect();
}
void
@@ -167,7 +161,7 @@ ItemParam::ref_changed(SPObject */*old_ref*/, SPObject *new_ref)
{
quit_listening();
if ( new_ref ) {
- start_listening(new_ref, true);
+ start_listening(new_ref);
}
}
diff --git a/src/live_effects/parameter/originalitem.cpp b/src/live_effects/parameter/originalitem.cpp
index dc7f2d634..053062128 100644
--- a/src/live_effects/parameter/originalitem.cpp
+++ b/src/live_effects/parameter/originalitem.cpp
@@ -84,25 +84,12 @@ OriginalItemParam::param_newWidget()
}
void
-OriginalItemParam::param_start_listening(SPObject * to)
-{
- if ( to == NULL ) {
- return;
- }
- start_listening(to, false);
-}
-
-void
-OriginalItemParam::param_quit_listening(void)
-{
- quit_listening();
-}
-
-void
OriginalItemParam::linked_modified_callback(SPObject *linked_obj, guint /*flags*/)
{
- emit_changed();
- SP_OBJECT(param_effect->getLPEObj())->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ if (!inverse) {
+ emit_changed();
+ SP_OBJECT(param_effect->getLPEObj())->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ }
}
void
diff --git a/src/live_effects/parameter/originalitem.h b/src/live_effects/parameter/originalitem.h
index 5478a1e4b..58d04e05a 100644
--- a/src/live_effects/parameter/originalitem.h
+++ b/src/live_effects/parameter/originalitem.h
@@ -23,11 +23,9 @@ public:
Inkscape::UI::Widget::Registry* wr,
Effect* effect);
virtual ~OriginalItemParam();
-
+ void setInverse(bool inversed) { inverse = inversed; }
bool linksToItem() const { return (href != NULL); }
SPItem * getObject() const { return ref.getObject(); }
- void param_start_listening(SPObject * to);
- void param_quit_listening(void);
virtual Gtk::Widget * param_newWidget();
@@ -38,6 +36,7 @@ protected:
void on_select_original_button_click();
private:
+ bool inverse;
OriginalItemParam(const OriginalItemParam&);
OriginalItemParam& operator=(const OriginalItemParam&);
};