diff --git a/src/live_effects/lpe-bendpath.cpp b/src/live_effects/lpe-bendpath.cpp index 8b9aab8466871cb6ea030d214f6cd4ef17b6bca2..afe1c594911f7044bea79fe2f42899918d76983d 100644 --- a/src/live_effects/lpe-bendpath.cpp +++ b/src/live_effects/lpe-bendpath.cpp @@ -98,7 +98,9 @@ LPEBendPath::doBeforeEffect (SPLPEItem const* lpeitem) void LPEBendPath::transform_multiply(Geom::Affine const &postmul, bool /*set*/) { - bend_path.param_transform_multiply(postmul, false); + if (sp_lpe_item && sp_lpe_item->pathEffectsEnabled() && sp_lpe_item->optimizeTransforms()) { + bend_path.param_transform_multiply(postmul, false); + } } Geom::Piecewise > diff --git a/src/live_effects/lpe-bool.cpp b/src/live_effects/lpe-bool.cpp index 96677291a39129c67034a2b0ba2f82ff889502e3..52e4f447cfc8b1cca94299a74e2e1310e2957d21 100644 --- a/src/live_effects/lpe-bool.cpp +++ b/src/live_effects/lpe-bool.cpp @@ -21,9 +21,7 @@ #include "2geom/svg-path-parser.h" #include "display/curve.h" #include "object/sp-shape.h" -#include "seltrans.h" #include "svg/svg.h" -#include "ui/tools/select-tool.h" #include "helper/geom.h" @@ -96,16 +94,11 @@ LPEBool::LPEBool(LivePathEffectObject *lpeobject) registerParameter(&fill_type_operand); show_orig_path = true; operand = dynamic_cast(operand_path.getObject()); - contdown = 0; } LPEBool::~LPEBool() = default; -void LPEBool::resetDefaults(SPItem const * /*item*/) -{ -} - bool cmp_cut_position(const Path::cut_position &a, const Path::cut_position &b) { return a.piece == b.piece ? a.t < b.t : a.piece < b.piece; @@ -387,6 +380,9 @@ void LPEBool::doBeforeEffect(SPLPEItem const *lpeitem) } operand = current_operand; } + if (operand) { + operand->setHidden(hide_linked); + } if (operand && operand->parent && sp_lpe_item && sp_lpe_item->parent != operand->parent) { Inkscape::XML::Node *copy = operand->getRepr()->duplicate(xml_doc); operand = dynamic_cast(sp_lpe_item->parent->appendChildRepr(copy)); @@ -395,37 +391,12 @@ void LPEBool::doBeforeEffect(SPLPEItem const *lpeitem) Glib::ustring itemid = operand->getId(); operand_path.linkitem(itemid); } - // TODO: make 2 methods to globaly inform to a LPE item when is grabbed - // and when the transform is applyed both callers can be in Inkscape::SelTrans in grab and ungrab functions - SPDesktop *desktop = SP_ACTIVE_DESKTOP; - if (desktop && operand) { - Inkscape::Selection *selection = desktop->getSelection(); - Inkscape::UI::Tools::SelectTool *selectool = - dynamic_cast(desktop->event_context); - gint cdown = 2; - if (selectool && selectool->_seltrans && selectool->_seltrans->isGrabbed()) { - cdown = 3; - } - if (!is_load && desktop && selection && operand && operand->isHidden() && hide_linked && contdown != 1) { - selection->add(operand); - contdown = cdown; - } - if (contdown == 1 && desktop && selection && operand && operand->isHidden() && hide_linked) { - selection->remove(operand); - } - if (contdown > 0) { - --contdown; - } - if (is_load) { - contdown = 1; - } - if (operand_path.linksToPath() && operand) { - SPItem *itemsel = selection->singleItem(); - if (operand->isHidden() && hide_linked && itemsel && itemsel == operand) { - hide_linked.param_setValue(false); - hide_linked.write_to_SVG(); - } - } +} + +void LPEBool::transform_multiply(Geom::Affine const &postmul, bool /*set*/) +{ + if (operand) { + operand->transform *= sp_item_transform_repr(sp_lpe_item).inverse() * postmul; } } @@ -439,12 +410,7 @@ void LPEBool::doEffect(SPCurve *curve) } if (operand_path.linksToPath() && operand) { - if (!operand->isHidden() && hide_linked) { - operand->setHidden(true); - } - if (operand->isHidden() && !hide_linked) { - operand->setHidden(false); - } + bool_op_ex op = bool_operation.get_value(); bool swap = !(swap_operands.get_value()); diff --git a/src/live_effects/lpe-bool.h b/src/live_effects/lpe-bool.h index 4fd00180d553ca11ec10794a9c716e5fadfc5ca5..c7c8ffbb59f0b915fa05eeb3e52b751930330c59 100644 --- a/src/live_effects/lpe-bool.h +++ b/src/live_effects/lpe-bool.h @@ -27,7 +27,7 @@ public: void doEffect(SPCurve *curve) override; void doBeforeEffect(SPLPEItem const *lpeitem) override; - void resetDefaults(SPItem const *item) override; + void transform_multiply(Geom::Affine const &postmul, bool set) override; void doOnVisibilityToggled(SPLPEItem const * /*lpeitem*/) override; void doOnRemove(SPLPEItem const * /*lpeitem*/) override; @@ -61,7 +61,6 @@ private: BoolParam swap_operands; BoolParam rmv_inner; SPItem *operand; - size_t contdown; }; }; //namespace LivePathEffect diff --git a/src/live_effects/lpe-envelope.cpp b/src/live_effects/lpe-envelope.cpp index cac8d7b367b9b666bec4250033c59d80d3ae4078..b0ff8a4956ad29bd29b12b41a995595130b3c708 100644 --- a/src/live_effects/lpe-envelope.cpp +++ b/src/live_effects/lpe-envelope.cpp @@ -37,10 +37,12 @@ LPEEnvelope::~LPEEnvelope() void LPEEnvelope::transform_multiply(Geom::Affine const &postmul, bool /*set*/) { - bend_path1.param_transform_multiply(postmul, false); - bend_path2.param_transform_multiply(postmul, false); - bend_path3.param_transform_multiply(postmul, false); - bend_path4.param_transform_multiply(postmul, false); + if (sp_lpe_item && sp_lpe_item->pathEffectsEnabled() && sp_lpe_item->optimizeTransforms()) { + bend_path1.param_transform_multiply(postmul, false); + bend_path2.param_transform_multiply(postmul, false); + bend_path3.param_transform_multiply(postmul, false); + bend_path4.param_transform_multiply(postmul, false); + } } void diff --git a/src/live_effects/lpe-interpolate.cpp b/src/live_effects/lpe-interpolate.cpp index 7012aa528ce2369e266703283ad5fcd580cd71cf..1e2ce45e2485489bd3816c8e743e7d3fb6e2d16a 100644 --- a/src/live_effects/lpe-interpolate.cpp +++ b/src/live_effects/lpe-interpolate.cpp @@ -49,7 +49,9 @@ LPEInterpolate::~LPEInterpolate() = default; void LPEInterpolate::transform_multiply(Geom::Affine const &postmul, bool /*set*/) { - trajectory_path.param_transform_multiply(postmul, false); + if (sp_lpe_item && sp_lpe_item->pathEffectsEnabled() && sp_lpe_item->optimizeTransforms()) { + trajectory_path.param_transform_multiply(postmul, false); + } } /* diff --git a/src/live_effects/lpe-offset.cpp b/src/live_effects/lpe-offset.cpp index e88b79815046777552233fdff3e2c75a0dfe0bdc..8ab5d115bcfaa99a8b4e8663dc2139176fede623 100644 --- a/src/live_effects/lpe-offset.cpp +++ b/src/live_effects/lpe-offset.cpp @@ -138,8 +138,10 @@ LPEOffset::get_nearest_point(Geom::PathVector pathv, Geom::Point point) const void LPEOffset::transform_multiply(Geom::Affine const &postmul, bool /*set*/) { - offset.param_transform_multiply(postmul, true); - offset_pt = Geom::Point(Geom::infinity(), Geom::infinity()); + if (sp_lpe_item && sp_lpe_item->pathEffectsEnabled() && sp_lpe_item->optimizeTransforms()) { + offset.param_transform_multiply(postmul, true); + offset_pt = Geom::Point(Geom::infinity(), Geom::infinity()); + } } Geom::Point diff --git a/src/live_effects/lpe-patternalongpath.cpp b/src/live_effects/lpe-patternalongpath.cpp index 5fd2f37bf40c260638fc3636e5cd4f10a6c247c5..04312b4a341d1acfb74b4bf66b4be14eea9c2215 100644 --- a/src/live_effects/lpe-patternalongpath.cpp +++ b/src/live_effects/lpe-patternalongpath.cpp @@ -116,7 +116,9 @@ LPEPatternAlongPath::~LPEPatternAlongPath() void LPEPatternAlongPath::transform_multiply(Geom::Affine const &postmul, bool /*set*/) { - pattern.param_transform_multiply(postmul, false); + if (sp_lpe_item && sp_lpe_item->pathEffectsEnabled() && sp_lpe_item->optimizeTransforms()) { + pattern.param_transform_multiply(postmul, false); + } } void diff --git a/src/live_effects/lpe-perspective-envelope.cpp b/src/live_effects/lpe-perspective-envelope.cpp index 0d80b683c62dc70d94f12fc2ca414903a662056a..be6d5722d7163abaca10d859e3cb3f477975926f 100644 --- a/src/live_effects/lpe-perspective-envelope.cpp +++ b/src/live_effects/lpe-perspective-envelope.cpp @@ -69,10 +69,12 @@ LPEPerspectiveEnvelope::~LPEPerspectiveEnvelope() void LPEPerspectiveEnvelope::transform_multiply(Geom::Affine const &postmul, bool /*set*/) { - up_left_point.param_transform_multiply(postmul, false); - up_right_point.param_transform_multiply(postmul, false); - down_left_point.param_transform_multiply(postmul, false); - down_right_point.param_transform_multiply(postmul, false); + if (sp_lpe_item && sp_lpe_item->pathEffectsEnabled() && sp_lpe_item->optimizeTransforms()) { + up_left_point.param_transform_multiply(postmul, false); + up_right_point.param_transform_multiply(postmul, false); + down_left_point.param_transform_multiply(postmul, false); + down_right_point.param_transform_multiply(postmul, false); + } } bool pointInTriangle(Geom::Point const &p, std::vector points) diff --git a/src/live_effects/lpe-transform_2pts.cpp b/src/live_effects/lpe-transform_2pts.cpp index a426018625c28e820ee7074b76bc4f40051e02a1..1c59cf2dda9eb18acc56c0d6e80c8fcf32b5a287 100644 --- a/src/live_effects/lpe-transform_2pts.cpp +++ b/src/live_effects/lpe-transform_2pts.cpp @@ -119,8 +119,10 @@ LPETransform2Pts::doOnApply(SPLPEItem const* lpeitem) void LPETransform2Pts::transform_multiply(Geom::Affine const &postmul, bool /*set*/) { - start.param_transform_multiply(postmul, false); - end.param_transform_multiply(postmul, false); + if (sp_lpe_item && sp_lpe_item->pathEffectsEnabled() && sp_lpe_item->optimizeTransforms()) { + start.param_transform_multiply(postmul, false); + end.param_transform_multiply(postmul, false); + } } void diff --git a/src/object/sp-ellipse.cpp b/src/object/sp-ellipse.cpp index 6b30516e123a23601d623d589189eb217423a025..cd97d536a12cd9ff3d44d74514cb558fe7550a90 100644 --- a/src/object/sp-ellipse.cpp +++ b/src/object/sp-ellipse.cpp @@ -500,7 +500,6 @@ void SPGenericEllipse::set_shape() Geom::Affine SPGenericEllipse::set_transform(Geom::Affine const &xform) { - notifyTransform(xform); if (pathEffectsEnabled() && !optimizeTransforms()) { return xform; } diff --git a/src/object/sp-item.cpp b/src/object/sp-item.cpp index 4c5d5721c37e42bc44ef21cddc60438c39293ec4..77ef6a2e304382024d6ed1e7a7c1e5a4c4826074 100644 --- a/src/object/sp-item.cpp +++ b/src/object/sp-item.cpp @@ -1531,6 +1531,7 @@ void SPItem::doWriteTransform(Geom::Affine const &transform, Geom::Affine const // If onSetTransform is not overridden, CItem::onSetTransform will return the transform it was given as a parameter. // onSetTransform cannot be pure due to the fact that not all visible Items are transformable. SPLPEItem * lpeitem = SP_LPE_ITEM(this); + lpeitem->notifyTransform(transform); if ( // run the object's set_transform (i.e. embed transform) only if: (dynamic_cast(this) && firstChild() && dynamic_cast(firstChild())) || (!preserve && // user did not chose to preserve all transforms diff --git a/src/object/sp-path.cpp b/src/object/sp-path.cpp index 54f57001299ef7e894c185f597709e0d7b83f0ad..59e7fd062f83fe6327229224ee6af100a8141191 100644 --- a/src/object/sp-path.cpp +++ b/src/object/sp-path.cpp @@ -343,7 +343,6 @@ Geom::Affine SPPath::set_transform(Geom::Affine const &transform) { if (!_curve) { // 0 nodes, nothing to transform return Geom::identity(); } - if (pathEffectsEnabled() && !optimizeTransforms()) { return transform; } @@ -352,7 +351,6 @@ Geom::Affine SPPath::set_transform(Geom::Affine const &transform) { } else { _curve->transform(transform); } - notifyTransform(transform); // Adjust stroke this->adjust_stroke(transform.descrim()); diff --git a/src/object/sp-rect.cpp b/src/object/sp-rect.cpp index fda6ee402f3b58aba0dae86f36bfad141ceae2fd..a74bd03cfe3035acb7f705fe70e1cadd9d1e7869 100644 --- a/src/object/sp-rect.cpp +++ b/src/object/sp-rect.cpp @@ -381,7 +381,6 @@ Geom::Affine SPRect::set_transform(Geom::Affine const& xform) { if (pathEffectsEnabled() && !optimizeTransforms()) { return xform; } - notifyTransform(xform); /* Calculate rect start in parent coords. */ Geom::Point pos(Geom::Point(this->x.computed, this->y.computed) * xform); diff --git a/src/object/sp-spiral.cpp b/src/object/sp-spiral.cpp index 69f85a555cf84e7ee06a0838b46705d0ae4bfdbe..9d970a20c07feb066958b205233d250acfa36bcb 100644 --- a/src/object/sp-spiral.cpp +++ b/src/object/sp-spiral.cpp @@ -416,7 +416,6 @@ Geom::Affine SPSpiral::set_transform(Geom::Affine const &xform) if (!xform.withoutTranslation().isUniformScale()) { return xform; } - notifyTransform(xform); /* Calculate spiral start in parent coords. */ Geom::Point pos( Geom::Point(this->cx, this->cy) * xform ); diff --git a/src/object/sp-star.cpp b/src/object/sp-star.cpp index 11835dc8298298c89914db3e0a83a9858278c1ca..e3e8bbe1a2ddf6aa63cab3c223a088ee329460f1 100644 --- a/src/object/sp-star.cpp +++ b/src/object/sp-star.cpp @@ -498,8 +498,6 @@ Geom::Affine SPStar::set_transform(Geom::Affine const &xform) if (!xform.withoutTranslation().isUniformScale()) { return xform; } - notifyTransform(xform); - /* Calculate star start in parent coords. */ Geom::Point pos( this->center * xform );