Fix crash on deleting all subpaths (#1460)

* Fix crash on deleting all subpaths

* Delete layer if no manipulators exist
This commit is contained in:
0HyperCube 2023-11-16 23:42:21 +00:00 committed by GitHub
parent de235e3be1
commit 8a816cd701
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 13 additions and 0 deletions

View File

@ -424,6 +424,7 @@ impl<'a> ModifyInputsContext<'a> {
let [mut old_bounds_min, mut old_bounds_max] = [DVec2::ZERO, DVec2::ONE]; let [mut old_bounds_min, mut old_bounds_max] = [DVec2::ZERO, DVec2::ONE];
let [mut new_bounds_min, mut new_bounds_max] = [DVec2::ZERO, DVec2::ONE]; let [mut new_bounds_min, mut new_bounds_max] = [DVec2::ZERO, DVec2::ONE];
let mut empty = false;
self.modify_inputs("Shape", false, |inputs, _node_id, _metadata| { self.modify_inputs("Shape", false, |inputs, _node_id, _metadata| {
let [subpaths, mirror_angle_groups] = inputs.as_mut_slice() else { let [subpaths, mirror_angle_groups] = inputs.as_mut_slice() else {
@ -448,11 +449,17 @@ impl<'a> ModifyInputsContext<'a> {
[old_bounds_min, old_bounds_max] = transform_utils::nonzero_subpath_bounds(subpaths); [old_bounds_min, old_bounds_max] = transform_utils::nonzero_subpath_bounds(subpaths);
transform_utils::VectorModificationState { subpaths, mirror_angle_groups }.modify(modification); transform_utils::VectorModificationState { subpaths, mirror_angle_groups }.modify(modification);
empty = !subpaths.iter().any(|subpath| !subpath.is_empty());
[new_bounds_min, new_bounds_max] = transform_utils::nonzero_subpath_bounds(subpaths); [new_bounds_min, new_bounds_max] = transform_utils::nonzero_subpath_bounds(subpaths);
}); });
self.update_bounds([old_bounds_min, old_bounds_max], [new_bounds_min, new_bounds_max]); self.update_bounds([old_bounds_min, old_bounds_max], [new_bounds_min, new_bounds_max]);
if empty {
if let Some(layer) = self.layer_node {
self.responses.add(DocumentMessage::DeleteLayer { layer_path: vec![layer] })
}
}
} }
fn brush_modify(&mut self, strokes: Vec<BrushStroke>) { fn brush_modify(&mut self, strokes: Vec<BrushStroke>) {

View File

@ -141,6 +141,9 @@ impl<ManipulatorGroupId: crate::Identifier> Subpath<ManipulatorGroupId> {
/// Write the curve argument to the string (the d="..." part) /// Write the curve argument to the string (the d="..." part)
pub fn subpath_to_svg(&self, svg: &mut String, transform: glam::DAffine2) -> std::fmt::Result { pub fn subpath_to_svg(&self, svg: &mut String, transform: glam::DAffine2) -> std::fmt::Result {
if self.is_empty() {
return Ok(());
}
let start = transform.transform_point2(self[0].anchor); let start = transform.transform_point2(self[0].anchor);
write!(svg, "{SVG_ARG_MOVE}{},{}", start.x, start.y)?; write!(svg, "{SVG_ARG_MOVE}{},{}", start.x, start.y)?;
for bezier in self.iter() { for bezier in self.iter() {

View File

@ -51,6 +51,9 @@ impl<ManipulatorGroupId: crate::Identifier> Iterator for SubpathIter<'_, Manipul
// Returns the Bezier representation of each `Subpath` segment, defined between a pair of adjacent manipulator points. // Returns the Bezier representation of each `Subpath` segment, defined between a pair of adjacent manipulator points.
fn next(&mut self) -> Option<Self::Item> { fn next(&mut self) -> Option<Self::Item> {
if self.subpath.is_empty() {
return None;
}
let len = self.subpath.len() - 1 let len = self.subpath.len() - 1
+ match self.subpath.closed { + match self.subpath.closed {
true => 1, true => 1,