Skip to content

Commit 0a65e57

Browse files
moOsama76Keavon
andauthored
Add snapping for a line's midpoint when it's being drawn (#2594)
* line midpoint snapper * Add to snap option menu * remove being_drawn_line_midpoint * Code review --------- Co-authored-by: Keavon Chambers <[email protected]>
1 parent d5cb380 commit 0a65e57

File tree

2 files changed

+21
-6
lines changed

2 files changed

+21
-6
lines changed

editor/src/messages/portfolio/document/utility_types/network_interface.rs

-1
Original file line numberDiff line numberDiff line change
@@ -4198,7 +4198,6 @@ impl NodeNetworkInterface {
41984198
let Some(downstream_nodes) = outward_wires.get(&current_node) else { continue };
41994199
for downstream_node in downstream_nodes {
42004200
if let InputConnector::Node { node_id: downstream_id, .. } = downstream_node {
4201-
let downstream_node_output = OutputConnector::node(*downstream_id, 0);
42024201
if !delete_nodes.contains(downstream_id) {
42034202
can_delete = false;
42044203
break;

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

+21-5
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,7 @@ fn generate_line(tool_data: &mut LineToolData, snap_data: SnapData, lock_angle:
394394

395395
let near_point = SnapCandidatePoint::handle_neighbors(document_points[1], [tool_data.drag_start]);
396396
let far_point = SnapCandidatePoint::handle_neighbors(2. * document_points[0] - document_points[1], [tool_data.drag_start]);
397+
let mid_point = SnapCandidatePoint::handle_neighbors((tool_data.drag_start + document_points[1]) / 2., [tool_data.drag_start]);
397398
let config = SnapTypeConfiguration::default();
398399

399400
if constrained {
@@ -410,8 +411,15 @@ fn generate_line(tool_data: &mut LineToolData, snap_data: SnapData, lock_angle:
410411
snap.update_indicator(best);
411412
} else {
412413
let snapped = snap.constrained_snap(&snap_data, &near_point, constraint, config);
413-
document_points[1] = snapped.snapped_point_document;
414-
snap.update_indicator(snapped);
414+
let snapped_mid = snap.constrained_snap(&snap_data, &mid_point, constraint, config);
415+
let best = if snap_data.document.snapping_state.path.line_midpoint && snapped_mid.other_snap_better(&snapped_mid) {
416+
document_points[1] += (snapped_mid.snapped_point_document - mid_point.document_point) * 2.;
417+
snapped_mid
418+
} else {
419+
document_points[1] = snapped.snapped_point_document;
420+
snapped.clone()
421+
};
422+
snap.update_indicator(best);
415423
}
416424
} else if center {
417425
let snapped = snap.free_snap(&snap_data, &near_point, config);
@@ -422,8 +430,15 @@ fn generate_line(tool_data: &mut LineToolData, snap_data: SnapData, lock_angle:
422430
snap.update_indicator(best);
423431
} else {
424432
let snapped = snap.free_snap(&snap_data, &near_point, config);
425-
document_points[1] = snapped.snapped_point_document;
426-
snap.update_indicator(snapped);
433+
let snapped_mid = snap.free_snap(&snap_data, &mid_point, config);
434+
let best = if snap_data.document.snapping_state.path.line_midpoint && snapped_mid.other_snap_better(&snapped_mid) {
435+
document_points[1] += (snapped_mid.snapped_point_document - mid_point.document_point) * 2.;
436+
snapped_mid
437+
} else {
438+
document_points[1] = snapped.snapped_point_document;
439+
snapped.clone()
440+
};
441+
snap.update_indicator(best);
427442
}
428443

429444
// Snapping happens in other space, while document graph renders in another.
@@ -433,7 +448,8 @@ fn generate_line(tool_data: &mut LineToolData, snap_data: SnapData, lock_angle:
433448
#[cfg(test)]
434449
mod test_line_tool {
435450
use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn;
436-
use crate::{messages::tool::common_functionality::graph_modification_utils::NodeGraphLayer, test_utils::test_prelude::*};
451+
use crate::messages::tool::common_functionality::graph_modification_utils::NodeGraphLayer;
452+
use crate::test_utils::test_prelude::*;
437453
use glam::DAffine2;
438454
use graph_craft::document::value::TaggedValue;
439455

0 commit comments

Comments
 (0)