Skip to content

Commit 83000b8

Browse files
fix line drawing when artboard have offset
1 parent fa45efa commit 83000b8

File tree

1 file changed

+23
-16
lines changed
  • editor/src/messages/tool/common_functionality/shapes

1 file changed

+23
-16
lines changed

editor/src/messages/tool/common_functionality/shapes/line_shape.rs

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use super::shape_utility::ShapeToolModifierKey;
22
use crate::consts::{BOUNDS_SELECT_THRESHOLD, LINE_ROTATE_SNAP_ANGLE};
3+
use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn;
34
use crate::messages::portfolio::document::node_graph::document_node_definitions::resolve_document_node_type;
45
use crate::messages::portfolio::document::overlays::utility_types::OverlayContext;
56
use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier;
@@ -36,12 +37,12 @@ pub struct LineToolData {
3637
pub struct Line;
3738

3839
impl Line {
39-
pub fn create_node(document: &DocumentMessageHandler, drag_start: DVec2) -> NodeTemplate {
40+
pub fn create_node(_document: &DocumentMessageHandler, _drag_start: DVec2) -> NodeTemplate {
4041
let node_type = resolve_document_node_type("Line").expect("Line node can't be found");
4142
node_type.node_template_input_override([
4243
None,
43-
Some(NodeInput::value(TaggedValue::DVec2(document.metadata().document_to_viewport.transform_point2(drag_start)), false)),
44-
Some(NodeInput::value(TaggedValue::DVec2(document.metadata().document_to_viewport.transform_point2(drag_start)), false)),
44+
Some(NodeInput::value(TaggedValue::DVec2(DVec2::ZERO), false)),
45+
Some(NodeInput::value(TaggedValue::DVec2(DVec2::ZERO), false)),
4546
])
4647
}
4748

@@ -67,17 +68,27 @@ impl Line {
6768
document_points.swap(0, 1);
6869
}
6970

71+
let viewport_points = document_points.map(|point| document.metadata().document_to_viewport.transform_point2(point));
72+
let midpoint = viewport_points[0].midpoint(viewport_points[1]);
73+
7074
let Some(node_id) = graph_modification_utils::get_line_id(layer, &document.network_interface) else {
7175
return;
7276
};
7377

78+
responses.add(GraphOperationMessage::TransformSet {
79+
layer,
80+
transform: DAffine2::from_translation(midpoint),
81+
transform_in: TransformIn::Viewport,
82+
skip_rerender: true,
83+
});
84+
7485
responses.add(NodeGraphMessage::SetInput {
7586
input_connector: InputConnector::node(node_id, 1),
76-
input: NodeInput::value(TaggedValue::DVec2(document_points[0]), false),
87+
input: NodeInput::value(TaggedValue::DVec2(viewport_points[0] - midpoint), false),
7788
});
7889
responses.add(NodeGraphMessage::SetInput {
7990
input_connector: InputConnector::node(node_id, 2),
80-
input: NodeInput::value(TaggedValue::DVec2(document_points[1]), false),
91+
input: NodeInput::value(TaggedValue::DVec2(viewport_points[1] - midpoint), false),
8192
});
8293
responses.add(NodeGraphMessage::RunDocumentGraph);
8394
}
@@ -193,7 +204,7 @@ pub fn clicked_on_line_endpoints(layer: LayerNodeIdentifier, document: &Document
193204

194205
if start_click || end_click {
195206
shape_tool_data.line_data.dragging_endpoint = Some(if end_click { LineEnd::End } else { LineEnd::Start });
196-
shape_tool_data.data.drag_start = if end_click { document_start } else { document_end };
207+
shape_tool_data.data.drag_start = document.metadata().transform_to_document(layer).transform_point2(if end_click { document_start } else { document_end });
197208
shape_tool_data.line_data.editing_layer = Some(layer);
198209
return true;
199210
}
@@ -231,12 +242,8 @@ mod test_line_tool {
231242
editor.new_document().await;
232243
editor.drag_tool(ToolType::Line, 0., 0., 100., 100., ModifierKeys::empty()).await;
233244
if let Some((start_input, end_input)) = get_line_node_inputs(&mut editor).await {
234-
match (start_input, end_input) {
235-
(start_input, end_input) => {
236-
assert!((start_input - DVec2::ZERO).length() < 1., "Start point should be near (0,0)");
237-
assert!((end_input - DVec2::new(100., 100.)).length() < 1., "End point should be near (100,100)");
238-
}
239-
}
245+
assert!((start_input - DVec2::new(-50., -50.)).length() < 1., "Start point should be near (-50, -50)");
246+
assert!((end_input - DVec2::new(50., 50.)).length() < 1., "End point should be near (50, 50)");
240247
}
241248
}
242249

@@ -253,16 +260,16 @@ mod test_line_tool {
253260
let document_to_viewport = document.metadata().document_to_viewport;
254261
let viewport_to_document = document_to_viewport.inverse();
255262

256-
let expected_start = viewport_to_document.transform_point2(DVec2::ZERO);
257-
let expected_end = viewport_to_document.transform_point2(DVec2::new(100., 100.));
263+
let expected_start = DVec2::new(-50., -50.);
264+
let expected_end = DVec2::new(50., 50.);
258265

259266
assert!(
260267
(start_input - expected_start).length() < 1.,
261-
"Start point should match expected document coordinates. Got {start_input:?}, expected {expected_start:?}"
268+
"Start point should match expected viewport coordinates. Got {start_input:?}, expected {expected_start:?}"
262269
);
263270
assert!(
264271
(end_input - expected_end).length() < 1.,
265-
"End point should match expected document coordinates. Got {end_input:?}, expected {expected_end:?}"
272+
"End point should match expected viewport coordinates. Got {end_input:?}, expected {expected_end:?}"
266273
);
267274
} else {
268275
panic!("Line was not created successfully with transformed viewport");

0 commit comments

Comments
 (0)