Skip to content

Generalize layers as merge nodes to enable adjustment layers #1712

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 47 commits into from
May 1, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
58dd67a
WIP, backward traversal issues
adamgerhant Mar 29, 2024
7cbff5d
Fix some tool issues
0HyperCube Mar 29, 2024
54f0b0d
Remove debugging
Keavon Mar 29, 2024
51c61ba
Change some indices
0HyperCube Mar 29, 2024
c290cbd
WIP: new artboard node
adamgerhant Mar 30, 2024
e1498f8
WIP: add artboard node
adamgerhant Mar 30, 2024
077a1ba
WIP: Artboard node and create_artboard
adamgerhant Apr 3, 2024
769f3f4
WIP: Artboard node implementation complete
adamgerhant Apr 3, 2024
7be8bcb
WIP: Artboards input for output node
adamgerhant Apr 4, 2024
6901f49
Complete Artboard node
adamgerhant Apr 4, 2024
367199e
Generalize LayerNodeIdentifier, monitor_nodes support for Artboard n…
adamgerhant Apr 8, 2024
7a649cc
Fix misaligned artboard click targets
Keavon Apr 8, 2024
c189af3
Generalize/clarify create_layer and insert_between
adamgerhant Apr 9, 2024
e9992a4
non-negative dimensions for resize_artboard
adamgerhant Apr 9, 2024
9589d7f
Show artboards in layer panel
adamgerhant Apr 11, 2024
221440f
Generalize create_layer for layer output node
adamgerhant Apr 13, 2024
36df33b
Generalize delete_layer/delete_artboard to NodeGraphMessage::DeleteNo…
adamgerhant Apr 17, 2024
431f20f
remove old primary_input function
adamgerhant Apr 18, 2024
abbda86
Vertical node visuals, remove is_layer function, rename Layer node to…
adamgerhant Apr 19, 2024
b150486
Fix demo artwork
adamgerhant Apr 20, 2024
f85bd44
Layer display context menu
adamgerhant Apr 20, 2024
89cff28
Automatically select artboard, fix warnings
adamgerhant Apr 21, 2024
da66f57
Improvements to context menu and layer invariant enforcement
adamgerhant Apr 22, 2024
4b7cac7
Remove display_as_layer and update load_structure
adamgerhant Apr 25, 2024
cc0bb44
Improve load_structure to show more layers, improve FlowIter, improve…
adamgerhant Apr 25, 2024
a66e61a
Clean up demo artwork using generalized layers
Keavon Apr 26, 2024
9471ea0
Improve design of Layers panel and graph nodes
Keavon Apr 26, 2024
ab366cf
MoveSelectedLayersTo rewrite to support generalized layer nodes
adamgerhant Apr 27, 2024
6ca4a5d
Include artboards in deepest_common_ancestor, fix resize_artboard/del…
adamgerhant Apr 27, 2024
8a04bc8
MoveSelectedLayersTo adjustments
adamgerhant Apr 27, 2024
43ae283
Sync non layer node visibility with metadata
adamgerhant Apr 27, 2024
a6a35aa
Include non layer nodes when moving/creating layer
adamgerhant Apr 27, 2024
6c9d68b
Fix group layers and get_post_node_with_index
adamgerhant Apr 28, 2024
52546ee
Include non layer nodes in UngroupSelectedLayers
adamgerhant Apr 28, 2024
c2395ef
GroupSelected for all selected nodes, UnGroupSelected position adjust…
adamgerhant Apr 29, 2024
76ec270
Add grouping for layers in different folders
adamgerhant Apr 29, 2024
d96db73
Fix hidden layers
adamgerhant Apr 29, 2024
18449a6
Prevent node from connecting to itself, fix undo automatic node inser…
adamgerhant Apr 30, 2024
ebd3f33
Fix undo CreateEmptyFolder, fix grouping nested layer nodes
adamgerhant Apr 30, 2024
5409e27
Formatting
Keavon Apr 30, 2024
650f6ea
Merge branch 'master' into adjustment-layers
Keavon Apr 30, 2024
531136b
Remove test and check if node is layer from network
adamgerhant Apr 30, 2024
e7ee147
Fix undo group layers
adamgerhant Apr 30, 2024
febb8d0
Check off roadmap
Keavon May 1, 2024
f650566
MoveUpstreamSiblingsToChild adjustments
adamgerhant May 1, 2024
fa2cb39
Replace tabs with spaces, remove mut from argument
adamgerhant May 1, 2024
ceb3fde
Final code review pass
Keavon May 1, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Formatting
  • Loading branch information
Keavon committed Apr 30, 2024
commit 5409e27beb6896938946cf7855b5db2cb6e84dc9
26 changes: 13 additions & 13 deletions editor/src/messages/portfolio/document/document_message_handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -365,14 +365,14 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
return;
}

