diff --git a/src/live_effects/lpe-bool.cpp b/src/live_effects/lpe-bool.cpp index 09b0ccf02d754a4aa0bdebdf01f52ffb5bd17c9b..13291620ce3975cb849064fc8de20fc9055a06b5 100644 --- a/src/live_effects/lpe-bool.cpp +++ b/src/live_effects/lpe-bool.cpp @@ -667,15 +667,23 @@ void LPEBool::addCanvasIndicators(SPLPEItem const * /*lpeitem*/, std::vector(operand_path.getObject()); - if (operand) { - if (keep_paths) { - if (is_visible) { - operand->deleteObject(true); - } - } else { - if (is_visible) { - remove_filter(); + // use hreflist method to update sp_lpe_item because can be bad referenced + items.clear(); + auto hreflist = getLPEObj()->hrefList; + if (hreflist.size()) { + sp_lpe_item = dynamic_cast(hreflist.back()); + if (sp_lpe_item) { + SPItem *operand = dynamic_cast(operand_path.getObject()); + if (operand) { + if (keep_paths) { + if (is_visible) { + operand->deleteObject(true); + } + } else { + if (is_visible) { + remove_filter(); + } + } } } } diff --git a/src/live_effects/lpe-copy_rotate.cpp b/src/live_effects/lpe-copy_rotate.cpp index 5675f4438c13ae30c49708463e68364094589114..fab908c9c905ac402bc30d8eff4613032afc53f5 100644 --- a/src/live_effects/lpe-copy_rotate.cpp +++ b/src/live_effects/lpe-copy_rotate.cpp @@ -667,13 +667,22 @@ LPECopyRotate::doOnVisibilityToggled(SPLPEItem const* /*lpeitem*/) void LPECopyRotate::doOnRemove (SPLPEItem const* lpeitem) { - //set "keep paths" hook on sp-lpe-item.cpp - if (keep_paths) { - processObjects(LPE_TO_OBJECTS); - items.clear(); - return; + // set "keep paths" hook on sp-lpe-item.cpp + // use hreflist method to update sp_lpe_item because can be bad referenced + items.clear(); + auto hreflist = getLPEObj()->hrefList; + if (hreflist.size()) { + sp_lpe_item = dynamic_cast(hreflist.back()); + if (sp_lpe_item) { + //set "keep paths" hook on sp-lpe-item.cpp + if (keep_paths) { + processObjects(LPE_TO_OBJECTS); + items.clear(); + return; + } + processObjects(LPE_ERASE); + } } - processObjects(LPE_ERASE); } } //namespace LivePathEffect diff --git a/src/live_effects/lpe-measure-segments.cpp b/src/live_effects/lpe-measure-segments.cpp index 42293aad902c2655156fd009a4306b29cbac9f33..765ab777ef0113a6c50754f34f00efd338388578 100644 --- a/src/live_effects/lpe-measure-segments.cpp +++ b/src/live_effects/lpe-measure-segments.cpp @@ -1207,13 +1207,22 @@ LPEMeasureSegments::doOnVisibilityToggled(SPLPEItem const* /*lpeitem*/) void LPEMeasureSegments::doOnRemove (SPLPEItem const* /*lpeitem*/) { - //set "keep paths" hook on sp-lpe-item.cpp - if (keep_paths) { - processObjects(LPE_TO_OBJECTS); - items.clear(); - return; + // set "keep paths" hook on sp-lpe-item.cpp + // use hreflist method to update sp_lpe_item because can be bad referenced + items.clear(); + auto hreflist = getLPEObj()->hrefList; + if (hreflist.size()) { + sp_lpe_item = dynamic_cast(hreflist.back()); + if (sp_lpe_item) { + //set "keep paths" hook on sp-lpe-item.cpp + if (keep_paths) { + processObjects(LPE_TO_OBJECTS); + items.clear(); + return; + } + processObjects(LPE_ERASE); + } } - processObjects(LPE_ERASE); } }; //namespace LivePathEffect diff --git a/src/live_effects/lpe-mirror_symmetry.cpp b/src/live_effects/lpe-mirror_symmetry.cpp index e7510a355d78a0b361d0a51cbacead9ba2aa6911..c696766fb9bf59830f0c3d2e5d62e934c7544ea3 100644 --- a/src/live_effects/lpe-mirror_symmetry.cpp +++ b/src/live_effects/lpe-mirror_symmetry.cpp @@ -413,12 +413,20 @@ void LPEMirrorSymmetry::doOnRemove (SPLPEItem const* /*lpeitem*/) { //set "keep paths" hook on sp-lpe-item.cpp - if (keep_paths) { - processObjects(LPE_TO_OBJECTS); - items.clear(); - return; + // use hreflist method to update sp_lpe_item because can be bad referenced + items.clear(); + auto hreflist = getLPEObj()->hrefList; + if (hreflist.size()) { + sp_lpe_item = dynamic_cast(hreflist.back()); + if (sp_lpe_item) { + if (keep_paths) { + processObjects(LPE_TO_OBJECTS); + items.clear(); + return; + } + processObjects(LPE_ERASE); + } } - processObjects(LPE_ERASE); } void diff --git a/src/live_effects/lpe-slice.cpp b/src/live_effects/lpe-slice.cpp index d941e1d853bc9e790a0a88862494d6d5268be4ed..f6c5db00b42c76e1c14790f1bfaab96b4c0e4fef 100644 --- a/src/live_effects/lpe-slice.cpp +++ b/src/live_effects/lpe-slice.cpp @@ -701,24 +701,32 @@ void LPESlice::doOnRemove (SPLPEItem const* /*lpeitem*/) { //set "keep paths" hook on sp-lpe-item.cpp + // use hreflist method to update sp_lpe_item because can be bad referenced items.clear(); - Glib::ustring theclass = sp_lpe_item->getId(); - theclass += "-slice"; - for (auto item : getSPDoc()->getObjectsByClass(theclass)) { - items.emplace_back(item->getId()); - } - if (keep_paths) { - processObjects(LPE_TO_OBJECTS); - items.clear(); - return; - } - if (sp_lpe_item->countLPEOfType(SLICE) == 1) { - processObjects(LPE_ERASE); - } else { - for (auto item: items) { - SPItem *extraitem = dynamic_cast(getSPDoc()->getObjectById(item.c_str())); - if (extraitem) { - extraitem->setHidden(true); + auto hreflist = getLPEObj()->hrefList; + if (hreflist.size()) { + sp_lpe_item = dynamic_cast(hreflist.back()); + if (sp_lpe_item) { + items.clear(); + Glib::ustring theclass = sp_lpe_item->getId(); + theclass += "-slice"; + for (auto item : getSPDoc()->getObjectsByClass(theclass)) { + items.emplace_back(item->getId()); + } + if (keep_paths) { + processObjects(LPE_TO_OBJECTS); + items.clear(); + return; + } + if (sp_lpe_item->countLPEOfType(SLICE) == 1) { + processObjects(LPE_ERASE); + } else { + for (auto item: items) { + SPItem *extraitem = dynamic_cast(getSPDoc()->getObjectById(item.c_str())); + if (extraitem) { + extraitem->setHidden(true); + } + } } } }