Fix crash when reordering layers (#1492)
This commit is contained in:
parent
c33ba1b315
commit
10863acd83
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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()));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue