diff --git a/editor/src/document/document_message_handler.rs b/editor/src/document/document_message_handler.rs index f8ef8f604..9a758a8bc 100644 --- a/editor/src/document/document_message_handler.rs +++ b/editor/src/document/document_message_handler.rs @@ -462,6 +462,16 @@ impl DocumentMessageHandler { self.artboard_message_handler.artboards_graphene_document.viewport_bounding_box(&[]).ok().flatten() } } + + /// Calculate the path that new layers should be inserted to. + /// Depends on the selected layers as well as their types (Folder/Non-Folder) + pub fn get_path_for_new_layer(&self) -> Vec { + // If the selected layers dont actually exist, a new uuid for the + // root folder will be returned + let mut path = self.graphene_document.shallowest_common_folder(self.selected_layers()).map_or(vec![], |v| v.to_vec()); + path.push(generate_uuid()); + path + } } impl PropertyHolder for DocumentMessageHandler { diff --git a/editor/src/viewport_tools/tools/ellipse.rs b/editor/src/viewport_tools/tools/ellipse.rs index 6e7886992..312e3e998 100644 --- a/editor/src/viewport_tools/tools/ellipse.rs +++ b/editor/src/viewport_tools/tools/ellipse.rs @@ -111,7 +111,7 @@ impl Fsm for EllipseToolFsmState { (Ready, DragStart) => { shape_data.start(responses, input.viewport_bounds.size(), document, input.mouse.position); responses.push_back(DocumentMessage::StartTransaction.into()); - shape_data.path = Some(vec![generate_uuid()]); + shape_data.path = Some(document.get_path_for_new_layer()); responses.push_back(DocumentMessage::DeselectAllLayers.into()); responses.push_back( diff --git a/editor/src/viewport_tools/tools/freehand.rs b/editor/src/viewport_tools/tools/freehand.rs index 7e2fe6cbe..2a0c12a7f 100644 --- a/editor/src/viewport_tools/tools/freehand.rs +++ b/editor/src/viewport_tools/tools/freehand.rs @@ -148,7 +148,7 @@ impl Fsm for FreehandToolFsmState { (Ready, DragStart) => { responses.push_back(DocumentMessage::StartTransaction.into()); responses.push_back(DocumentMessage::DeselectAllLayers.into()); - data.path = Some(vec![generate_uuid()]); + data.path = Some(document.get_path_for_new_layer()); let pos = transform.inverse().transform_point2(input.mouse.position); diff --git a/editor/src/viewport_tools/tools/line.rs b/editor/src/viewport_tools/tools/line.rs index f46fd790a..3c8fb0192 100644 --- a/editor/src/viewport_tools/tools/line.rs +++ b/editor/src/viewport_tools/tools/line.rs @@ -159,7 +159,7 @@ impl Fsm for LineToolFsmState { data.drag_start = data.snap_handler.snap_position(responses, input.viewport_bounds.size(), document, input.mouse.position); responses.push_back(DocumentMessage::StartTransaction.into()); - data.path = Some(vec![generate_uuid()]); + data.path = Some(document.get_path_for_new_layer()); responses.push_back(DocumentMessage::DeselectAllLayers.into()); data.weight = tool_options.line_weight; diff --git a/editor/src/viewport_tools/tools/pen.rs b/editor/src/viewport_tools/tools/pen.rs index f6c99d577..b875068a6 100644 --- a/editor/src/viewport_tools/tools/pen.rs +++ b/editor/src/viewport_tools/tools/pen.rs @@ -153,7 +153,7 @@ impl Fsm for PenToolFsmState { (Ready, DragStart) => { responses.push_back(DocumentMessage::StartTransaction.into()); responses.push_back(DocumentMessage::DeselectAllLayers.into()); - data.path = Some(vec![generate_uuid()]); + data.path = Some(document.get_path_for_new_layer()); data.snap_handler.start_snap(document, document.visible_layers(), true, true); let snapped_position = data.snap_handler.snap_position(responses, input.viewport_bounds.size(), document, input.mouse.position); diff --git a/editor/src/viewport_tools/tools/rectangle.rs b/editor/src/viewport_tools/tools/rectangle.rs index 21e602c10..23751b56a 100644 --- a/editor/src/viewport_tools/tools/rectangle.rs +++ b/editor/src/viewport_tools/tools/rectangle.rs @@ -110,7 +110,7 @@ impl Fsm for RectangleToolFsmState { (Ready, DragStart) => { shape_data.start(responses, input.viewport_bounds.size(), document, input.mouse.position); responses.push_back(DocumentMessage::StartTransaction.into()); - shape_data.path = Some(vec![generate_uuid()]); + shape_data.path = Some(document.get_path_for_new_layer()); responses.push_back(DocumentMessage::DeselectAllLayers.into()); responses.push_back( diff --git a/editor/src/viewport_tools/tools/shape.rs b/editor/src/viewport_tools/tools/shape.rs index a406db1e0..b6c016804 100644 --- a/editor/src/viewport_tools/tools/shape.rs +++ b/editor/src/viewport_tools/tools/shape.rs @@ -151,7 +151,7 @@ impl Fsm for ShapeToolFsmState { (Ready, DragStart) => { shape_data.start(responses, input.viewport_bounds.size(), document, input.mouse.position); responses.push_back(DocumentMessage::StartTransaction.into()); - shape_data.path = Some(vec![generate_uuid()]); + shape_data.path = Some(document.get_path_for_new_layer()); responses.push_back(DocumentMessage::DeselectAllLayers.into()); data.sides = tool_options.vertices; diff --git a/editor/src/viewport_tools/tools/shared/resize.rs b/editor/src/viewport_tools/tools/shared/resize.rs index d5a2ed48b..145ed57ae 100644 --- a/editor/src/viewport_tools/tools/shared/resize.rs +++ b/editor/src/viewport_tools/tools/shared/resize.rs @@ -15,6 +15,7 @@ pub struct Resize { pub path: Option>, snap_handler: SnapHandler, } + impl Resize { /// Starts a resize, assigning the snap targets and snapping the starting position. pub fn start(&mut self, responses: &mut VecDeque, viewport_bounds: DVec2, document: &DocumentMessageHandler, mouse_position: DVec2) { diff --git a/editor/src/viewport_tools/tools/text.rs b/editor/src/viewport_tools/tools/text.rs index b31b217f2..983aa7ff2 100644 --- a/editor/src/viewport_tools/tools/text.rs +++ b/editor/src/viewport_tools/tools/text.rs @@ -246,7 +246,7 @@ impl Fsm for TextToolFsmState { else if state == TextToolFsmState::Ready { let transform = DAffine2::from_translation(input.mouse.position).to_cols_array(); let font_size = tool_options.font_size; - data.path = vec![generate_uuid()]; + data.path = document.get_path_for_new_layer(); responses.push_back( Operation::AddText {