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 <keavon@keavon.com>
This commit is contained in:
Mohamed Osama 2025-04-30 08:12:04 +03:00 committed by GitHub
parent d5cb380328
commit 0a65e570a9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 21 additions and 6 deletions

View file

@ -4198,7 +4198,6 @@ impl NodeNetworkInterface {
let Some(downstream_nodes) = outward_wires.get(&current_node) else { continue };
for downstream_node in downstream_nodes {
if let InputConnector::Node { node_id: downstream_id, .. } = downstream_node {
let downstream_node_output = OutputConnector::node(*downstream_id, 0);
if !delete_nodes.contains(downstream_id) {
can_delete = false;
break;

View file

@ -394,6 +394,7 @@ fn generate_line(tool_data: &mut LineToolData, snap_data: SnapData, lock_angle:
let near_point = SnapCandidatePoint::handle_neighbors(document_points[1], [tool_data.drag_start]);
let far_point = SnapCandidatePoint::handle_neighbors(2. * document_points[0] - document_points[1], [tool_data.drag_start]);
let mid_point = SnapCandidatePoint::handle_neighbors((tool_data.drag_start + document_points[1]) / 2., [tool_data.drag_start]);
let config = SnapTypeConfiguration::default();
if constrained {
@ -410,8 +411,15 @@ fn generate_line(tool_data: &mut LineToolData, snap_data: SnapData, lock_angle:
snap.update_indicator(best);
} else {
let snapped = snap.constrained_snap(&snap_data, &near_point, constraint, config);
document_points[1] = snapped.snapped_point_document;
snap.update_indicator(snapped);
let snapped_mid = snap.constrained_snap(&snap_data, &mid_point, constraint, config);
let best = if snap_data.document.snapping_state.path.line_midpoint && snapped_mid.other_snap_better(&snapped_mid) {
document_points[1] += (snapped_mid.snapped_point_document - mid_point.document_point) * 2.;
snapped_mid
} else {
document_points[1] = snapped.snapped_point_document;
snapped.clone()
};
snap.update_indicator(best);
}
} else if center {
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:
snap.update_indicator(best);
} else {
let snapped = snap.free_snap(&snap_data, &near_point, config);
document_points[1] = snapped.snapped_point_document;
snap.update_indicator(snapped);
let snapped_mid = snap.free_snap(&snap_data, &mid_point, config);
let best = if snap_data.document.snapping_state.path.line_midpoint && snapped_mid.other_snap_better(&snapped_mid) {
document_points[1] += (snapped_mid.snapped_point_document - mid_point.document_point) * 2.;
snapped_mid
} else {
document_points[1] = snapped.snapped_point_document;
snapped.clone()
};
snap.update_indicator(best);
}
// 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:
#[cfg(test)]
mod test_line_tool {
use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn;
use crate::{messages::tool::common_functionality::graph_modification_utils::NodeGraphLayer, test_utils::test_prelude::*};
use crate::messages::tool::common_functionality::graph_modification_utils::NodeGraphLayer;
use crate::test_utils::test_prelude::*;
use glam::DAffine2;
use graph_craft::document::value::TaggedValue;