Skip to content

Commit c4cf477

Browse files
authored
Tidy up NodeNetworkInterface, replacing &[] root network arguments with methods for the document network (#2393)
* Replace `.selected_nodes(&[])` with `.selected_nodes_in_nested_network()` and `.selected_nodes()` * Replace `.network(&[])` with `.document_network()` and `.nested_network()` * Replace `.network_metadata(&[])` with `.document_network_metadata()`
1 parent 22a900b commit c4cf477

28 files changed

+224
-247
lines changed

editor/src/messages/dialog/dialog_message_handler.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,7 @@ impl MessageHandler<DialogMessage, DialogMessageData<'_>> for DialogMessageHandl
8585
.collect();
8686

8787
self.export_dialog.artboards = artboards;
88-
self.export_dialog.has_selection = document
89-
.network_interface
90-
.selected_nodes(&[])
91-
.is_some_and(|selected_nodes| selected_nodes.selected_layers(document.metadata()).next().is_some());
88+
self.export_dialog.has_selection = document.network_interface.selected_nodes().selected_layers(document.metadata()).next().is_some();
9289
self.export_dialog.send_dialog_to_frontend(responses);
9390
}
9491
}

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

Lines changed: 35 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
253253
};
254254

255255
let mut added_transaction = false;
256-
for layer in self.network_interface.selected_nodes(&[]).unwrap().selected_unlocked_layers(&self.network_interface) {
256+
for layer in self.network_interface.selected_nodes().selected_unlocked_layers(&self.network_interface) {
257257
let Some(bbox) = self.metadata().bounding_box_viewport(layer) else {
258258
continue;
259259
};
@@ -290,15 +290,15 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
290290
});
291291
}
292292
DocumentMessage::CreateEmptyFolder => {
293-
let selected_nodes = self.network_interface.selected_nodes(&[]).unwrap();
293+
let selected_nodes = self.network_interface.selected_nodes();
294294
let id = NodeId::new();
295295

296296
let parent = self
297297
.network_interface
298298
.deepest_common_ancestor(&selected_nodes, &self.selection_network_path, true)
299299
.unwrap_or(LayerNodeIdentifier::ROOT_PARENT);
300300

301-
let insert_index = DocumentMessageHandler::get_calculated_insert_index(self.metadata(), &self.network_interface.selected_nodes(&[]).unwrap(), parent);
301+
let insert_index = DocumentMessageHandler::get_calculated_insert_index(self.metadata(), &self.network_interface.selected_nodes(), parent);
302302
responses.add(DocumentMessage::AddTransaction);
303303
responses.add(GraphOperationMessage::NewCustomLayer {
304304
id,
@@ -440,7 +440,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
440440
let center = (max + min) / 2.;
441441
let bbox_trans = DAffine2::from_translation(-center);
442442
let mut added_transaction = false;
443-
for layer in self.network_interface.selected_nodes(&[]).unwrap().selected_unlocked_layers(&self.network_interface) {
443+
for layer in self.network_interface.selected_nodes().selected_unlocked_layers(&self.network_interface) {
444444
if !added_transaction {
445445
responses.add(DocumentMessage::AddTransaction);
446446
added_transaction = true;
@@ -463,7 +463,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
463463
let bbox_trans = DAffine2::from_translation(-center);
464464

465465
let mut added_transaction = false;
466-
for layer in self.network_interface.selected_nodes(&[]).unwrap().selected_unlocked_layers(&self.network_interface) {
466+
for layer in self.network_interface.selected_nodes().selected_unlocked_layers(&self.network_interface) {
467467
if !added_transaction {
468468
responses.add(DocumentMessage::AddTransaction);
469469
added_transaction = true;
@@ -528,14 +528,14 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
528528
.children(self.metadata())
529529
.filter(|x| self.network_interface.is_artboard(&x.to_node(), &self.selection_network_path))
530530
.collect::<Vec<_>>();
531-
let Some(selected_nodes) = self.network_interface.selected_nodes(&[]) else { return };
531+
let selected_nodes = self.network_interface.selected_nodes();
532532

533533
// Non-artboard (infinite canvas) workflow
534534
if artboards.is_empty() {
535535
let Some(parent) = self.network_interface.deepest_common_ancestor(&selected_nodes, &self.selection_network_path, false) else {
536536
return;
537537
};
538-
let Some(selected_nodes) = &self.network_interface.selected_nodes(&self.selection_network_path) else {
538+
let Some(selected_nodes) = &self.network_interface.selected_nodes_in_nested_network(&self.selection_network_path) else {
539539
return;
540540
};
541541
let insert_index = DocumentMessageHandler::get_calculated_insert_index(self.metadata(), selected_nodes, parent);
@@ -608,8 +608,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
608608
// Disallow trying to insert into self.
609609
if self
610610
.network_interface
611-
.selected_nodes(&[])
612-
.unwrap()
611+
.selected_nodes()
613612
.selected_layers(self.metadata())
614613
.any(|layer| parent.ancestors(self.metadata()).any(|ancestor| ancestor == layer))
615614
{
@@ -618,8 +617,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
618617
// Artboards can only have `ROOT_PARENT` as the parent.
619618
let any_artboards = self
620619
.network_interface
621-
.selected_nodes(&[])
622-
.unwrap()
620+
.selected_nodes()
623621
.selected_layers(self.metadata())
624622
.any(|layer| self.network_interface.is_artboard(&layer.to_node(), &self.selection_network_path));
625623
if any_artboards && parent != LayerNodeIdentifier::ROOT_PARENT {
@@ -629,8 +627,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
629627
// Non-artboards cannot be put at the top level if artboards also exist there
630628
let selected_any_non_artboards = self
631629
.network_interface
632-
.selected_nodes(&[])
633-
.unwrap()
630+
.selected_nodes()
634631
.selected_layers(self.metadata())
635632
.any(|layer| !self.network_interface.is_artboard(&layer.to_node(), &self.selection_network_path));
636633

@@ -719,9 +716,8 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
719716
let resize_opposite_corner = ipp.keyboard.key(resize_opposite_corner);
720717

721718
let can_move = |layer| {
722-
self.network_interface
723-
.selected_nodes(&[])
724-
.is_some_and(|selected| selected.layer_visible(layer, &self.network_interface) && !selected.layer_locked(layer, &self.network_interface))
719+
let selected = self.network_interface.selected_nodes();
720+
selected.layer_visible(layer, &self.network_interface) && !selected.layer_locked(layer, &self.network_interface)
725721
};
726722

727723
// Nudge translation without resizing
@@ -982,7 +978,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
982978
})
983979
}
984980
DocumentMessage::SelectParentLayer => {
985-
let selected_nodes = self.network_interface.selected_nodes(&[]).unwrap();
981+
let selected_nodes = self.network_interface.selected_nodes();
986982
let selected_layers = selected_nodes.selected_layers(self.metadata());
987983

988984
let mut parent_layers = HashSet::new();
@@ -1009,8 +1005,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
10091005
DocumentMessage::SelectAllLayers => {
10101006
let metadata = self.metadata();
10111007
let all_layers_except_artboards_invisible_and_locked = metadata.all_layers().filter(|&layer| !self.network_interface.is_artboard(&layer.to_node(), &[])).filter(|&layer| {
1012-
self.network_interface.selected_nodes(&[]).unwrap().layer_visible(layer, &self.network_interface)
1013-
&& !self.network_interface.selected_nodes(&[]).unwrap().layer_locked(layer, &self.network_interface)
1008+
self.network_interface.selected_nodes().layer_visible(layer, &self.network_interface) && !self.network_interface.selected_nodes().layer_locked(layer, &self.network_interface)
10141009
});
10151010
let nodes = all_layers_except_artboards_invisible_and_locked.map(|layer| layer.to_node()).collect();
10161011
responses.add(NodeGraphMessage::SelectedNodesSet { nodes });
@@ -1064,7 +1059,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
10641059
} else {
10651060
if ctrl {
10661061
// Toggle selection when holding ctrl
1067-
if self.network_interface.selected_nodes(&[]).unwrap().selected_layers_contains(layer, self.metadata()) {
1062+
if self.network_interface.selected_nodes().selected_layers_contains(layer, self.metadata()) {
10681063
responses.add_front(NodeGraphMessage::SelectedNodesRemove { nodes: vec![id] });
10691064
} else {
10701065
responses.add_front(NodeGraphMessage::SelectedNodesAdd { nodes: vec![id] });
@@ -1106,7 +1101,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
11061101
responses.add(NodeGraphMessage::UpdateInSelectedNetwork);
11071102
}
11081103
DocumentMessage::SetBlendModeForSelectedLayers { blend_mode } => {
1109-
for layer in self.network_interface.selected_nodes(&[]).unwrap().selected_layers_except_artboards(&self.network_interface) {
1104+
for layer in self.network_interface.selected_nodes().selected_layers_except_artboards(&self.network_interface) {
11101105
responses.add(GraphOperationMessage::BlendModeSet { layer, blend_mode });
11111106
}
11121107
}
@@ -1123,7 +1118,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
11231118
}
11241119
DocumentMessage::SetOpacityForSelectedLayers { opacity } => {
11251120
let opacity = opacity.clamp(0., 1.);
1126-
for layer in self.network_interface.selected_nodes(&[]).unwrap().selected_layers_except_artboards(&self.network_interface) {
1121+
for layer in self.network_interface.selected_nodes().selected_layers_except_artboards(&self.network_interface) {
11271122
responses.add(GraphOperationMessage::OpacitySet { layer, opacity });
11281123
}
11291124
}
@@ -1233,7 +1228,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
12331228
.into_iter()
12341229
.filter(|(node_id, _)|
12351230
// Ensure that the layer is in the document network to prevent logging an error
1236-
self.network_interface.network(&[]).unwrap().nodes.contains_key(node_id))
1231+
self.network_interface.document_network().nodes.contains_key(node_id))
12371232
.filter_map(|(node_id, click_targets)| {
12381233
self.network_interface.is_layer(&node_id, &[]).then(|| {
12391234
let layer = LayerNodeIdentifier::new(node_id, &self.network_interface, &[]);
@@ -1448,7 +1443,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
14481443
);
14491444

14501445
// Additional actions if there are any selected layers
1451-
if self.network_interface.selected_nodes(&[]).unwrap().selected_layers(self.metadata()).next().is_some() {
1446+
if self.network_interface.selected_nodes().selected_layers(self.metadata()).next().is_some() {
14521447
let mut select = actions!(DocumentMessageDiscriminant;
14531448
DeleteSelectedLayers,
14541449
DuplicateSelectedLayers,
@@ -1594,24 +1589,22 @@ impl DocumentMessageHandler {
15941589
/// Get the combined bounding box of the click targets of the selected visible layers in viewport space
15951590
pub fn selected_visible_layers_bounding_box_viewport(&self) -> Option<[DVec2; 2]> {
15961591
self.network_interface
1597-
.selected_nodes(&[])
1598-
.unwrap()
1592+
.selected_nodes()
15991593
.selected_visible_layers(&self.network_interface)
16001594
.filter_map(|layer| self.metadata().bounding_box_viewport(layer))
16011595
.reduce(graphene_core::renderer::Quad::combine_bounds)
16021596
}
16031597

16041598
pub fn selected_visible_and_unlock_layers_bounding_box_viewport(&self) -> Option<[DVec2; 2]> {
16051599
self.network_interface
1606-
.selected_nodes(&[])
1607-
.unwrap()
1600+
.selected_nodes()
16081601
.selected_visible_and_unlocked_layers(&self.network_interface)
16091602
.filter_map(|layer| self.metadata().bounding_box_viewport(layer))
16101603
.reduce(graphene_core::renderer::Quad::combine_bounds)
16111604
}
16121605

16131606
pub fn document_network(&self) -> &NodeNetwork {
1614-
self.network_interface.network(&[]).unwrap()
1607+
self.network_interface.document_network()
16151608
}
16161609

16171610
pub fn metadata(&self) -> &DocumentMetadata {
@@ -1778,7 +1771,7 @@ impl DocumentMessageHandler {
17781771
}
17791772

17801773
pub fn current_hash(&self) -> Option<u64> {
1781-
self.document_undo_history.iter().last().map(|network| network.network(&[]).unwrap().current_hash())
1774+
self.document_undo_history.iter().last().map(|network| network.document_network().current_hash())
17821775
}
17831776

17841777
pub fn is_auto_saved(&self) -> bool {
@@ -1827,7 +1820,7 @@ impl DocumentMessageHandler {
18271820

18281821
/// Finds the parent folder which, based on the current selections, should be the container of any newly added layers.
18291822
pub fn new_layer_parent(&self, include_self: bool) -> LayerNodeIdentifier {
1830-
let Some(selected_nodes) = self.network_interface.selected_nodes(&self.selection_network_path) else {
1823+
let Some(selected_nodes) = self.network_interface.selected_nodes_in_nested_network(&self.selection_network_path) else {
18311824
warn!("No selected nodes found in new_layer_parent. Defaulting to ROOT_PARENT.");
18321825
return LayerNodeIdentifier::ROOT_PARENT;
18331826
};
@@ -1875,13 +1868,15 @@ impl DocumentMessageHandler {
18751868
}),
18761869
GroupFolderType::BooleanOperation(operation) => {
18771870
// Get the ID of the one selected layer, if exactly one is selected
1878-
let only_selected_layer = network_interface.selected_nodes(&[]).and_then(|selected_nodes| {
1871+
let only_selected_layer = {
1872+
let selected_nodes = network_interface.selected_nodes();
18791873
let mut layers = selected_nodes.selected_layers(network_interface.document_metadata());
1874+
18801875
match (layers.next(), layers.next()) {
18811876
(Some(id), None) => Some(id),
18821877
_ => None,
18831878
}
1884-
});
1879+
};
18851880

18861881
// If there is a single selected layer, check if there is a boolean operation upstream from it
18871882
let upstream_boolean_op = only_selected_layer.and_then(|selected_id| {
@@ -2141,7 +2136,7 @@ impl DocumentMessageHandler {
21412136

21422137
pub fn update_layers_panel_control_bar_widgets(&self, responses: &mut VecDeque<Message>) {
21432138
// Get an iterator over the selected layers (excluding artboards which don't have an opacity or blend mode).
2144-
let selected_nodes = self.network_interface.selected_nodes(&[]).unwrap();
2139+
let selected_nodes = self.network_interface.selected_nodes();
21452140
let selected_layers_except_artboards = selected_nodes.selected_layers_except_artboards(&self.network_interface);
21462141

21472142
// Look up the current opacity and blend mode of the selected layers (if any), and split the iterator into the first tuple and the rest.
@@ -2193,17 +2188,15 @@ impl DocumentMessageHandler {
21932188
})
21942189
.collect();
21952190

2196-
let has_selection = self.network_interface.selected_nodes(&[]).unwrap().selected_layers(self.metadata()).next().is_some();
2191+
let has_selection = self.network_interface.selected_nodes().selected_layers(self.metadata()).next().is_some();
21972192
let selection_all_visible = self
21982193
.network_interface
2199-
.selected_nodes(&[])
2200-
.unwrap()
2194+
.selected_nodes()
22012195
.selected_layers(self.metadata())
22022196
.all(|layer| self.network_interface.is_visible(&layer.to_node(), &[]));
22032197
let selection_all_locked = self
22042198
.network_interface
2205-
.selected_nodes(&[])
2206-
.unwrap()
2199+
.selected_nodes()
22072200
.selected_layers(self.metadata())
22082201
.all(|layer| self.network_interface.is_locked(&layer.to_node(), &[]));
22092202

@@ -2284,7 +2277,7 @@ impl DocumentMessageHandler {
22842277
}
22852278

22862279
pub fn selected_layers_reverse(&mut self, responses: &mut VecDeque<Message>) {
2287-
let selected_layers = self.network_interface.selected_nodes(&[]).unwrap();
2280+
let selected_layers = self.network_interface.selected_nodes();
22882281
let metadata = self.metadata();
22892282
let selected_layer_set = selected_layers.selected_layers(metadata).collect::<HashSet<_>>();
22902283

@@ -2376,7 +2369,7 @@ impl DocumentMessageHandler {
23762369
}
23772370

23782371
pub fn selected_layers_reorder(&mut self, relative_index_offset: isize, responses: &mut VecDeque<Message>) {
2379-
let selected_nodes = self.network_interface.selected_nodes(&[]).unwrap();
2372+
let selected_nodes = self.network_interface.selected_nodes();
23802373
let mut selected_layers = selected_nodes.selected_layers(self.metadata());
23812374

23822375
let first_or_last_selected_layer = match relative_index_offset.signum() {
@@ -2506,7 +2499,7 @@ impl<'a> ClickXRayIter<'a> {
25062499

25072500
/// Handles the checking of the layer to find if it has been clicked
25082501
fn check_layer(&mut self, layer: LayerNodeIdentifier) -> XRayResult {
2509-
let selected_layers = self.network_interface.selected_nodes(&[]).unwrap();
2502+
let selected_layers = self.network_interface.selected_nodes();
25102503
// Discard invisible and locked layers
25112504
if !selected_layers.layer_visible(layer, self.network_interface) || selected_layers.layer_locked(layer, self.network_interface) {
25122505
return XRayResult { clicked: false, use_children: false };

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ impl MessageHandler<GraphOperationMessage, GraphOperationMessageData<'_>> for Gr
116116
network_interface.move_layer_to_stack(artboard_layer, LayerNodeIdentifier::ROOT_PARENT, 0, &[]);
117117

118118
// If there is a non artboard feeding into the primary input of the artboard, move it to the secondary input
119-
let Some(artboard) = network_interface.network(&[]).and_then(|network| network.nodes.get(&id)) else {
119+
let Some(artboard) = network_interface.document_network().nodes.get(&id) else {
120120
log::error!("Artboard not created");
121121
return;
122122
};
@@ -218,7 +218,7 @@ impl MessageHandler<GraphOperationMessage, GraphOperationMessageData<'_>> for Gr
218218
// Go through all artboards and create merge nodes
219219
for artboard in network_interface.all_artboards() {
220220
let node_id = NodeId::new();
221-
let Some(document_node) = network_interface.network(&[]).and_then(|network| network.nodes.get(&artboard.to_node())) else {
221+
let Some(document_node) = network_interface.document_network().nodes.get(&artboard.to_node()) else {
222222
log::error!("Artboard not created");
223223
responses.add(DocumentMessage::AbortTransaction);
224224
return;

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

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -229,11 +229,7 @@ impl<'a> ModifyInputsContext<'a> {
229229

230230
fn get_output_layer(&self) -> Option<LayerNodeIdentifier> {
231231
self.layer_node.or_else(|| {
232-
let Some(network) = self.network_interface.network(&[]) else {
233-
log::error!("Document network does not exist in ModifyInputsContext::get_output_node");
234-
return None;
235-
};
236-
let export_node = network.exports.first().and_then(|export| export.as_node())?;
232+
let export_node = self.network_interface.document_network().exports.first().and_then(|export| export.as_node())?;
237233
if self.network_interface.is_layer(&export_node, &[]) {
238234
Some(LayerNodeIdentifier::new(export_node, self.network_interface, &[]))
239235
} else {
@@ -266,7 +262,7 @@ impl<'a> ModifyInputsContext<'a> {
266262
}
267263

268264
let is_traversal_start = |node_id: NodeId| {
269-
self.layer_node.map(|layer| layer.to_node()) == Some(node_id) || self.network_interface.network(&[]).unwrap().exports.iter().any(|export| export.as_node() == Some(node_id))
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))
270266
};
271267

272268
if !is_traversal_start(upstream_node) && (self.network_interface.is_layer(&upstream_node, &[])) {
@@ -373,7 +369,7 @@ impl<'a> ModifyInputsContext<'a> {
373369
let (layer_transform, transform_node_id) = self
374370
.existing_node_id("Transform", false)
375371
.and_then(|transform_node_id| {
376-
let document_node = self.network_interface.network(&[])?.nodes.get(&transform_node_id)?;
372+
let document_node = self.network_interface.document_network().nodes.get(&transform_node_id)?;
377373
Some((transform_utils::get_current_transform(&document_node.inputs), transform_node_id))
378374
})
379375
.unzip();

0 commit comments

Comments
 (0)