//Move layers in nested unselected folders above the first unselected parent folder
// Move layers in nested unselected folders above the first unselected parent folder
let selected_layers = self.selected_nodes.selected_layers(self.metadata()).collect::<Vec<_>>();
for layer in selected_layers.clone() {
let mut first_unselected_parent_folder = layer.parent(&self.metadata).expect("Layer should always have parent");

//Find folder in parent child stack
// Find folder in parent child stack
loop {
//Loop until parent layer is deselected. Note that parent cannot be selected, since it is an ancestor of all selected layers
// Loop until parent layer is deselected. Note that parent cannot be selected, since it is an ancestor of all selected layers
if !selected_layers.iter().any(|selected_layer| *selected_layer == first_unselected_parent_folder) {
break;
}
Expand All @@ -382,15 +382,15 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
};
first_unselected_parent_folder = new_folder;
}
//Dont move nodes above new group folder parent
// Don't move nodes above new group folder parent
if first_unselected_parent_folder == parent {
continue;
}

//Disconnect above and below the old layer location
// Disconnect above and below the old layer location
self.disconnect_node(layer, responses);

//Move disconnected node to folder
// Move disconnected node to folder
let folder_position = self
.network
.nodes
Expand All @@ -405,7 +405,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
layer_to_move_node_mut.metadata.position = folder_position;

// Insert node right above the folder
//TODO: Use insert layer between message
// TODO: Use insert layer between message
let Some((folder_downstream_node_id, folder_downstream_input_index)) = DocumentMessageHandler::get_downstream_node(&self.network, &self.metadata, first_unselected_parent_folder)
else {
log::error!("Downstream node should always exist when inserting layer");
Expand All @@ -422,7 +422,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
};
*node_id = layer.to_node();

//Connect layer primary input to parent folder
// Connect layer primary input to parent folder
let Some(layer_node_input) = self.network.nodes.get_mut(&layer.to_node()).and_then(|node| node.inputs.get_mut(0)) else {
log::error!("Layer should always have primary input");
return;
Expand Down Expand Up @@ -478,7 +478,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
.any(|selected_node_id| selected_node_id.to_node() == *current_stack_node_id_ref)
{
nodes_to_move.push(*current_stack_node_id_ref);
//Push all non layer sibling nodes directly upstream of the selected layer
// Push all non layer sibling nodes directly upstream of the selected layer
loop {
if let Some(NodeInput::Node { node_id, .. }) = current_stack_node.inputs.get(0) {
let next_node = self.network.nodes.get(node_id).expect("Stack node id should always be a node");
Expand Down Expand Up @@ -598,7 +598,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
modify_inputs.shift_upstream(layer_to_move.to_node(), offset_to_post_node, true);

// Update post_node input to layer_to_move
//TODO: Use insert layer between message
// TODO: Use insert layer between message
let post_node_mut = self.network.nodes.get_mut(&post_node_id).expect("Post node id should always refer to a node");
if let Some(NodeInput::Node { node_id, .. }) = post_node_mut.inputs.get_mut(post_node_input_index) {
*node_id = layer_to_move.to_node();
Expand Down Expand Up @@ -1005,7 +1005,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
};
let child_layer_node_id = child_layer.to_node();

//Move child_layer stack x position to folder stack
// Move child_layer stack x position to folder stack
{
let child_layer_node = self.network.nodes.get(&child_layer_node_id).expect("Child node should always exist for layer");
let offset = folder_node.metadata.position - child_layer_node.metadata.position;
Expand Down Expand Up @@ -1351,7 +1351,7 @@ impl DocumentMessageHandler {
self.saved_hash = None;
}
}
//TODO: Replace with disconnect message
// TODO: Replace with disconnect message
pub fn disconnect_input(layer_to_disconnect_node: &mut DocumentNode, input_index: usize) {
let Some(node_type) = resolve_document_node_type(&layer_to_disconnect_node.name) else {
warn!("Node {} not in library", layer_to_disconnect_node.name);
Expand Down Expand Up @@ -1409,7 +1409,7 @@ impl DocumentMessageHandler {
})
}

//TODO: move into message
// TODO: move into message
pub fn disconnect_node(&mut self, layer_to_disconnect: LayerNodeIdentifier, responses: &mut VecDeque<Message>) {
let Some((downstream_node_id, downstream_input_index)) = DocumentMessageHandler::get_downstream_node(&self.network, &self.metadata, layer_to_disconnect) else {
log::error!("Downstream node should always exist when moving layer");
Expand Down
1 change: 1 addition & 0 deletions frontend/wasm/src/editor_api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -811,6 +811,7 @@ impl JsEditorHandle {
let message = NodeGraphMessage::SetToNodeOrLayer { node_id, is_layer };
self.dispatch(message);
}

/// Returns the string representation of the nodes contents
#[wasm_bindgen(js_name = introspectNode)]
pub fn introspect_node(&self, node_path: Vec<u64>) -> JsValue {
Expand Down