Fix crash on deleting all subpaths (#1460)
* Fix crash on deleting all subpaths * Delete layer if no manipulators exist
This commit is contained in:
parent
de235e3be1
commit
8a816cd701
|
|
@ -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>) {
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue