Initial method for refit

This commit is contained in:
Adesh Gupta
2025-06-25 18:48:36 +05:30
parent 4a65ad290c
commit bfdbd9c912
3 changed files with 45 additions and 3 deletions

View File

@@ -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),

View File

@@ -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<SegmentId> {
vector_data.segment_bezier_iter().find(|(id, _, _, _)| *id == segment).map(|(_, bezier, _, _)| bezier)
}
fn dissolve_anchor(anchor: PointId, responses: &mut VecDeque<Message>, 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<Message>) {
// 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<Message>) {
for (&layer, state) in &self.selected_shape_state {
let Some(vector_data) = document.network_interface.compute_modified_vector(layer) else { continue };

View File

@@ -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<ToolMessage, &mut ToolActionHandlerData<'a>> for PathToo
DeselectAllPoints,
BreakPath,
DeleteAndBreakPath,
DeleteAndRefit,
ClosePath,
PointerMove,
),
@@ -296,6 +298,7 @@ impl<'a> MessageHandler<ToolMessage, &mut ToolActionHandlerData<'a>> for PathToo
Delete,
BreakPath,
DeleteAndBreakPath,
DeleteAndRefit,
SwapSelectedHandles,
),
PathToolFsmState::Drawing { .. } => actions!(PathToolMessageDiscriminant;
@@ -306,6 +309,7 @@ impl<'a> MessageHandler<ToolMessage, &mut ToolActionHandlerData<'a>> 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<Messag
if at_least_one_anchor_selected {
delete_selected_hints.push(HintInfo::keys([Key::Accel], "No Dissolve").prepend_plus());
delete_selected_hints.push(HintInfo::keys([Key::Shift], "Cut Anchor").prepend_plus());
delete_selected_hints.push(HintInfo::keys([Key::Alt], "Cut Anchor").prepend_plus());
delete_selected_hints.push(HintInfo::keys([Key::Shift], "Re-Fit").prepend_plus());
}
if single_colinear_anchor_selected {