11use super :: shape_utility:: ShapeToolModifierKey ;
22use crate :: consts:: { BOUNDS_SELECT_THRESHOLD , LINE_ROTATE_SNAP_ANGLE } ;
3+ use crate :: messages:: portfolio:: document:: graph_operation:: utility_types:: TransformIn ;
34use crate :: messages:: portfolio:: document:: node_graph:: document_node_definitions:: resolve_document_node_type;
45use crate :: messages:: portfolio:: document:: overlays:: utility_types:: OverlayContext ;
56use crate :: messages:: portfolio:: document:: utility_types:: document_metadata:: LayerNodeIdentifier ;
@@ -36,12 +37,12 @@ pub struct LineToolData {
3637pub struct Line ;
3738
3839impl 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