Fix crash when reordering layers (#1492)

This commit is contained in:
0HyperCube 2023-12-09 13:08:46 +00:00 committed by GitHub
parent c33ba1b315
commit 10863acd83
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 10 additions and 0 deletions

View File

@ -525,6 +525,10 @@ impl<'a> ModifyInputsContext<'a> {
let mut delete_nodes = vec![id]; let mut delete_nodes = vec![id];
for (_node, id) in self.network.upstream_flow_back_from_nodes(vec![id], true) { for (_node, id) in self.network.upstream_flow_back_from_nodes(vec![id], true) {
// Don't delete the node if other layers depend on it.
if self.outwards_links.get(&id).is_some_and(|nodes| nodes.len() > 1) {
break;
}
if self.outwards_links.get(&id).is_some_and(|outwards| outwards.len() == 1) { if self.outwards_links.get(&id).is_some_and(|outwards| outwards.len() == 1) {
delete_nodes.push(id); delete_nodes.push(id);
} }

View File

@ -33,6 +33,7 @@ impl OriginalTransforms {
pub fn update<'a>(&mut self, selected: &'a [LayerNodeIdentifier], document: &'a Document, shape_editor: Option<&'a ShapeState>) { pub fn update<'a>(&mut self, selected: &'a [LayerNodeIdentifier], document: &'a Document, shape_editor: Option<&'a ShapeState>) {
match self { match self {
OriginalTransforms::Layer(layer_map) => { OriginalTransforms::Layer(layer_map) => {
layer_map.retain(|layer, _| selected.contains(layer));
for &layer in selected { for &layer in selected {
layer_map.entry(layer).or_insert_with(|| document.metadata.upstream_transform(layer.to_node())); layer_map.entry(layer).or_insert_with(|| document.metadata.upstream_transform(layer.to_node()));
} }

View File

@ -483,6 +483,7 @@ impl Fsm for SelectToolFsmState {
if let Some(bounds) = &mut tool_data.bounding_box_overlays { if let Some(bounds) = &mut tool_data.bounding_box_overlays {
let document = &document.document_legacy; let document = &document.document_legacy;
tool_data.layers_dragging.retain(|layer| document.document_network.nodes.contains_key(&layer.to_node()));
let mut selected = Selected::new( let mut selected = Selected::new(
&mut bounds.original_transforms, &mut bounds.original_transforms,
&mut bounds.center_of_transformation, &mut bounds.center_of_transformation,
@ -500,6 +501,7 @@ impl Fsm for SelectToolFsmState {
responses.add(DocumentMessage::StartTransaction); responses.add(DocumentMessage::StartTransaction);
if let Some(bounds) = &mut tool_data.bounding_box_overlays { if let Some(bounds) = &mut tool_data.bounding_box_overlays {
tool_data.layers_dragging.retain(|layer| document.network().nodes.contains_key(&layer.to_node()));
let mut selected = Selected::new( let mut selected = Selected::new(
&mut bounds.original_transforms, &mut bounds.original_transforms,
&mut bounds.center_of_transformation, &mut bounds.center_of_transformation,
@ -610,6 +612,7 @@ impl Fsm for SelectToolFsmState {
let (position, size) = movement.new_size(snapped_mouse_position, bounds.transform, center, bounds.center_of_transformation, axis_align); let (position, size) = movement.new_size(snapped_mouse_position, bounds.transform, center, bounds.center_of_transformation, axis_align);
let (delta, mut _pivot) = movement.bounds_to_scale_transform(position, size); let (delta, mut _pivot) = movement.bounds_to_scale_transform(position, size);
tool_data.layers_dragging.retain(|layer| document.network().nodes.contains_key(&layer.to_node()));
let selected = &tool_data.layers_dragging; let selected = &tool_data.layers_dragging;
let mut selected = Selected::new(&mut bounds.original_transforms, &mut _pivot, selected, responses, &document.document_legacy, None, &ToolType::Select); let mut selected = Selected::new(&mut bounds.original_transforms, &mut _pivot, selected, responses, &document.document_legacy, None, &ToolType::Select);
@ -636,6 +639,7 @@ impl Fsm for SelectToolFsmState {
let delta = DAffine2::from_angle(snapped_angle); let delta = DAffine2::from_angle(snapped_angle);
tool_data.layers_dragging.retain(|layer| document.network().nodes.contains_key(&layer.to_node()));
let mut selected = Selected::new( let mut selected = Selected::new(
&mut bounds.original_transforms, &mut bounds.original_transforms,
&mut bounds.center_of_transformation, &mut bounds.center_of_transformation,
@ -815,6 +819,7 @@ impl Fsm for SelectToolFsmState {
if let Some(path) = tool_data.drag_box_overlay_layer.take() { if let Some(path) = tool_data.drag_box_overlay_layer.take() {
responses.add_front(DocumentMessage::Overlays(Operation::DeleteLayer { path }.into())) responses.add_front(DocumentMessage::Overlays(Operation::DeleteLayer { path }.into()))
}; };
tool_data.layers_dragging.retain(|layer| document.network().nodes.contains_key(&layer.to_node()));
if let Some(mut bounding_box_overlays) = tool_data.bounding_box_overlays.take() { if let Some(mut bounding_box_overlays) = tool_data.bounding_box_overlays.take() {
let mut selected = Selected::new( let mut selected = Selected::new(
&mut bounding_box_overlays.original_transforms, &mut bounding_box_overlays.original_transforms,