diff --git a/editor/src/messages/input_mapper/input_mappings.rs b/editor/src/messages/input_mapper/input_mappings.rs index 46854dc760..4eae2cbe27 100644 --- a/editor/src/messages/input_mapper/input_mappings.rs +++ b/editor/src/messages/input_mapper/input_mappings.rs @@ -216,8 +216,10 @@ pub fn input_mappings() -> Mapping { // PathToolMessage entry!(KeyDown(Delete); modifiers=[Accel], action_dispatch=PathToolMessage::DeleteAndBreakPath), entry!(KeyDown(Backspace); modifiers=[Accel], action_dispatch=PathToolMessage::DeleteAndBreakPath), - entry!(KeyDown(Delete); modifiers=[Shift], action_dispatch=PathToolMessage::BreakPath), - entry!(KeyDown(Backspace); modifiers=[Shift], action_dispatch=PathToolMessage::BreakPath), + entry!(KeyDown(Delete); modifiers=[Alt], action_dispatch=PathToolMessage::BreakPath), + entry!(KeyDown(Backspace); modifiers=[Alt], action_dispatch=PathToolMessage::BreakPath), + entry!(KeyDown(Delete); modifiers=[Shift], action_dispatch=PathToolMessage::DeleteAndRefit), + entry!(KeyDown(Backspace); modifiers=[Shift], action_dispatch=PathToolMessage::DeleteAndRefit), entry!(KeyDownNoRepeat(Tab); action_dispatch=PathToolMessage::SwapSelectedHandles), entry!(KeyDown(MouseLeft); action_dispatch=PathToolMessage::MouseDown { extend_selection: Shift, lasso_select: Control, handle_drag_from_anchor: Alt, drag_restore_handle: Control }), entry!(KeyDown(MouseRight); action_dispatch=PathToolMessage::RightClick), diff --git a/editor/src/messages/tool/common_functionality/shape_editor.rs b/editor/src/messages/tool/common_functionality/shape_editor.rs index 218c53c6c2..de0a046d27 100644 --- a/editor/src/messages/tool/common_functionality/shape_editor.rs +++ b/editor/src/messages/tool/common_functionality/shape_editor.rs @@ -12,6 +12,7 @@ use crate::messages::tool::common_functionality::utility_functions::is_visible_p use crate::messages::tool::tool_messages::path_tool::{PathOverlayMode, PointSelectState}; use bezier_rs::{Bezier, BezierHandles, Subpath, TValue}; use glam::{DAffine2, DVec2}; +use graph_craft::document; use graphene_std::vector::{HandleId, SegmentId}; use graphene_std::vector::{ManipulatorPointId, PointId, VectorData, VectorModificationType}; @@ -1173,6 +1174,10 @@ impl ShapeState { } } + pub fn get_bezier_from_segment_id(segment: SegmentId, vector_data: &VectorData) -> Option { + vector_data.segment_bezier_iter().find(|(id, _, _, _)| *id == segment).map(|(_, bezier, _, _)| bezier) + } + fn dissolve_anchor(anchor: PointId, responses: &mut VecDeque, layer: LayerNodeIdentifier, vector_data: &VectorData) -> Option<[(HandleId, PointId); 2]> { // Delete point let modification_type = VectorModificationType::RemovePoint { id: anchor }; @@ -1196,6 +1201,14 @@ impl ShapeState { let [Some(start), Some(end)] = opposites.map(|opposite| opposite.to_manipulator_point().get_anchor(vector_data)) else { return None; }; + let Some(bezier1) = vector_data.segment_bezier_iter().find(|(id, _, _, _)| *id == segment).map(|(_, bezier, _, _)| bezier) else { + return None; + }; + let Some(bezier2) = vector_data.segment_bezier_iter().find(|(id, _, _, _)| *id == segment).map(|(_, bezier, _, _)| bezier) else { + return None; + }; + // Here we should also return the beziers of the connected handles + Some([(handles[0], start), (handles[1], end)]) } @@ -1304,6 +1317,15 @@ impl ShapeState { } } + pub fn delete_point_and_refit(&mut self, document: &DocumentMessageHandler, responses: &mut VecDeque) { + // Here define the logic of what happens exactly when sone selected points are deleted + for (&layer, state) in &mut self.selected_shape_state { + let Some(vector_data) = document.network_interface.compute_modified_vector(layer) else { + continue; + }; + } + } + pub fn break_path_at_selected_point(&self, document: &DocumentMessageHandler, responses: &mut VecDeque) { for (&layer, state) in &self.selected_shape_state { let Some(vector_data) = document.network_interface.compute_modified_vector(layer) else { continue }; diff --git a/editor/src/messages/tool/tool_messages/path_tool.rs b/editor/src/messages/tool/tool_messages/path_tool.rs index 395d6a432c..2f6b7edadd 100644 --- a/editor/src/messages/tool/tool_messages/path_tool.rs +++ b/editor/src/messages/tool/tool_messages/path_tool.rs @@ -47,6 +47,7 @@ pub enum PathToolMessage { DeselectAllPoints, Delete, DeleteAndBreakPath, + DeleteAndRefit, DragStop { extend_selection: Key, shrink_selection: Key, @@ -284,6 +285,7 @@ impl<'a> MessageHandler> for PathToo DeselectAllPoints, BreakPath, DeleteAndBreakPath, + DeleteAndRefit, ClosePath, PointerMove, ), @@ -296,6 +298,7 @@ impl<'a> MessageHandler> for PathToo Delete, BreakPath, DeleteAndBreakPath, + DeleteAndRefit, SwapSelectedHandles, ), PathToolFsmState::Drawing { .. } => actions!(PathToolMessageDiscriminant; @@ -306,6 +309,7 @@ impl<'a> MessageHandler> for PathToo Enter, BreakPath, DeleteAndBreakPath, + DeleteAndRefit, Escape, RightClick, ), @@ -1921,11 +1925,24 @@ impl Fsm for PathToolFsmState { PathToolFsmState::Ready } (_, PathToolMessage::BreakPath) => { + responses.add(DocumentMessage::AddTransaction); shape_editor.break_path_at_selected_point(document, responses); + responses.add(PathToolMessage::SelectionChanged); + PathToolFsmState::Ready } (_, PathToolMessage::DeleteAndBreakPath) => { + responses.add(DocumentMessage::AddTransaction); shape_editor.delete_point_and_break_path(document, responses); + responses.add(PathToolMessage::SelectionChanged); + + PathToolFsmState::Ready + } + (_, PathToolMessage::DeleteAndRefit) => { + responses.add(DocumentMessage::AddTransaction); + shape_editor.delete_point_and_refit(document, responses); + responses.add(PathToolMessage::SelectionChanged); + PathToolFsmState::Ready } (_, PathToolMessage::FlipSmoothSharp) => { @@ -2278,7 +2295,8 @@ fn update_dynamic_hints(state: PathToolFsmState, responses: &mut VecDeque