Skip to content

Commit 64e2751

Browse files
committed
Improve transforms
1 parent 8684636 commit 64e2751

File tree

2 files changed

+34
-26
lines changed

2 files changed

+34
-26
lines changed

editor/src/messages/portfolio/document/graph_operation/utility_types.rs

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -244,38 +244,38 @@ impl<'a> ModifyInputsContext<'a> {
244244
// Start from the layer node or export
245245
let output_layer = self.get_output_layer()?;
246246

247-
let upstream = self
248-
.network_interface
249-
.upstream_flow_back_from_nodes(vec![output_layer.to_node()], &[], network_interface::FlowType::HorizontalFlow);
247+
let existing_node_id = Self::locate_existing_id(output_layer, self.network_interface, reference);
250248

251-
// Take until another layer node is found (but not the first layer node)
252-
let mut existing_node_id = None;
253-
for upstream_node in upstream.collect::<Vec<_>>() {
249+
// Create a new node if the node does not exist and update its inputs
250+
if create_if_nonexistent {
251+
return existing_node_id.or_else(|| self.create_node(reference));
252+
}
253+
254+
existing_node_id
255+
}
256+
257+
/// Gets the node id of a node with a specific reference that is upstream from the layer node.
258+
pub fn locate_existing_id(output_layer: LayerNodeIdentifier, network_interface: &NodeNetworkInterface, reference: &str) -> Option<NodeId> {
259+
let upstream = network_interface.upstream_flow_back_from_nodes(vec![output_layer.to_node()], &[], network_interface::FlowType::HorizontalFlow);
260+
261+
// Look at all of the upstream nodes
262+
for upstream_node in upstream {
254263
// Check if this is the node we have been searching for.
255-
if self
256-
.network_interface
264+
if network_interface
257265
.reference(&upstream_node, &[])
258266
.is_some_and(|node_reference| *node_reference == Some(reference.to_string()))
259267
{
260-
existing_node_id = Some(upstream_node);
261-
break;
268+
return Some(upstream_node);
262269
}
263270

264-
let is_traversal_start = |node_id: NodeId| {
265-
self.layer_node.map(|layer| layer.to_node()) == Some(node_id) || self.network_interface.document_network().exports.iter().any(|export| export.as_node() == Some(node_id))
266-
};
271+
let is_traversal_start = |node_id: NodeId| output_layer.to_node() == node_id || network_interface.document_network().exports.iter().any(|export| export.as_node() == Some(node_id));
267272

268-
if !is_traversal_start(upstream_node) && (self.network_interface.is_layer(&upstream_node, &[])) {
269-
break;
273+
// Take until another layer node is found (but not the first layer node)
274+
if !is_traversal_start(upstream_node) && (network_interface.is_layer(&upstream_node, &[])) {
275+
return None;
270276
}
271277
}
272-
273-
// Create a new node if the node does not exist and update its inputs
274-
if create_if_nonexistent {
275-
return existing_node_id.or_else(|| self.create_node(reference));
276-
}
277-
278-
existing_node_id
278+
None
279279
}
280280

281281
/// Create a new node inside the layer

editor/src/messages/portfolio/document/utility_types/transformation.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use super::network_interface::NodeNetworkInterface;
22
use crate::consts::{ROTATE_INCREMENT, SCALE_INCREMENT};
3-
use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn;
3+
use crate::messages::portfolio::document::graph_operation::transform_utils;
4+
use crate::messages::portfolio::document::graph_operation::utility_types::{ModifyInputsContext, TransformIn};
45
use crate::messages::portfolio::document::utility_types::document_metadata::{DocumentMetadata, LayerNodeIdentifier};
56
use crate::messages::prelude::*;
67
use crate::messages::tool::common_functionality::graph_modification_utils;
@@ -54,17 +55,24 @@ impl OriginalTransforms {
5455
}
5556
}
5657

57-
pub fn update<'a>(&mut self, selected: &'a [LayerNodeIdentifier], network_interface: &NodeNetworkInterface, shape_editor: Option<&'a ShapeState>) {
58-
let document_metadata = network_interface.document_metadata();
58+
/// Gets the transform from the most downstream transform node
59+
fn get_layer_transform(layer: LayerNodeIdentifier, network_interface: &NodeNetworkInterface) -> Option<DAffine2> {
60+
let transform_node_id = ModifyInputsContext::locate_existing_id(layer, network_interface, "Transform")?;
61+
62+
let document_node = network_interface.document_network().nodes.get(&transform_node_id)?;
63+
Some(transform_utils::get_current_transform(&document_node.inputs))
64+
}
5965

66+
pub fn update<'a>(&mut self, selected: &'a [LayerNodeIdentifier], network_interface: &NodeNetworkInterface, shape_editor: Option<&'a ShapeState>) {
6067
match self {
6168
OriginalTransforms::Layer(layer_map) => {
6269
layer_map.retain(|layer, _| selected.contains(layer));
6370
for &layer in selected {
6471
if layer == LayerNodeIdentifier::ROOT_PARENT {
6572
continue;
6673
}
67-
layer_map.entry(layer).or_insert_with(|| document_metadata.upstream_transform(layer.to_node()));
74+
75+
layer_map.entry(layer).or_insert_with(|| Self::get_layer_transform(layer, network_interface).unwrap_or_default());
6876
}
6977
}
7078
OriginalTransforms::Path(path_map) => {

0 commit comments

Comments
 (0)