mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-10-02 23:58:11 +08:00
Fix layer insertion
This commit is contained in:
@@ -5487,36 +5487,42 @@ impl NodeNetworkInterface {
|
|||||||
let height_below_layer = lowest_y_position - layer_to_move_position.y - 3;
|
let height_below_layer = lowest_y_position - layer_to_move_position.y - 3;
|
||||||
|
|
||||||
// If there is an upstream node in the new location for the layer, create space for the moved layer by shifting the upstream node down
|
// If there is an upstream node in the new location for the layer, create space for the moved layer by shifting the upstream node down
|
||||||
if let Some(upstream_node_id) = post_node_input.as_node() {
|
// if let Some(upstream_node_id) = post_node_input.as_node() {
|
||||||
// Select the layer to move to ensure the shifting works correctly
|
// // Select the layer to move to ensure the shifting works correctly
|
||||||
let Some(selected_nodes) = self.selected_nodes_mut(network_path) else {
|
// let Some(selected_nodes) = self.selected_nodes_mut(network_path) else {
|
||||||
log::error!("Could not get selected nodes in move_layer_to_stack");
|
// log::error!("Could not get selected nodes in move_layer_to_stack");
|
||||||
return;
|
// return;
|
||||||
};
|
// };
|
||||||
let old_selected_nodes = selected_nodes.replace_with(vec![upstream_node_id]);
|
// let old_selected_nodes = selected_nodes.replace_with(vec![upstream_node_id]);
|
||||||
|
|
||||||
// Create the minimum amount space for the moved layer
|
// // Create the minimum amount space for the moved layer
|
||||||
for _ in 0..3 {
|
// for _ in 0..3 {
|
||||||
self.vertical_shift_with_push(&upstream_node_id, 1, &mut HashSet::new(), network_path);
|
// self.vertical_shift_with_push(&upstream_node_id, 1, &mut HashSet::new(), network_path);
|
||||||
}
|
// }
|
||||||
|
|
||||||
let Some(stack_position) = self.position(&upstream_node_id, network_path) else {
|
// let Some(stack_position) = self.position(&upstream_node_id, network_path) else {
|
||||||
log::error!("Could not get stack position in move_layer_to_stack");
|
// log::error!("Could not get stack position in move_layer_to_stack");
|
||||||
return;
|
// return;
|
||||||
};
|
// };
|
||||||
|
|
||||||
let current_gap = stack_position.y - (after_move_post_layer_position.y + 2);
|
// let current_gap = stack_position.y - (after_move_post_layer_position.y + 2);
|
||||||
let target_gap = 1 + height_above_layer + 2 + height_below_layer + 1;
|
// let target_gap = 1 + height_above_layer + 2 + height_below_layer + 1;
|
||||||
|
|
||||||
for _ in 0..(target_gap - current_gap).max(0) {
|
// for _ in 0..(target_gap - current_gap).max(0) {
|
||||||
self.vertical_shift_with_push(&upstream_node_id, 1, &mut HashSet::new(), network_path);
|
// self.vertical_shift_with_push(&upstream_node_id, 1, &mut HashSet::new(), network_path);
|
||||||
}
|
// }
|
||||||
|
|
||||||
let _ = self.selected_nodes_mut(network_path).unwrap().replace_with(old_selected_nodes);
|
// let _ = self.selected_nodes_mut(network_path).unwrap().replace_with(old_selected_nodes);
|
||||||
}
|
// }
|
||||||
|
|
||||||
// If inserting into a stack with a parent, ensure the parent stack has enough space for the child stack
|
let top_of_single_layer_stack = insert_index == 0
|
||||||
if parent != LayerNodeIdentifier::ROOT_PARENT
|
&& self.upstream_output_connector(&InputConnector::node(layer.to_node(), 1), network_path).is_some_and(|current_top| {
|
||||||
|
self.outward_wires(network_path)
|
||||||
|
.is_some_and(|wires| wires.get(¤t_top).is_some_and(|outward_wires| outward_wires.len() == 1))
|
||||||
|
});
|
||||||
|
// If inserting into a stack with a single parent, ensure the parent stack has enough space for the child stack
|
||||||
|
if top_of_single_layer_stack
|
||||||
|
&& parent != LayerNodeIdentifier::ROOT_PARENT
|
||||||
&& let Some(upstream_sibling) = parent.next_sibling(&self.document_metadata)
|
&& let Some(upstream_sibling) = parent.next_sibling(&self.document_metadata)
|
||||||
{
|
{
|
||||||
let Some(parent_position) = self.position(&parent.to_node(), network_path) else {
|
let Some(parent_position) = self.position(&parent.to_node(), network_path) else {
|
||||||
@@ -5565,6 +5571,9 @@ impl NodeNetworkInterface {
|
|||||||
let _ = self.selected_nodes_mut(network_path).unwrap().replace_with(old_selected_nodes);
|
let _ = self.selected_nodes_mut(network_path).unwrap().replace_with(old_selected_nodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If true, this node should be inserted before the post node (toward root from the layer), and all outward wires from the pre node should be moved to its output.
|
||||||
|
let mut insert_node_after_post = false;
|
||||||
|
|
||||||
// Connect the layer to a parent layer/node at the top of the stack, or a non layer node midway down the stack
|
// Connect the layer to a parent layer/node at the top of the stack, or a non layer node midway down the stack
|
||||||
if !inserting_into_stack {
|
if !inserting_into_stack {
|
||||||
match post_node_input {
|
match post_node_input {
|
||||||
@@ -5586,7 +5595,7 @@ impl NodeNetworkInterface {
|
|||||||
let final_layer_position = IVec2::new(stack_top_position.x, after_move_post_layer_position.y + 3 + height_above_layer);
|
let final_layer_position = IVec2::new(stack_top_position.x, after_move_post_layer_position.y + 3 + height_above_layer);
|
||||||
let shift = final_layer_position - previous_layer_position;
|
let shift = final_layer_position - previous_layer_position;
|
||||||
self.shift_absolute_node_position(&layer.to_node(), shift, network_path);
|
self.shift_absolute_node_position(&layer.to_node(), shift, network_path);
|
||||||
self.insert_node_between(&layer.to_node(), &post_node, 0, network_path);
|
insert_node_after_post = true;
|
||||||
}
|
}
|
||||||
NodeInput::Import { .. } => {
|
NodeInput::Import { .. } => {
|
||||||
log::error!("Cannot move post node to parent which connects to the imports")
|
log::error!("Cannot move post node to parent which connects to the imports")
|
||||||
@@ -5605,13 +5614,37 @@ impl NodeNetworkInterface {
|
|||||||
let final_layer_position = after_move_post_layer_position + IVec2::new(0, 3 + height_above_layer);
|
let final_layer_position = after_move_post_layer_position + IVec2::new(0, 3 + height_above_layer);
|
||||||
let shift = final_layer_position - previous_layer_position;
|
let shift = final_layer_position - previous_layer_position;
|
||||||
self.shift_absolute_node_position(&layer.to_node(), shift, network_path);
|
self.shift_absolute_node_position(&layer.to_node(), shift, network_path);
|
||||||
self.insert_node_between(&layer.to_node(), &post_node, 0, network_path);
|
insert_node_after_post = true;
|
||||||
}
|
}
|
||||||
NodeInput::Import { .. } => {
|
NodeInput::Import { .. } => {
|
||||||
log::error!("Cannot move post node to parent which connects to the imports")
|
log::error!("Cannot move post node to parent which connects to the imports")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if insert_node_after_post {
|
||||||
|
self.insert_node_between(&layer.to_node(), &post_node, 0, network_path);
|
||||||
|
|
||||||
|
// Get the other wires which need to be moved to the output of the moved layer
|
||||||
|
let layer_input_connector = InputConnector::node(layer.to_node(), 0);
|
||||||
|
let other_outward_wires = self
|
||||||
|
.upstream_output_connector(&layer_input_connector, network_path)
|
||||||
|
.and_then(|pre_node_output| self.outward_wires(network_path).and_then(|wires| wires.get(&pre_node_output)))
|
||||||
|
.map(|other| {
|
||||||
|
other
|
||||||
|
.iter()
|
||||||
|
.filter(|other_input_connector| **other_input_connector != layer_input_connector)
|
||||||
|
.cloned()
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
})
|
||||||
|
.unwrap_or_default();
|
||||||
|
|
||||||
|
// Disconnect and reconnect
|
||||||
|
for other_outward_wire in &other_outward_wires {
|
||||||
|
self.disconnect_input(other_outward_wire, network_path);
|
||||||
|
self.create_wire(&OutputConnector::node(layer.to_node(), 0), other_outward_wire, network_path);
|
||||||
|
}
|
||||||
|
}
|
||||||
self.unload_upstream_node_click_targets(vec![layer.to_node()], network_path);
|
self.unload_upstream_node_click_targets(vec![layer.to_node()], network_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user