Skip to content

Commit 8b0a279

Browse files
authored
Clean up the Path tool's FSM to move segment molding state into the dragging state (#2835)
Cleanup molding segments state
1 parent 49db963 commit 8b0a279

File tree

1 file changed

+60
-85
lines changed

1 file changed

+60
-85
lines changed

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

Lines changed: 60 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -362,12 +362,6 @@ impl<'a> MessageHandler<ToolMessage, &mut ToolActionHandlerData<'a>> for PathToo
362362
Escape,
363363
RightClick
364364
),
365-
PathToolFsmState::MoldingSegment => actions!(PathToolMessageDiscriminant;
366-
PointerMove,
367-
DragStop,
368-
RightClick,
369-
Escape,
370-
),
371365
}
372366
}
373367
}
@@ -419,7 +413,6 @@ enum PathToolFsmState {
419413
selection_shape: SelectionShapeType,
420414
},
421415
SlidingPoint,
422-
MoldingSegment,
423416
}
424417

425418
#[derive(Default)]
@@ -688,7 +681,7 @@ impl PathToolData {
688681
self.molding_info = Some((pos1, pos2))
689682
}
690683
}
691-
PathToolFsmState::MoldingSegment
684+
PathToolFsmState::Dragging(self.dragging_state)
692685
}
693686
}
694687
// If no other layers are selected and this is a single-click, then also select the layer (exception)
@@ -1505,7 +1498,6 @@ impl Fsm for PathToolFsmState {
15051498
}
15061499
}
15071500
Self::SlidingPoint => {}
1508-
Self::MoldingSegment => {}
15091501
}
15101502

