Skip to content

Commit e806f17

Browse files
committed
Fix grouped layers
1 parent 507f22a commit e806f17

File tree

9 files changed

+144
-74
lines changed

9 files changed

+144
-74
lines changed

editor/src/messages/portfolio/document/document_message_handler.rs

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1044,7 +1044,6 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
10441044
self.network_interface.update_transforms(upstream_transforms);
10451045
}
10461046
DocumentMessage::UpdateClickTargets { click_targets } => {
1047-
// TODO: Allow non layer nodes to have click targets
10481047
let layer_click_targets = click_targets
10491048
.into_iter()
10501049
.filter_map(|(node_id, click_targets)| {
@@ -1057,6 +1056,40 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
10571056
})
10581057
.collect();
10591058
self.network_interface.update_click_targets(layer_click_targets);
1059+
1060+
// TODO: Allow non layer nodes to have click targets
1061+
// let layer_click_targets = click_targets
1062+
// .into_iter()
1063+
// .filter_map(|(node_id, click_targets)| {
1064+
// if self.network_interface.is_layer(&node_id, &[]) {
1065+
// let layer = LayerNodeIdentifier::new(node_id, &self.network_interface, &[]);
1066+
// Some((layer, click_targets))
1067+
// } else {
1068+
// None
1069+
// }
1070+
// })
1071+
// .collect::<HashMap<_, _>>();
1072+
// log::debug!("layer_click_targets: {:?}", layer_click_targets);
1073+
// self.network_interface.load_structure();
1074+
// // Store all click targets upstream for each layer
1075+
// let mut upstream_click_targets = HashMap::new();
1076+
// for layer in self.metadata().all_layers() {
1077+
// log::debug!("layer: {:?}", layer);
1078+
// let mut layer_upstream_click_targets = layer_click_targets.get(&layer).cloned().unwrap_or_default();
1079+
// if !self.network_interface.is_artboard(&layer.to_node(), &[]) {
1080+
// for upstream_layer in layer.descendants(self.metadata()) {
1081+
// if let Some(upstream_layer_click_targets) = layer_click_targets.get(&upstream_layer).cloned() {
1082+
// layer_upstream_click_targets.extend(upstream_layer_click_targets);
1083+
// }
1084+
// }
1085+
// }
1086+
// log::debug!("layer_upstream_click_targets: {:?}", layer_upstream_click_targets);
1087+
// if !layer_upstream_click_targets.is_empty() {
1088+
// upstream_click_targets.insert(layer, layer_upstream_click_targets);
1089+
// }
1090+
// }
1091+
// log::debug!("upstream_click_targets: {:?}", upstream_click_targets);
1092+
// self.network_interface.update_click_targets(upstream_click_targets);
10601093
}
10611094
DocumentMessage::UpdateVectorModify { vector_modify } => {
10621095
self.network_interface.update_vector_modify(vector_modify);
@@ -1249,7 +1282,7 @@ impl DocumentMessageHandler {
12491282
.filter(|&layer| self.network_interface.selected_nodes(&[]).unwrap().layer_visible(layer, &self.network_interface))
12501283
.filter(|&layer| !self.network_interface.selected_nodes(&[]).unwrap().layer_locked(layer, &self.network_interface))
12511284
.filter(|&layer| !self.network_interface.is_artboard(&layer.to_node(), &[]))
1252-
.filter_map(|layer| self.metadata().click_target(layer).map(|targets| (layer, targets)))
1285+
.filter_map(|layer| self.metadata().click_targets(layer).map(|targets| (layer, targets)))
12531286
.filter(move |(layer, target)| {
12541287
target
12551288
.iter()
@@ -1266,7 +1299,7 @@ impl DocumentMessageHandler {
12661299
.all_layers()
12671300
.filter(|&layer| self.network_interface.selected_nodes(&[]).unwrap().layer_visible(layer, &self.network_interface))
12681301
.filter(|&layer| !self.network_interface.selected_nodes(&[]).unwrap().layer_locked(layer, &self.network_interface))
1269-
.filter_map(|layer| self.metadata().click_target(layer).map(|targets| (layer, targets)))
1302+
.filter_map(|layer| self.metadata().click_targets(layer).map(|targets| (layer, targets)))
12701303
.filter(move |(layer, target)| target.iter().any(|target| target.intersect_point(point, self.metadata().transform_to_document(*layer))))
12711304
.map(|(layer, _)| layer)
12721305
}

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

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ pub struct DocumentMetadata {
2525
pub structure: HashMap<LayerNodeIdentifier, NodeRelations>,
2626
pub click_targets: HashMap<LayerNodeIdentifier, Vec<ClickTarget>>,
2727
pub vector_modify: HashMap<NodeId, VectorData>,
28-
// TODO: Remove and derive from document_ptz in document message handler
2928
/// Transform from document space to viewport space.
3029
pub document_to_viewport: DAffine2,
3130
}
@@ -55,10 +54,28 @@ impl DocumentMetadata {
5554
self.structure.contains_key(&layer)
5655
}
5756

58-
pub fn click_target(&self, layer: LayerNodeIdentifier) -> Option<&Vec<ClickTarget>> {
57+
pub fn click_targets(&self, layer: LayerNodeIdentifier) -> Option<&Vec<ClickTarget>> {
5958
self.click_targets.get(&layer)
6059
}
6160

61+
// pub fn click_targets(&self, layer: LayerNodeIdentifier) -> Option<Vec<ClickTarget>> {
62+
// self.click_targets_with_transform(layer, DAffine2::IDENTITY)
63+
// }
64+
65+
// fn click_targets_with_transform(&self, layer: LayerNodeIdentifier, transform: DAffine2) -> Option<Vec<ClickTarget>> {
66+
// let mut click_targets = self.click_targets.get(&layer).cloned()?;
67+
68+
// click_targets.iter_mut().for_each(|click_target| click_target.apply_transform(transform));
69+
70+
// for child in layer.children(self) {
71+
// let child_transform = self.upstream_transform(child.to_node());
72+
// let child_click_targets = self.click_targets_with_transform(child, transform * child_transform);
73+
// if let Some(child_click_targets) = child_click_targets {
74+
// click_targets.extend(child_click_targets);
75+
// }
76+
// }
77+
// Some(click_targets)
78+
// }
6279
// TODO: Move into network interface so that it does not have to be passed as an argument
6380
/// Get vector data after the modification is applied
6481
pub fn compute_modified_vector(&self, layer: LayerNodeIdentifier, network_interface: &NodeNetworkInterface) -> Option<VectorData> {
@@ -71,8 +88,7 @@ impl DocumentMetadata {
7188
}
7289
return Some(modified);
7390
}
74-
self.click_targets
75-
.get(&layer)
91+
self.click_targets(layer)
7692
.map(|click| click.iter().map(ClickTarget::subpath))
7793
.map(|subpaths| VectorData::from_subpaths(subpaths, true))
7894
}
@@ -128,8 +144,7 @@ impl DocumentMetadata {
128144
impl DocumentMetadata {
129145
/// Get the bounding box of the click target of the specified layer in the specified transform space
130146
pub fn bounding_box_with_transform(&self, layer: LayerNodeIdentifier, transform: DAffine2) -> Option<[DVec2; 2]> {
131-
self.click_targets
132-
.get(&layer)?
147+
self.click_targets(layer)?
133148
.iter()
134149
.filter_map(|click_target| click_target.subpath().bounding_box_with_transform(transform))
135150
.reduce(Quad::combine_bounds)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2232,7 +2232,7 @@ impl NodeNetworkInterface {
22322232
log::error!("Could not get nested node_metadata in position_from_downstream_node");
22332233
return None;
22342234
};
2235-
match &node_metadata.persistent_metadata.node_type_metadata.clone() {
2235+
match &node_metadata.persistent_metadata.node_type_metadata {
22362236
NodeTypePersistentMetadata::Layer(layer_metadata) => {
22372237
match layer_metadata.position {
22382238
LayerPosition::Absolute(position) => Some(position),

editor/src/messages/tool/tool_messages/select_tool.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,9 @@ impl Fsm for SelectToolFsmState {
445445
.unwrap()
446446
.selected_visible_and_unlocked_layers(&document.network_interface)
447447
.filter(|layer| !document.network_interface.is_artboard(&layer.to_node(), &[]))
448+
// .flat_map(|layer| layer.descendants(document.metadata()).chain(std::iter::once(layer)))
449+
// .collect::<HashSet<_>>()
450+
// .iter()
448451
.filter_map(|layer| {
449452
document
450453
.metadata()
@@ -696,7 +699,7 @@ impl Fsm for SelectToolFsmState {
696699
let axis_align = input.keyboard.key(modifier_keys.axis_align);
697700

698701
// Ignore the non duplicated layers if the current layers have not spawned yet.
699-
let layers_exist = tool_data.layers_dragging.iter().all(|&layer| document.metadata().click_target(layer).is_some());
702+
let layers_exist = tool_data.layers_dragging.iter().all(|&layer| document.metadata().click_targets(layer).is_some());
700703
let ignore = tool_data.non_duplicated_layers.as_ref().filter(|_| !layers_exist).unwrap_or(&tool_data.layers_dragging);
701704

702705
let snap_data = SnapData::ignore(document, input, ignore);

editor/src/node_graph_executor.rs

Lines changed: 5 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use crate::consts::FILE_SAVE_SUFFIX;
22
use crate::messages::frontend::utility_types::{ExportBounds, FileType};
33
use crate::messages::portfolio::document::node_graph::document_node_definitions::wrap_network_in_scope;
4-
use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier;
54
use crate::messages::prelude::*;
65

76
use graph_craft::concrete;
@@ -12,23 +11,19 @@ use graph_craft::proto::GraphErrors;
1211
use graph_craft::wasm_application_io::EditorPreferences;
1312
use graphene_core::application_io::{NodeGraphUpdateMessage, NodeGraphUpdateSender, RenderConfig};
1413
use graphene_core::memo::IORecord;
15-
use graphene_core::raster::ImageFrame;
16-
use graphene_core::renderer::{ClickTarget, GraphicElementRendered, ImageRenderMode, RenderParams, SvgRender};
14+
use graphene_core::renderer::{GraphicElementRendered, ImageRenderMode, RenderParams, SvgRender};
1715
use graphene_core::renderer::{RenderSvgSegmentList, SvgSegment};
1816
use graphene_core::text::FontCache;
19-
use graphene_core::transform::{Footprint, Transform};
17+
use graphene_core::transform::Footprint;
2018
use graphene_core::vector::style::ViewMode;
21-
use graphene_core::vector::VectorData;
22-
use graphene_core::{Color, GraphicElement, SurfaceFrame};
19+
use graphene_core::SurfaceFrame;
2320
use graphene_std::renderer::format_transform_matrix;
2421
use graphene_std::wasm_application_io::{WasmApplicationIo, WasmEditorApi};
2522
use interpreted_executor::dynamic_executor::{DynamicExecutor, IntrospectError, ResolvedDocumentNodeTypesDelta};
2623

27-
use core::hash;
2824
use glam::{DAffine2, DVec2, UVec2};
2925
use once_cell::sync::Lazy;
3026
use spin::Mutex;
31-
use std::hash::Hash;
3227
use std::sync::mpsc::{Receiver, Sender};
3328
use std::sync::Arc;
3429

@@ -50,10 +45,6 @@ pub struct NodeRuntime {
5045
// TODO: Remove, it doesn't need to be persisted anymore
5146
/// The current renders of the thumbnails for layer nodes.
5247
thumbnail_renders: HashMap<NodeId, Vec<SvgSegment>>,
53-
/// The current click targets for layer nodes.
54-
click_targets: HashMap<NodeId, Vec<ClickTarget>>,
55-
/// Vector data in Path nodes.
56-
vector_modify: HashMap<NodeId, VectorData>,
5748
}
5849

5950
/// Messages passed from the editor thread to the node runtime thread.
@@ -83,8 +74,6 @@ pub struct ExecutionResponse {
8374
execution_id: u64,
8475
result: Result<TaggedValue, String>,
8576
responses: VecDeque<FrontendMessage>,
86-
new_click_targets: HashMap<LayerNodeIdentifier, Vec<ClickTarget>>,
87-
new_vector_modify: HashMap<NodeId, VectorData>,
8877
transform: DAffine2,
8978
}
9079

@@ -143,8 +132,6 @@ impl NodeRuntime {
143132
monitor_nodes: Vec::new(),
144133

145134
thumbnail_renders: Default::default(),
146-
click_targets: HashMap::new(),
147-
vector_modify: HashMap::new(),
148135
}
149136
}
150137

@@ -224,8 +211,6 @@ impl NodeRuntime {
224211
execution_id,
225212
result,
226213
responses,
227-
new_click_targets: self.click_targets.clone().into_iter().map(|(id, targets)| (LayerNodeIdentifier::new_unchecked(id), targets)).collect(),
228-
new_vector_modify: self.vector_modify.clone(),
229214
transform,
230215
});
231216
}
@@ -297,37 +282,17 @@ impl NodeRuntime {
297282
};
298283

299284
if let Some(io) = introspected_data.downcast_ref::<IORecord<Footprint, graphene_core::GraphicElement>>() {
300-
Self::process_graphic_element(&mut self.thumbnail_renders, &mut self.click_targets, parent_network_node_id, &io.output, responses, update_thumbnails)
285+
Self::process_graphic_element(&mut self.thumbnail_renders, parent_network_node_id, &io.output, responses, update_thumbnails)
301286
} else if let Some(io) = introspected_data.downcast_ref::<IORecord<Footprint, graphene_core::Artboard>>() {
302-
Self::process_graphic_element(&mut self.thumbnail_renders, &mut self.click_targets, parent_network_node_id, &io.output, responses, update_thumbnails)
303-
} else if let Some(record) = introspected_data.downcast_ref::<IORecord<Footprint, VectorData>>() {
304-
// Insert the vector modify if we are dealing with vector data
305-
self.vector_modify.insert(parent_network_node_id, record.output.clone());
287+
Self::process_graphic_element(&mut self.thumbnail_renders, parent_network_node_id, &io.output, responses, update_thumbnails)
306288
}
307-
308-
// If this is `VectorData`, `ImageFrame`, or `GraphicElement` data:
309-
// Update the stored upstream transforms for this layer/node.
310-
// if let Some(transform) = {
311-
// fn try_downcast<T: Transform + 'static>(value: &dyn std::any::Any) -> Option<(Footprint, DAffine2)> {
312-
// let io_data = value.downcast_ref::<IORecord<Footprint, T>>()?;
313-
// let transform = io_data.output.transform();
314-
// Some((io_data.input, transform))
315-
// }
316-
// None.or_else(|| try_downcast::<VectorData>(introspected_data.as_ref()))
317-
// .or_else(|| try_downcast::<ImageFrame<Color>>(introspected_data.as_ref()))
318-
// .or_else(|| try_downcast::<GraphicElement>(introspected_data.as_ref()))
319-
// .or_else(|| try_downcast::<graphene_core::Artboard>(introspected_data.as_ref()))
320-
// } {
321-
// self.upstream_transforms.insert(parent_network_node_id, transform);
322-
// }
323289
}
324290
}
325291

326292
// If this is `GraphicElement` data:
327293
// Regenerate click targets and thumbnails for the layers in the graph, modifying the state and updating the UI.
328294
fn process_graphic_element(
329295
thumbnail_renders: &mut HashMap<NodeId, Vec<SvgSegment>>,
330-
click_targets: &mut HashMap<NodeId, Vec<ClickTarget>>,
331296
parent_network_node_id: NodeId,
332297
graphic_element: &impl GraphicElementRendered,
333298
responses: &mut VecDeque<FrontendMessage>,
@@ -569,9 +534,7 @@ impl NodeGraphExecutor {
569534
let ExecutionResponse {
570535
execution_id,
571536
result,
572-
new_click_targets,
573537
responses: existing_responses,
574-
new_vector_modify,
575538
transform,
576539
} = execution_response;
577540

0 commit comments

Comments
 (0)