Skip to content
Open
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
f532a67
feat : snapping bezier segment to x or y axis with with center at t =…
Jangidyogesh12 Oct 13, 2026
e362af8
Merge branch 'master' into snapping-axis-on-bezier-curve
Jangidyogesh12 Oct 13, 2026
b978c14
ran formating and test command
Jangidyogesh12 Oct 13, 2026
8549cb8
chore : cleared mold_snap_origin and snap_axis to avoide stale value
Jangidyogesh12 Oct 13, 2026
8f238fe
fix : merge conflicts
Jangidyogesh12 Oct 14, 2026
1369f5d
Merge branch 'master' into snapping-axis-on-bezier-curve
Jangidyogesh12 Oct 15, 2026
9cb317f
Merge branch 'master' into snapping-axis-on-bezier-curve
Jangidyogesh12 Oct 15, 2026
ee0b3f2
Merge branch 'master' into snapping-axis-on-bezier-curve
Jangidyogesh12 Oct 15, 2026
47516aa
Merge branch 'master' into snapping-axis-on-bezier-curve
Jangidyogesh12 Oct 18, 2026
7242e3e
Merge branch 'master' into snapping-axis-on-bezier-curve
Jangidyogesh12 Oct 19, 2026
ff1a63d
Merge branch 'master' into snapping-axis-on-bezier-curve
Jangidyogesh12 Oct 20, 2026
8058b12
Merge branch 'master' into snapping-axis-on-bezier-curve
Jangidyogesh12 Oct 25, 2026
146710e
Merge branch 'master' into snapping-axis-on-bezier-curve
Jangidyogesh12 Oct 26, 2026
bf84611
fix merge conflict
Jangidyogesh12 Nov 1, 2026
c7352d7
Merge remote-tracking branch 'yogesh/snapping-axis-on-bezier-curve' i…
Jangidyogesh12 Nov 1, 2026
2c72dbf
Merge branch 'master' into snapping-axis-on-bezier-curve
Jangidyogesh12 Nov 1, 2026
311134a
Merge branch 'master' into snapping-axis-on-bezier-curve
Jangidyogesh12 Nov 2, 2026
0166fee
Merge branch 'master' into snapping-axis-on-bezier-curve
Jangidyogesh12 Nov 3, 2026
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
33 changes: 30 additions & 3 deletions editor/src/messages/tool/tool_messages/path_tool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -625,6 +625,7 @@ struct PathToolData {
temporary_colinear_handles: bool,
molding_info: Option<(DVec2, DVec2)>,
molding_segment: bool,
molding_snap_origin: Option<DVec2>,
temporary_adjacent_handles_while_molding: Option<[Option<HandleId>; 2]>,
frontier_handles_info: Option<HashMap<LayerNodeIdentifier, HashMap<SegmentId, Vec<PointId>>>>,
adjacent_anchor_offset: Option<DVec2>,
Expand Down Expand Up @@ -2011,7 +2012,7 @@ impl Fsm for PathToolFsmState {
// Draw the snapping axis lines through where the point under the pointer began
if let Some(axis) = tool_data.snapping_axis {
let slide_start = tool_data.slide.as_ref().map(|slide| document.metadata().document_to_viewport.transform_point2(slide.start));
let origin = slide_start.unwrap_or(tool_data.drag_start_pos);
let origin = tool_data.molding_snap_origin.or(slide_start).unwrap_or(tool_data.drag_start_pos);
let viewport_diagonal = viewport.size().into_dvec2().length();

match axis {
Expand Down Expand Up @@ -2144,11 +2145,32 @@ impl Fsm for PathToolFsmState {
}

let break_molding = input.keyboard.get(break_colinear_molding as usize);
let snap_angle_state = input.keyboard.get(snap_angle as usize);

// Logic for molding segment
if let Some(segment) = &mut tool_data.segment
&& let Some(molding_segment_handles) = tool_data.molding_info
{
let mouse_position = if snap_angle_state {
let transform = document.metadata().transform_to_viewport_if_feeds(segment.layer(), &document.network_interface);
let parametric_bezier_mid = point_to_dvec2(segment.pathseg().eval(0.5));
let mid = transform.transform_point2(parametric_bezier_mid);

tool_data.molding_snap_origin = Some(mid);
let drag_start = tool_data.drag_start_pos;

let delta = input.mouse.position - drag_start;
tool_data.snapping_axis = Some(if delta.x.abs() >= delta.y.abs() { Axis::X } else { Axis::Y });
match tool_data.snapping_axis {
Some(Axis::X) => DVec2::new(input.mouse.position.x, drag_start.y),
Some(Axis::Y) => DVec2::new(drag_start.x, input.mouse.position.y),
_ => input.mouse.position,
}
} else {
tool_data.snapping_axis = None;
tool_data.molding_snap_origin = None;
input.mouse.position
};
// Past the threshold, the press on the segment molds it rather than clicking to insert a point
if tool_data.drag_start_pos.distance(input.mouse.position) > DRAG_THRESHOLD {
tool_data.molding_segment = true;
Expand All @@ -2158,7 +2180,7 @@ impl Fsm for PathToolFsmState {
document,
responses,
molding_segment_handles,
input.mouse.position,
mouse_position,
break_molding,
tool_data.temporary_adjacent_handles_while_molding,
);
Expand Down Expand Up @@ -2199,7 +2221,6 @@ impl Fsm for PathToolFsmState {
let toggle_colinear_state = input.keyboard.get(toggle_colinear as usize);
let equidistant_state = input.keyboard.get(equidistant as usize);
let lock_angle_state = input.keyboard.get(lock_angle as usize);
let snap_angle_state = input.keyboard.get(snap_angle as usize);

if !lock_angle_state {
tool_data.angle_locked = false;
Expand Down Expand Up @@ -2415,6 +2436,11 @@ impl Fsm for PathToolFsmState {
tool_data.saved_selection_before_handle_drag.clear();
tool_data.handle_drag_toggle = false;
}
tool_data.molding_info = None;
tool_data.molding_segment = false;
tool_data.molding_snap_origin = None;
tool_data.snapping_axis = None;
tool_data.temporary_adjacent_handles_while_molding = None;
tool_data.end_molding();
tool_data.angle_locked = false;
responses.add(DocumentMessage::AbortTransaction);
Expand Down Expand Up @@ -2670,6 +2696,7 @@ impl Fsm for PathToolFsmState {
}

tool_data.sliding_point_info = None;
tool_data.snapping_axis = None;

// Close the transaction the press opened, which adds no undo step when nothing changed, as for a plain click
responses.add(DocumentMessage::EndTransaction);
Expand Down