15111503
responses.add(PathToolMessage::SelectedPointUpdated);
@@ -1610,20 +1602,33 @@ impl Fsm for PathToolFsmState {
16101602
break_colinear_molding,
16111603
},
16121604
) => {
1605+
let selected_only_handles = !shape_editor.selected_points().any(|point| matches!(point, ManipulatorPointId::Anchor(_)));
16131606
tool_data.stored_selection = None;
1614-
let mut selected_only_handles = true;
16151607

1616-
let selected_points = shape_editor.selected_points();
1608+
if !tool_data.saved_points_before_handle_drag.is_empty() && (tool_data.drag_start_pos.distance(input.mouse.position) > DRAG_THRESHOLD) && (selected_only_handles) {
1609+
tool_data.handle_drag_toggle = true;
1610+
}
16171611

1618-
for point in selected_points {
1619-
if matches!(point, ManipulatorPointId::Anchor(_)) {
1620-
selected_only_handles = false;
1621-
break;
1622-
}
1612+
if tool_data.drag_start_pos.distance(input.mouse.position) > DRAG_THRESHOLD {
1613+
tool_data.molding_segment = true;
16231614
}
16241615

1625-
if !tool_data.saved_points_before_handle_drag.is_empty() && (tool_data.drag_start_pos.distance(input.mouse.position) > DRAG_THRESHOLD) && (selected_only_handles) {
1626-
tool_data.handle_drag_toggle = true;
1616+
let break_molding = input.keyboard.get(break_colinear_molding as usize);
1617+
1618+
// Logic for molding segment
1619+
if let Some(segment) = &mut tool_data.segment {
1620+
if let Some(molding_segment_handles) = tool_data.molding_info {
1621+
tool_data.temporary_adjacent_handles_while_molding = segment.mold_handle_positions(
1622+
document,
1623+
responses,
1624+
molding_segment_handles,
1625+
input.mouse.position,
1626+
break_molding,
1627+
tool_data.temporary_adjacent_handles_while_molding,
1628+
);
1629+
}
1630+
1631+
return PathToolFsmState::Dragging(tool_data.dragging_state);
16271632
}
16281633

16291634
let anchor_and_handle_toggled = input.keyboard.get(move_anchor_with_handles as usize);
@@ -1701,29 +1706,6 @@ impl Fsm for PathToolFsmState {
17011706
tool_data.slide_point(input.mouse.position, responses, &document.network_interface, shape_editor);
17021707
PathToolFsmState::SlidingPoint
17031708
}
1704-
(PathToolFsmState::MoldingSegment, PathToolMessage::PointerMove { break_colinear_molding, .. }) => {
1705-
if tool_data.drag_start_pos.distance(input.mouse.position) > DRAG_THRESHOLD {
1706-
tool_data.molding_segment = true;
1707-
}
1708-
1709-
let break_colinear_molding = input.keyboard.get(break_colinear_molding as usize);
1710-
1711-
// Logic for molding segment
1712-
if let Some(segment) = &mut tool_data.segment {
1713-
if let Some(molding_segment_handles) = tool_data.molding_info {
1714-
tool_data.temporary_adjacent_handles_while_molding = segment.mold_handle_positions(
1715-
document,
1716-
responses,
1717-
molding_segment_handles,
1718-
input.mouse.position,
1719-
break_colinear_molding,
1720-
tool_data.temporary_adjacent_handles_while_molding,
1721-
);
1722-
}
1723-
}
1724-
1725-
PathToolFsmState::MoldingSegment
1726-
}
17271709
(PathToolFsmState::Ready, PathToolMessage::PointerMove { delete_segment, .. }) => {
17281710
tool_data.delete_segment_pressed = input.keyboard.get(delete_segment as usize);
17291711

@@ -1855,6 +1837,9 @@ impl Fsm for PathToolFsmState {
18551837
tool_data.saved_points_before_handle_drag.clear();
18561838
tool_data.handle_drag_toggle = false;
18571839
}
1840+
tool_data.molding_info = None;
1841+
tool_data.molding_segment = false;
1842+
tool_data.temporary_adjacent_handles_while_molding = None;
18581843
tool_data.angle_locked = false;
18591844
responses.add(DocumentMessage::AbortTransaction);
18601845
tool_data.snap_manager.cleanup(responses);
@@ -1872,17 +1857,6 @@ impl Fsm for PathToolFsmState {
18721857

18731858
PathToolFsmState::Ready
18741859
}
1875-
(PathToolFsmState::MoldingSegment, PathToolMessage::Escape | PathToolMessage::RightClick) => {
1876-
// Undo the molding and go back to the state before
1877-
tool_data.molding_info = None;
1878-
tool_data.molding_segment = false;
1879-
tool_data.temporary_adjacent_handles_while_molding = None;
1880-
1881-
responses.add(DocumentMessage::AbortTransaction);
1882-
tool_data.snap_manager.cleanup(responses);
1883-
1884-
PathToolFsmState::Ready
1885-
}
18861860
// Mouse up
18871861
(PathToolFsmState::Drawing { selection_shape }, PathToolMessage::DragStop { extend_selection, shrink_selection }) => {
18881862
let extend_selection = input.keyboard.get(extend_selection as usize);
@@ -2598,48 +2572,49 @@ fn update_dynamic_hints(
25982572
dragging_hint_data.0.push(HintGroup(hold_group));
25992573
}
26002574

2601-
dragging_hint_data
2602-
}
2603-
PathToolFsmState::Drawing { .. } => HintData(vec![
2604-
HintGroup(vec![HintInfo::mouse(MouseMotion::Rmb, ""), HintInfo::keys([Key::Escape], "Cancel").prepend_slash()]),
2605-
HintGroup(vec![
2606-
HintInfo::mouse(MouseMotion::LmbDrag, "Select Area"),
2607-
HintInfo::keys([Key::Shift], "Extend").prepend_plus(),
2608-
HintInfo::keys([Key::Alt], "Subtract").prepend_plus(),
2609-
]),
2610-
]),
2611-
PathToolFsmState::MoldingSegment => {
2612-
let mut has_colinear_anchors = false;
2575+
if tool_data.molding_segment {
2576+
let mut has_colinear_anchors = false;
26132577

2614-
if let Some(segment) = &tool_data.segment {
2615-
let handle1 = HandleId::primary(segment.segment());
2616-
let handle2 = HandleId::end(segment.segment());
2578+
if let Some(segment) = &tool_data.segment {
2579+
let handle1 = HandleId::primary(segment.segment());
2580+
let handle2 = HandleId::end(segment.segment());
26172581

2618-
if let Some(vector_data) = document.network_interface.compute_modified_vector(segment.layer()) {
2619-
let other_handle1 = vector_data.other_colinear_handle(handle1);
2620-
let other_handle2 = vector_data.other_colinear_handle(handle2);
2621-
if other_handle1.is_some() || other_handle2.is_some() {
2622-
has_colinear_anchors = true;
2623-
}
2582+
if let Some(vector_data) = document.network_interface.compute_modified_vector(segment.layer()) {
2583+
let other_handle1 = vector_data.other_colinear_handle(handle1);
2584+
let other_handle2 = vector_data.other_colinear_handle(handle2);
2585+
if other_handle1.is_some() || other_handle2.is_some() {
2586+
has_colinear_anchors = true;
2587+
}
2588+
};
2589+
}
2590+
2591+
let handles_stored = if let Some(other_handles) = tool_data.temporary_adjacent_handles_while_molding {
2592+
other_handles[0].is_some() || other_handles[1].is_some()
2593+
} else {
2594+
false
26242595
};
2625-
}
26262596

2627-
let handles_stored = if let Some(other_handles) = tool_data.temporary_adjacent_handles_while_molding {
2628-
other_handles[0].is_some() || other_handles[1].is_some()
2629-
} else {
2630-
false
2631-
};
2597+
let molding_disable_possible = has_colinear_anchors || handles_stored;
26322598

2633-
let molding_disable_possible = has_colinear_anchors || handles_stored;
2599+
let mut molding_hints = vec![HintGroup(vec![HintInfo::mouse(MouseMotion::Rmb, ""), HintInfo::keys([Key::Escape], "Cancel").prepend_slash()])];
26342600

2635-
let mut molding_hints = vec![HintGroup(vec![HintInfo::mouse(MouseMotion::Rmb, ""), HintInfo::keys([Key::Escape], "Cancel").prepend_slash()])];
2601+
if molding_disable_possible {
2602+
molding_hints.push(HintGroup(vec![HintInfo::keys([Key::Alt], "Break Colinear Handles")]));
2603+
}
26362604

2637-
if molding_disable_possible {
2638-
molding_hints.push(HintGroup(vec![HintInfo::keys([Key::Alt], "Break Colinear Handles")]));
2605+
HintData(molding_hints)
2606+
} else {
2607+
dragging_hint_data
26392608
}
2640-
2641-
HintData(molding_hints)
26422609
}
2610+
PathToolFsmState::Drawing { .. } => HintData(vec![
2611+
HintGroup(vec![HintInfo::mouse(MouseMotion::Rmb, ""), HintInfo::keys([Key::Escape], "Cancel").prepend_slash()]),
2612+
HintGroup(vec![
2613+
HintInfo::mouse(MouseMotion::LmbDrag, "Select Area"),
2614+
HintInfo::keys([Key::Shift], "Extend").prepend_plus(),
2615+
HintInfo::keys([Key::Alt], "Subtract").prepend_plus(),
2616+
]),
2617+
]),
26432618
PathToolFsmState::SlidingPoint => HintData(vec![HintGroup(vec![HintInfo::mouse(MouseMotion::Rmb, ""), HintInfo::keys([Key::Escape], "Cancel").prepend_slash()])]),
26442619
};
26452620
responses.add(FrontendMessage::UpdateInputHints { hint_data });

0 commit comments

Comments
 (0)