Skip to content

Commit 183ab31

Browse files
krVatsalKeavon
authored andcommitted
fix axes to be at midpoint of vertices
1 parent 50bc9d7 commit 183ab31

File tree

1 file changed

+26
-4
lines changed

1 file changed

+26
-4
lines changed

editor/src/messages/tool/tool_messages/path_tool.rs

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,7 @@ struct PathToolData {
590590
last_clicked_point_was_selected: bool,
591591
last_clicked_segment_was_selected: bool,
592592
snapping_axis: Option<Axis>,
593+
snap_axis_origin: Option<DVec2>,
593594
alt_clicked_on_anchor: bool,
594595
alt_dragging_from_anchor: bool,
595596
angle_locked: bool,
@@ -1974,7 +1975,7 @@ impl Fsm for PathToolFsmState {
19741975
// Draw the snapping axis lines
19751976
if tool_data.snapping_axis.is_some() {
19761977
let Some(axis) = tool_data.snapping_axis else { return self };
1977-
let origin = tool_data.snap_manager.indicator_pos().unwrap_or(tool_data.drag_start_pos);
1978+
let origin = tool_data.snap_axis_origin.or_else(|| tool_data.snap_manager.indicator_pos()).unwrap_or(tool_data.drag_start_pos);
19781979
let viewport_diagonal = viewport.size().into_dvec2().length();
19791980

19801981
let faded = |color: &str| {
@@ -2124,16 +2125,35 @@ impl Fsm for PathToolFsmState {
21242125
{
21252126
// Constrain molding to a single axis when Shift is held
21262127
let mouse_position = if snap_axis_state {
2127-
let delta = input.mouse.position - tool_data.drag_start_pos;
2128+
// Calculate the midpoint between the segment's two anchor endpoints for the axis overlay
2129+
let midpoint = if let Some(vector) = document.network_interface.compute_modified_vector(segment.layer()) {
2130+
let transform = document.metadata().transform_to_viewport(segment.layer());
2131+
let points = segment.points();
2132+
let pos1 = vector.point_domain.position_from_id(points[0]);
2133+
let pos2 = vector.point_domain.position_from_id(points[1]);
2134+
if let (Some(p1), Some(p2)) = (pos1, pos2) {
2135+
(transform.transform_point2(p1) + transform.transform_point2(p2)) / 2.0
2136+
} else {
2137+
tool_data.drag_start_pos
2138+
}
2139+
} else {
2140+
tool_data.drag_start_pos
2141+
};
2142+
tool_data.snap_axis_origin = Some(midpoint);
2143+
2144+
// Constrain mouse movement relative to drag start so molding delta stays correct
2145+
let drag_start = tool_data.drag_start_pos;
2146+
let delta = input.mouse.position - drag_start;
21282147
let axis = if delta.x.abs() >= delta.y.abs() { Axis::X } else { Axis::Y };
21292148
tool_data.snapping_axis = Some(axis);
21302149
match axis {
2131-
Axis::X => DVec2::new(input.mouse.position.x, tool_data.drag_start_pos.y),
2132-
Axis::Y => DVec2::new(tool_data.drag_start_pos.x, input.mouse.position.y),
2150+
Axis::X => DVec2::new(input.mouse.position.x, drag_start.y),
2151+
Axis::Y => DVec2::new(drag_start.x, input.mouse.position.y),
21332152
_ => input.mouse.position,
21342153
}
21352154
} else {
21362155
tool_data.snapping_axis = None;
2156+
tool_data.snap_axis_origin = None;
21372157
input.mouse.position
21382158
};
21392159

@@ -2397,6 +2417,7 @@ impl Fsm for PathToolFsmState {
23972417
tool_data.temporary_adjacent_handles_while_molding = None;
23982418
tool_data.angle_locked = false;
23992419
tool_data.snapping_axis = None;
2420+
tool_data.snap_axis_origin = None;
24002421
responses.add(DocumentMessage::AbortTransaction);
24012422
tool_data.snap_manager.cleanup(responses);
24022423
PathToolFsmState::Ready
@@ -2645,6 +2666,7 @@ impl Fsm for PathToolFsmState {
26452666
}
26462667

26472668
tool_data.snapping_axis = None;
2669+
tool_data.snap_axis_origin = None;
26482670
tool_data.sliding_point_info = None;
26492671

26502672
if drag_occurred || extend_selection {

0 commit comments

Comments
 (0)