Skip to content

Commit f003d5d

Browse files
mTvare6Keavon
andauthored
Fix Line/Spline tools being offset when drawing in an artboard not at the origin (#2489)
* Fix line overlays not showing up for horizontal/vertical line * Fix spline tool transform * Fix line tool transform * Fix pivot following mouse even after confirm * cargo fmt --------- Co-authored-by: Keavon Chambers <keavon@keavon.com>
1 parent 2f22ce5 commit f003d5d

File tree

3 files changed

+19
-5
lines changed

3 files changed

+19
-5
lines changed

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

+11-3
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,9 @@ enum LineEnd {
151151

152152
#[derive(Clone, Debug, Default)]
153153
struct LineToolData {
154+
drag_begin: DVec2,
155+
drag_start_shifted: DVec2,
156+
drag_current_shifted: DVec2,
154157
drag_start: DVec2,
155158
drag_current: DVec2,
156159
angle: f64,
@@ -188,7 +191,7 @@ impl Fsm for LineToolFsmState {
188191
};
189192

190193
let [viewport_start, viewport_end] = [start, end].map(|point| document.metadata().transform_to_viewport(layer).transform_point2(point));
191-
if (start.x - end.x).abs() > f64::EPSILON * 1000. && (start.y - end.y).abs() > f64::EPSILON * 1000. {
194+
if !start.abs_diff_eq(end, f64::EPSILON * 1000.) {
192195
overlay_context.line(viewport_start, viewport_end, None, None);
193196
overlay_context.square(viewport_start, Some(6.), None, None);
194197
overlay_context.square(viewport_end, Some(6.), None, None);
@@ -204,6 +207,7 @@ impl Fsm for LineToolFsmState {
204207
let point = SnapCandidatePoint::handle(document.metadata().document_to_viewport.inverse().transform_point2(input.mouse.position));
205208
let snapped = tool_data.snap_manager.free_snap(&SnapData::new(document, input), &point, SnapTypeConfiguration::default());
206209
tool_data.drag_start = snapped.snapped_point_document;
210+
tool_data.drag_begin = document.metadata().document_to_viewport.transform_point2(tool_data.drag_start);
207211

208212
responses.add(DocumentMessage::StartTransaction);
209213

@@ -256,7 +260,9 @@ impl Fsm for LineToolFsmState {
256260
(LineToolFsmState::Drawing, LineToolMessage::PointerMove { center, snap_angle, lock_angle }) => {
257261
let Some(layer) = tool_data.editing_layer else { return LineToolFsmState::Ready };
258262

259-
tool_data.drag_current = document.metadata().transform_to_viewport(layer).inverse().transform_point2(input.mouse.position);
263+
tool_data.drag_current_shifted = document.metadata().transform_to_viewport(layer).inverse().transform_point2(input.mouse.position);
264+
tool_data.drag_current = document.metadata().document_to_viewport.inverse().transform_point2(input.mouse.position);
265+
tool_data.drag_start_shifted = document.metadata().transform_to_viewport(layer).inverse().transform_point2(tool_data.drag_begin);
260266

261267
let keyboard = &input.keyboard;
262268
let ignore = vec![layer];
@@ -361,6 +367,7 @@ impl Fsm for LineToolFsmState {
361367
}
362368

363369
fn generate_line(tool_data: &mut LineToolData, snap_data: SnapData, lock_angle: bool, snap_angle: bool, center: bool) -> [DVec2; 2] {
370+
let shift = tool_data.drag_current_shifted - tool_data.drag_current;
364371
let mut document_points = [tool_data.drag_start, tool_data.drag_current];
365372

366373
let mut angle = -(document_points[1] - document_points[0]).angle_to(DVec2::X);
@@ -419,7 +426,8 @@ fn generate_line(tool_data: &mut LineToolData, snap_data: SnapData, lock_angle:
419426
snap.update_indicator(snapped);
420427
}
421428

422-
document_points
429+
// Snapping happens in other space, while document graph renders in another.
430+
document_points.map(|vector| vector + shift)
423431
}
424432

425433
#[cfg(test)]

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

+5-1
Original file line numberDiff line numberDiff line change
@@ -1326,7 +1326,11 @@ impl Fsm for SelectToolFsmState {
13261326
SelectToolFsmState::Ready { selection }
13271327
}
13281328
(
1329-
SelectToolFsmState::ResizingBounds | SelectToolFsmState::SkewingBounds { .. } | SelectToolFsmState::RotatingBounds | SelectToolFsmState::Dragging { .. },
1329+
SelectToolFsmState::ResizingBounds
1330+
| SelectToolFsmState::SkewingBounds { .. }
1331+
| SelectToolFsmState::RotatingBounds
1332+
| SelectToolFsmState::Dragging { .. }
1333+
| SelectToolFsmState::DraggingPivot,
13301334
SelectToolMessage::DragStop { .. } | SelectToolMessage::Enter,
13311335
) => {
13321336
let drag_too_small = input.mouse.position.distance(tool_data.drag_start) < 10. * f64::EPSILON;

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,9 @@ impl SplineToolData {
227227

228228
/// Get the snapped point while ignoring current layer
229229
fn snapped_point(&mut self, document: &DocumentMessageHandler, input: &InputPreprocessorMessageHandler) -> SnappedPoint {
230-
let point = SnapCandidatePoint::handle(document.metadata().document_to_viewport.inverse().transform_point2(input.mouse.position));
230+
let metadata = document.metadata();
231+
let transform = self.current_layer.map_or(metadata.document_to_viewport, |layer| metadata.transform_to_viewport(layer));
232+
let point = SnapCandidatePoint::handle(transform.inverse().transform_point2(input.mouse.position));
231233
let ignore = if let Some(layer) = self.current_layer { vec![layer] } else { vec![] };
232234
let snap_data = SnapData::ignore(document, input, &ignore);
233235
self.snap_manager.free_snap(&snap_data, &point, SnapTypeConfiguration::default())

0 commit comments

Comments
 (0)