Skip to content

Commit 0586c10

Browse files
committed
Cleanup and add dynamic hints
1 parent 94e0922 commit 0586c10

4 files changed

Lines changed: 47 additions & 61 deletions

File tree

editor/src/messages/input_mapper/input_mappings.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ pub fn input_mappings() -> Mapping {
212212
entry!(KeyDown(Delete); modifiers=[Shift], action_dispatch=PathToolMessage::BreakPath),
213213
entry!(KeyDown(Backspace); modifiers=[Shift], action_dispatch=PathToolMessage::BreakPath),
214214
entry!(KeyDownNoRepeat(Tab); action_dispatch=PathToolMessage::SwapSelectedHandles),
215-
entry!(KeyDown(MouseLeft); action_dispatch=PathToolMessage::MouseDown { extend_selection: Shift, lasso_select: Control, handle_drag_from_anchor: Alt, drag_restore_handle: Control }),
215+
entry!(KeyDown(MouseLeft); action_dispatch=PathToolMessage::MouseDown { extend_selection: Shift, lasso_select: Control, handle_drag_from_anchor: Alt, drag_restore_handle: Control , molding_in_segment_edit: KeyA}),
216216
entry!(KeyDown(MouseRight); action_dispatch=PathToolMessage::RightClick),
217217
entry!(KeyDown(Escape); action_dispatch=PathToolMessage::Escape),
218218
entry!(KeyDown(KeyG); action_dispatch=PathToolMessage::GRS { key: KeyG }),

editor/src/messages/tool/common_functionality/shape_editor.rs

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -624,15 +624,6 @@ impl ShapeState {
624624
None
625625
}
626626

627-
// pub fn get_segment_selection_state(&mut self, network_interface: &NodeNetworkInterface, mouse_position: DVec2, select_threshold: f64) -> Option<(bool, Option<SelectedSegmentsInfo>)> {
628-
// if let Some(segment) = self.upper_closest_segment(network_interface, mouse_position, select_threshold) {
629-
// let vector_data = network_interface.compute_modified_vector(segment.layer);
630-
631-
// let selected_shape_state = self.selected_shape_state.get_mut(&segment.layer)?;
632-
// let already_selected = selected_shape_state.is_selected_segment(segment.segment);
633-
// }
634-
// }
635-
636627
pub fn select_anchor_point_by_id(&mut self, layer: LayerNodeIdentifier, id: PointId, extend_selection: bool) {
637628
if !extend_selection {
638629
self.deselect_all_points();
@@ -1876,15 +1867,14 @@ impl ShapeState {
18761867
None
18771868
};
18781869

1879-
// Checking the selection of handles
1870+
// Selection segments
18801871
for (id, bezier, _, _) in vector_data.segment_bezier_iter() {
18811872
if select_segments {
1882-
// Checking for selection of segments if they lie inside the bounding box or lasso polygon
1873+
// Select segments if they lie inside the bounding box or lasso polygon
18831874
let segment_bbox = calculate_bezier_bbox(bezier);
18841875
let bottom_left = transform.transform_point2(segment_bbox[0]);
18851876
let top_right = transform.transform_point2(segment_bbox[1]);
18861877

1887-
// Here take account of toched selection prefrences
18881878
let select = match selection_shape {
18891879
SelectionShape::Box(quad) => {
18901880
let enclosed = quad[0].min(quad[1]).cmple(bottom_left).all() && quad[0].max(quad[1]).cmpge(top_right).all();
@@ -1897,12 +1887,14 @@ impl ShapeState {
18971887
}
18981888
}
18991889
SelectionShape::Lasso(_) => {
1900-
//First check if the segement bbox intersects with lasso polygon (atleast one of the points of bbox should lie in lasso polygon)
19011890
let polygon = polygon_subpath.as_ref().expect("If `selection_shape` is a polygon then subpath is constructed beforehand.");
19021891

1903-
// Sample 10 points on the bezier and check if all lie inside the polygon or not
1892+
// Sample 10 points on the bezier and check if all or some lie inside the polygon
19041893
let points = bezier.compute_lookup_table(Some(10), None);
1905-
points.map(|p| transform.transform_point2(p)).all(|p| polygon.contains_point(p))
1894+
match selection_mode {
1895+
SelectionMode::Enclosed => points.map(|p| transform.transform_point2(p)).all(|p| polygon.contains_point(p)),
1896+
_ => points.map(|p| transform.transform_point2(p)).any(|p| polygon.contains_point(p)),
1897+
}
19061898
}
19071899
};
19081900

@@ -1914,7 +1906,7 @@ impl ShapeState {
19141906
}
19151907
}
19161908

1917-
// Checking for selection of handles
1909+
// Selecting handles
19181910
for (position, id) in [(bezier.handle_start(), ManipulatorPointId::PrimaryHandle(id)), (bezier.handle_end(), ManipulatorPointId::EndHandle(id))] {
19191911
let Some(position) = position else { continue };
19201912
let transformed_position = transform.transform_point2(position);

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

Lines changed: 38 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ pub enum PathToolMessage {
7070
lasso_select: Key,
7171
handle_drag_from_anchor: Key,
7272
drag_restore_handle: Key,
73+
molding_in_segment_edit: Key,
7374
},
7475
NudgeSelectedPoints {
7576
delta_x: f64,
@@ -542,6 +543,7 @@ impl PathToolData {
542543
lasso_select: bool,
543544
handle_drag_from_anchor: bool,
544545
drag_zero_handle: bool,
546+
molding_in_segment_edit: bool,
545547
path_overlay_mode: PathOverlayMode,
546548
segment_editing_mode: bool,
547549
point_editing_mode: bool,
@@ -655,7 +657,7 @@ impl PathToolData {
655657
else if let Some(segment) = shape_editor.upper_closest_segment(&document.network_interface, input.mouse.position, SELECTION_THRESHOLD) {
656658
responses.add(DocumentMessage::StartTransaction);
657659

658-
if segment_editing_mode {
660+
if segment_editing_mode && !molding_in_segment_edit {
659661
let layer = segment.layer();
660662
let segment_id = segment.segment();
661663
let already_selected = shape_editor.selected_shape_state.get(&layer).map_or(false, |state| state.is_selected_segment(segment_id));
@@ -1333,7 +1335,7 @@ impl Fsm for PathToolFsmState {
13331335
fn transition(self, event: ToolMessage, tool_data: &mut Self::ToolData, tool_action_data: &mut ToolActionHandlerData, tool_options: &Self::ToolOptions, responses: &mut VecDeque<Message>) -> Self {
13341336
let ToolActionHandlerData { document, input, shape_editor, .. } = tool_action_data;
13351337

1336-
update_dynamic_hints(self, responses, shape_editor, document, tool_data);
1338+
update_dynamic_hints(self, responses, shape_editor, document, tool_data, tool_options);
13371339

13381340
let ToolMessage::Path(event) = event else { return self };
13391341
match (self, event) {
@@ -1423,8 +1425,6 @@ impl Fsm for PathToolFsmState {
14231425
let Some(selected_shape_state) = shape_editor.selected_shape_state.get_mut(&layer) else {
14241426
continue;
14251427
};
1426-
// let selected_segments = selected_shape_state.selected_segments().collect::<Vec<_>>();
1427-
// log::info!("selected segments are: {:?}", selected_segments);
14281428
if selected_shape_state.is_selected_segment(segment_id) {
14291429
overlay_context.outline_select_bezier(bezier, transform);
14301430
}
@@ -1436,7 +1436,6 @@ impl Fsm for PathToolFsmState {
14361436
tool_data.update_closest_segment(shape_editor, input.mouse.position, document, tool_options.path_overlay_mode);
14371437

14381438
if let Some(closest_segment) = &tool_data.segment {
1439-
//Do this only when the segment editing mode is turned off
14401439
if tool_options.path_editing_mode.segment_editing_mode {
14411440
let transform = document.metadata().transform_to_viewport(closest_segment.layer());
14421441
overlay_context.outline_overlay_bezier(closest_segment.bezier(), transform);
@@ -1477,7 +1476,7 @@ impl Fsm for PathToolFsmState {
14771476
let polygon = &tool_data.lasso_polygon;
14781477

14791478
match (selection_shape, selection_mode, tool_data.started_drawing_from_inside) {
1480-
// Don't draw this if it is from inside a shape and selection just began
1479+
// Don't draw box if it is from inside a shape and selection just began
14811480
(SelectionShapeType::Box, SelectionMode::Enclosed, false) => overlay_context.dashed_quad(quad, None, fill_color, Some(4.), Some(4.), Some(0.5)),
14821481
(SelectionShapeType::Lasso, SelectionMode::Enclosed, _) => overlay_context.dashed_polygon(polygon, None, fill_color, Some(4.), Some(4.), Some(0.5)),
14831482
(SelectionShapeType::Box, _, false) => overlay_context.quad(quad, None, fill_color),
@@ -1528,12 +1527,14 @@ impl Fsm for PathToolFsmState {
15281527
lasso_select,
15291528
handle_drag_from_anchor,
15301529
drag_restore_handle,
1530+
molding_in_segment_edit,
15311531
},
15321532
) => {
15331533
let extend_selection = input.keyboard.get(extend_selection as usize);
15341534
let lasso_select = input.keyboard.get(lasso_select as usize);
15351535
let handle_drag_from_anchor = input.keyboard.get(handle_drag_from_anchor as usize);
15361536
let drag_zero_handle = input.keyboard.get(drag_restore_handle as usize);
1537+
let molding_in_segment_edit = input.keyboard.get(molding_in_segment_edit as usize);
15371538

15381539
tool_data.selection_mode = None;
15391540
tool_data.lasso_polygon.clear();
@@ -1547,6 +1548,7 @@ impl Fsm for PathToolFsmState {
15471548
lasso_select,
15481549
handle_drag_from_anchor,
15491550
drag_zero_handle,
1551+
molding_in_segment_edit,
15501552
tool_options.path_overlay_mode,
15511553
tool_options.path_editing_mode.segment_editing_mode,
15521554
tool_options.path_editing_mode.point_editing_mode,
@@ -1627,15 +1629,6 @@ impl Fsm for PathToolFsmState {
16271629
tool_data.handle_drag_toggle = true;
16281630
}
16291631

1630-
// This is responsible for selecting all the anchors if nothing is selected
1631-
// Should also check that if there is some segment selection or not
1632-
1633-
// if tool_data.selection_status.is_none() {
1634-
// if let Some(layer) = document.click(input) {
1635-
// shape_editor.select_all_anchors_in_layer(document, layer);
1636-
// }
1637-
// }
1638-
16391632
let anchor_and_handle_toggled = input.keyboard.get(move_anchor_with_handles as usize);
16401633
let initial_press = anchor_and_handle_toggled && !tool_data.select_anchor_toggled;
16411634
let released_from_toggle = tool_data.select_anchor_toggled && !anchor_and_handle_toggled;
@@ -1914,7 +1907,7 @@ impl Fsm for PathToolFsmState {
19141907
};
19151908

19161909
if tool_data.drag_start_pos == previous_mouse {
1917-
// If the click happened inside of a node then don't set selected nodes to empty array
1910+
// If click happens inside of a shape then don't set selected nodes to empty
19181911
if document.click(&input).is_none() {
19191912
responses.add(NodeGraphMessage::SelectedNodesSet { nodes: vec![] });
19201913
}
@@ -2007,7 +2000,6 @@ impl Fsm for PathToolFsmState {
20072000
}
20082001
// Segment editing mode
20092002
else if let Some(nearest_segment) = nearest_segment {
2010-
//Condition this upon whether user has selected segment editing mode or not
20112003
if segment_mode {
20122004
let clicked_selected = shape_editor.selected_segments().any(|&segment| segment == nearest_segment.segment());
20132005
if !drag_occurred && extend_selection {
@@ -2409,7 +2401,14 @@ fn calculate_adjacent_anchor_tangent(
24092401
}
24102402
}
24112403

2412-
fn update_dynamic_hints(state: PathToolFsmState, responses: &mut VecDeque<Message>, shape_editor: &mut ShapeState, document: &DocumentMessageHandler, tool_data: &PathToolData) {
2404+
fn update_dynamic_hints(
2405+
state: PathToolFsmState,
2406+
responses: &mut VecDeque<Message>,
2407+
shape_editor: &mut ShapeState,
2408+
document: &DocumentMessageHandler,
2409+
tool_data: &PathToolData,
2410+
tool_options: &PathToolOptions,
2411+
) {
24132412
// Condinting based on currently selected segment if it has any one g1 continuous handle
24142413

24152414
let hint_data = match state {
@@ -2443,12 +2442,27 @@ fn update_dynamic_hints(state: PathToolFsmState, responses: &mut VecDeque<Messag
24432442
drag_selected_hints.push(HintInfo::multi_keys([[Key::Control], [Key::Shift]], "Slide").prepend_plus());
24442443
}
24452444

2446-
let mut hint_data = vec![
2447-
HintGroup(vec![HintInfo::mouse(MouseMotion::Lmb, "Select Point"), HintInfo::keys([Key::Shift], "Extend").prepend_plus()]),
2448-
HintGroup(vec![HintInfo::mouse(MouseMotion::LmbDrag, "Select Area"), HintInfo::keys([Key::Control], "Lasso").prepend_plus()]),
2449-
HintGroup(vec![HintInfo::mouse(MouseMotion::Lmb, "Insert Point on Segment")]),
2450-
HintGroup(vec![HintInfo::keys_and_mouse([Key::Alt], MouseMotion::Lmb, "Delete Segment")]),
2451-
];
2445+
let mut hint_data = match (tool_data.segment.is_some(), tool_options.path_editing_mode.segment_editing_mode) {
2446+
(true, true) => {
2447+
vec![
2448+
HintGroup(vec![HintInfo::mouse(MouseMotion::Lmb, "Select Segment"), HintInfo::keys([Key::Shift], "Extend").prepend_plus()]),
2449+
HintGroup(vec![HintInfo::keys_and_mouse([Key::KeyA], MouseMotion::Lmb, "Mold Segment")]),
2450+
]
2451+
}
2452+
(true, false) => {
2453+
vec![
2454+
HintGroup(vec![HintInfo::mouse(MouseMotion::Lmb, "Insert Point on Segment")]),
2455+
HintGroup(vec![HintInfo::mouse(MouseMotion::LmbDrag, "Mold Segment")]),
2456+
HintGroup(vec![HintInfo::keys_and_mouse([Key::Alt], MouseMotion::Lmb, "Delete Segment")]),
2457+
]
2458+
}
2459+
(false, _) => {
2460+
vec![
2461+
HintGroup(vec![HintInfo::mouse(MouseMotion::Lmb, "Select Point"), HintInfo::keys([Key::Shift], "Extend").prepend_plus()]),
2462+
HintGroup(vec![HintInfo::mouse(MouseMotion::LmbDrag, "Select Area"), HintInfo::keys([Key::Control], "Lasso").prepend_plus()]),
2463+
]
2464+
}
2465+
};
24522466

24532467
if at_least_one_anchor_selected {
24542468
// TODO: Dynamically show either "Smooth" or "Sharp" based on the current state

node-graph/gcore/src/vector/vector_data.rs

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -583,26 +583,6 @@ impl ManipulatorPointId {
583583
}
584584
}
585585

586-
// #[derive(Clone, Copy, Debug, DynAny)]
587-
// pub struct SelectedSegment {
588-
// segment: SegmentId,
589-
// points: [PointId; 2],
590-
// }
591-
592-
// impl PartialEq for SelectedSegment {
593-
// fn eq(&self, other: &Self) -> bool {
594-
// self.segment == other.segment
595-
// }
596-
// }
597-
598-
// impl Eq for SelectedSegment {}
599-
600-
// impl Hash for SelectedSegment {
601-
// fn hash<H: Hasher>(&self, state: &mut H) {
602-
// self.segment.hash(state);
603-
// }
604-
// }
605-
606586
/// The type of handle found on a bézier curve.
607587
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, DynAny)]
608588
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]

0 commit comments

Comments
 (0)