Skip to content

Commit cb81839

Browse files
committed
Merge branch 'master' into deep-select-fix
2 parents 61b898c + ca5810c commit cb81839

File tree

6 files changed

+41
-51
lines changed

6 files changed

+41
-51
lines changed

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

+24-27
Original file line numberDiff line numberDiff line change
@@ -42,73 +42,70 @@ impl Resize {
4242
self.layer.take();
4343
return None;
4444
}
45-
Some(self.calculate_points_ignore_layer(document, input, center, lock_ratio))
45+
Some(self.calculate_points_ignore_layer(document, input, center, lock_ratio, false))
4646
}
4747

4848
/// Compute the drag start and end based on the current mouse position. Ignores the state of the layer.
4949
/// If you want to only draw whilst a layer exists, use [`Resize::calculate_points`].
50-
pub fn calculate_points_ignore_layer(&mut self, document: &DocumentMessageHandler, input: &InputPreprocessorMessageHandler, center: Key, lock_ratio: Key) -> [DVec2; 2] {
51-
let start = self.drag_start;
50+
pub fn calculate_points_ignore_layer(&mut self, document: &DocumentMessageHandler, input: &InputPreprocessorMessageHandler, center: Key, lock_ratio: Key, in_document: bool) -> [DVec2; 2] {
51+
let start = self.viewport_drag_start(document);
5252
let mouse = input.mouse.position;
5353
let document_to_viewport = document.navigation_handler.calculate_offset_transform(input.viewport_bounds.center(), &document.document_ptz);
5454
let document_mouse = document_to_viewport.inverse().transform_point2(mouse);
55-
let mut document_points = [start, document_mouse];
56-
55+
let mut points_viewport = [start, mouse];
5756
let ignore = if let Some(layer) = self.layer { vec![layer] } else { vec![] };
5857
let ratio = input.keyboard.get(lock_ratio as usize);
5958
let center = input.keyboard.get(center as usize);
60-
6159
let snap_data = SnapData::ignore(document, input, &ignore);
6260
let config = SnapTypeConfiguration::default();
6361
if ratio {
64-
let size = document_points[1] - document_points[0];
65-
let size = size.abs().max(size.abs().yx()) * size.signum();
66-
document_points[1] = document_points[0] + size;
67-
let end = document_points[1];
62+
let viewport_size = points_viewport[1] - points_viewport[0];
63+
let raw_size = if in_document { document_to_viewport.inverse() } else { DAffine2::IDENTITY }.transform_vector2(viewport_size);
64+
let adjusted_size = raw_size.abs().max(raw_size.abs().yx()) * raw_size.signum();
65+
let size = if in_document { document_to_viewport.transform_vector2(adjusted_size) } else { adjusted_size };
66+
points_viewport[1] = points_viewport[0] + size;
67+
68+
let end_document = document_to_viewport.inverse().transform_point2(points_viewport[1]);
6869
let constraint = SnapConstraint::Line {
6970
origin: self.drag_start,
70-
direction: end - self.drag_start,
71+
direction: end_document - self.drag_start,
7172
};
7273
if center {
73-
let snapped = self.snap_manager.constrained_snap(&snap_data, &SnapCandidatePoint::handle(end), constraint, config);
74-
let far = SnapCandidatePoint::handle(2. * self.drag_start - end);
74+
let snapped = self.snap_manager.constrained_snap(&snap_data, &SnapCandidatePoint::handle(end_document), constraint, config);
75+
let far = SnapCandidatePoint::handle(2. * self.drag_start - end_document);
7576
let snapped_far = self.snap_manager.constrained_snap(&snap_data, &far, constraint, config);
7677
let best = if snapped_far.other_snap_better(&snapped) { snapped } else { snapped_far };
77-
document_points[0] = best.snapped_point_document;
78-
document_points[1] = self.drag_start * 2. - best.snapped_point_document;
78+
points_viewport[0] = document_to_viewport.transform_point2(best.snapped_point_document);
79+
points_viewport[1] = document_to_viewport.transform_point2(self.drag_start * 2. - best.snapped_point_document);
7980
self.snap_manager.update_indicator(best);
8081
} else {
81-
let snapped = self.snap_manager.constrained_snap(&snap_data, &SnapCandidatePoint::handle(end), constraint, config);
82-
document_points[1] = snapped.snapped_point_document;
82+
let snapped = self.snap_manager.constrained_snap(&snap_data, &SnapCandidatePoint::handle(end_document), constraint, config);
83+
points_viewport[1] = document_to_viewport.transform_point2(snapped.snapped_point_document);
8384
self.snap_manager.update_indicator(snapped);
8485
}
8586
} else if center {
8687
let snapped = self.snap_manager.free_snap(&snap_data, &SnapCandidatePoint::handle(document_mouse), config);
8788
let opposite = 2. * self.drag_start - document_mouse;
8889
let snapped_far = self.snap_manager.free_snap(&snap_data, &SnapCandidatePoint::handle(opposite), config);
8990
let best = if snapped_far.other_snap_better(&snapped) { snapped } else { snapped_far };
90-
document_points[0] = best.snapped_point_document;
91-
document_points[1] = self.drag_start * 2. - best.snapped_point_document;
91+
points_viewport[0] = document_to_viewport.transform_point2(best.snapped_point_document);
92+
points_viewport[1] = document_to_viewport.transform_point2(self.drag_start * 2. - best.snapped_point_document);
9293
self.snap_manager.update_indicator(best);
9394
} else {
9495
let snapped = self.snap_manager.free_snap(&snap_data, &SnapCandidatePoint::handle(document_mouse), config);
95-
document_points[1] = snapped.snapped_point_document;
96+
points_viewport[1] = document_to_viewport.transform_point2(snapped.snapped_point_document);
9697
self.snap_manager.update_indicator(snapped);
9798
}
9899

99-
document_points
100+
points_viewport
100101
}
101102

102103
pub fn calculate_transform(&mut self, document: &DocumentMessageHandler, input: &InputPreprocessorMessageHandler, center: Key, lock_ratio: Key, skip_rerender: bool) -> Option<Message> {
103-
let viewport_points = self.calculate_points(document, input, center, lock_ratio).map(|points| {
104-
let document_to_viewport = document.metadata().document_to_viewport;
105-
[document_to_viewport.transform_point2(points[0]), document_to_viewport.transform_point2(points[1])]
106-
})?;
107-
104+
let points_viewport = self.calculate_points(document, input, center, lock_ratio)?;
108105
Some(
109106
GraphOperationMessage::TransformSet {
110107
layer: self.layer?,
111-
transform: DAffine2::from_scale_angle_translation(viewport_points[1] - viewport_points[0], 0., viewport_points[0]),
108+
transform: DAffine2::from_scale_angle_translation(points_viewport[1] - points_viewport[0], 0., points_viewport[0]),
112109
transform_in: TransformIn::Viewport,
113110
skip_rerender,
114111
}

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,9 @@ impl Fsm for ArtboardToolFsmState {
316316
ArtboardToolFsmState::Dragging
317317
}
318318
(ArtboardToolFsmState::Drawing, ArtboardToolMessage::PointerMove { constrain_axis_or_aspect, center }) => {
319-
let [start, end] = tool_data.draw.calculate_points_ignore_layer(document, input, center, constrain_axis_or_aspect);
319+
let [start, end] = tool_data.draw.calculate_points_ignore_layer(document, input, center, constrain_axis_or_aspect, true);
320+
let viewport_to_document = document.metadata().document_to_viewport.inverse();
321+
let [start, end] = [start, end].map(|point| viewport_to_document.transform_point2(point));
320322
if let Some(artboard) = tool_data.selected_artboard {
321323
assert_ne!(artboard, LayerNodeIdentifier::ROOT_PARENT, "Selected artboard cannot be ROOT_PARENT");
322324

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

+11-18
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ impl Fsm for EllipseToolFsmState {
236236
responses.add(GraphOperationMessage::TransformSet {
237237
layer,
238238
transform: DAffine2::from_translation((start + end) / 2.),
239-
transform_in: TransformIn::Local,
239+
transform_in: TransformIn::Viewport,
240240
skip_rerender: false,
241241
});
242242
}
@@ -400,17 +400,14 @@ mod test_ellipse {
400400
let ellipse = get_ellipse(&mut editor).await;
401401
assert_eq!(ellipse.len(), 1);
402402
println!("{ellipse:?}");
403-
// TODO: re-enable after https://github.com/GraphiteEditor/Graphite/issues/2370
404-
// assert_eq!(ellipse[0].radius_x, 5.);
405-
// assert_eq!(ellipse[0].radius_y, 5.);
403+
assert_eq!(ellipse[0].radius_x, 5.);
404+
assert_eq!(ellipse[0].radius_y, 5.);
406405

407-
// assert!(ellipse[0]
408-
// .transform
409-
// .abs_diff_eq(DAffine2::from_angle_translation(-f64::consts::FRAC_PI_4, DVec2::X * f64::consts::FRAC_1_SQRT_2 * 10.), 0.001));
410-
411-
float_eq!(ellipse[0].radius_x, 11. / core::f64::consts::SQRT_2 / 2.);
412-
float_eq!(ellipse[0].radius_y, 11. / core::f64::consts::SQRT_2 / 2.);
413-
assert!(ellipse[0].transform.abs_diff_eq(DAffine2::from_translation(DVec2::splat(11. / core::f64::consts::SQRT_2 / 2.)), 0.001));
406+
assert!(
407+
ellipse[0]
408+
.transform
409+
.abs_diff_eq(DAffine2::from_angle_translation(-f64::consts::FRAC_PI_4, DVec2::X * f64::consts::FRAC_1_SQRT_2 * 10.), 0.001)
410+
);
414411
}
415412

416413
#[tokio::test]
@@ -427,13 +424,9 @@ mod test_ellipse {
427424

428425
let ellipse = get_ellipse(&mut editor).await;
429426
assert_eq!(ellipse.len(), 1);
430-
// TODO: re-enable after https://github.com/GraphiteEditor/Graphite/issues/2370
431-
// assert_eq!(ellipse[0].radius_x, 10.);
432-
// assert_eq!(ellipse[0].radius_y, 10.);
433-
// assert!(ellipse[0].transform.abs_diff_eq(DAffine2::from_angle(-f64::consts::FRAC_PI_4), 0.001));
434-
float_eq!(ellipse[0].radius_x, 11. / core::f64::consts::SQRT_2);
435-
float_eq!(ellipse[0].radius_y, 11. / core::f64::consts::SQRT_2);
436-
assert!(ellipse[0].transform.abs_diff_eq(DAffine2::IDENTITY, 0.001));
427+
assert_eq!(ellipse[0].radius_x, 10.);
428+
assert_eq!(ellipse[0].radius_y, 10.);
429+
assert!(ellipse[0].transform.abs_diff_eq(DAffine2::from_angle(-f64::consts::FRAC_PI_4), 0.001));
437430
}
438431

439432
#[tokio::test]

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ impl Fsm for PolygonToolFsmState {
325325
responses.add(GraphOperationMessage::TransformSet {
326326
layer,
327327
transform: DAffine2::from_scale_angle_translation(scale, 0., (start + end) / 2.),
328-
transform_in: TransformIn::Local,
328+
transform_in: TransformIn::Viewport,
329329
skip_rerender: false,
330330
});
331331
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ impl Fsm for RectangleToolFsmState {
241241
responses.add(GraphOperationMessage::TransformSet {
242242
layer,
243243
transform: DAffine2::from_translation((start + end) / 2.),
244-
transform_in: TransformIn::Local,
244+
transform_in: TransformIn::Viewport,
245245
skip_rerender: false,
246246
});
247247
}

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

+1-3
Original file line numberDiff line numberDiff line change
@@ -593,9 +593,7 @@ impl Fsm for TextToolFsmState {
593593
TextToolFsmState::Ready
594594
}
595595
(Self::Placing | TextToolFsmState::Dragging, TextToolMessage::PointerMove { center, lock_ratio }) => {
596-
let document_points = tool_data.resize.calculate_points_ignore_layer(document, input, center, lock_ratio);
597-
let document_to_viewport = document.metadata().document_to_viewport;
598-
tool_data.cached_resize_bounds = [document_to_viewport.transform_point2(document_points[0]), document_to_viewport.transform_point2(document_points[1])];
596+
tool_data.cached_resize_bounds = tool_data.resize.calculate_points_ignore_layer(document, input, center, lock_ratio, false);
599597

600598
responses.add(OverlaysMessage::Draw);
601599

0 commit comments

Comments
 (0)