@@ -709,4 +709,78 @@ mod test_gradient {
709709 positions
710710 ) ;
711711 }
712+
713+ #[ tokio:: test]
714+ async fn dragging_endpoint_sets_correct_point ( ) {
715+ let mut editor = EditorTestUtils :: create ( ) ;
716+ editor. new_document ( ) . await ;
717+
718+ editor. handle_message ( NavigationMessage :: CanvasZoomSet { zoom_factor : 2.0 } ) . await ;
719+
720+ editor. drag_tool ( ToolType :: Rectangle , -5. , -3. , 100. , 100. , ModifierKeys :: empty ( ) ) . await ;
721+
722+ let document = editor. active_document ( ) ;
723+ let selected_layer = document. network_interface . selected_nodes ( ) . selected_layers ( document. metadata ( ) ) . next ( ) . unwrap ( ) ;
724+ editor
725+ . handle_message ( GraphOperationMessage :: TransformSet {
726+ layer : selected_layer,
727+ transform : DAffine2 :: from_scale_angle_translation ( DVec2 :: new ( 1.5 , 0.8 ) , 0.3 , DVec2 :: new ( 10.0 , -5.0 ) ) ,
728+ transform_in : TransformIn :: Local ,
729+ skip_rerender : false ,
730+ } )
731+ . await ;
732+
733+ editor. select_primary_color ( Color :: GREEN ) . await ;
734+ editor. select_secondary_color ( Color :: BLUE ) . await ;
735+
736+ editor. drag_tool ( ToolType :: Gradient , 0. , 0. , 100. , 0. , ModifierKeys :: empty ( ) ) . await ;
737+
738+ // Get the initial gradient state (should have 2 stops)
739+ let initial_fills = get_fills ( & mut editor) . await ;
740+ assert_eq ! ( initial_fills. len( ) , 1 ) ;
741+ let ( initial_fill, transform) = initial_fills. first ( ) . unwrap ( ) ;
742+ let initial_gradient = initial_fill. as_gradient ( ) . unwrap ( ) ;
743+
744+ // Verify initial gradient endpoints in viewport space
745+ let initial_start = transform. transform_point2 ( initial_gradient. start ) ;
746+ let initial_end = transform. transform_point2 ( initial_gradient. end ) ;
747+ assert ! ( initial_start. abs_diff_eq( DVec2 :: new( 0. , 0. ) , 1e-10 ) ) ;
748+ assert ! ( initial_end. abs_diff_eq( DVec2 :: new( 100. , 0. ) , 1e-10 ) ) ;
749+
750+ editor. select_tool ( ToolType :: Gradient ) . await ;
751+
752+ // Simulate dragging the end point to a new position (100, 50)
753+ let start_pos = DVec2 :: new ( 100. , 0. ) ;
754+ let end_pos = DVec2 :: new ( 100. , 50. ) ;
755+
756+ editor. move_mouse ( start_pos. x , start_pos. y , ModifierKeys :: empty ( ) , MouseKeys :: empty ( ) ) . await ;
757+ editor. left_mousedown ( start_pos. x , start_pos. y , ModifierKeys :: empty ( ) ) . await ;
758+
759+ editor. move_mouse ( end_pos. x , end_pos. y , ModifierKeys :: empty ( ) , MouseKeys :: LEFT ) . await ;
760+
761+ editor
762+ . mouseup (
763+ EditorMouseState {
764+ editor_position : end_pos,
765+ mouse_keys : MouseKeys :: empty ( ) ,
766+ scroll_delta : ScrollDelta :: default ( ) ,
767+ } ,
768+ ModifierKeys :: empty ( ) ,
769+ )
770+ . await ;
771+
772+ // Check the updated gradient
773+ let updated_fills = get_fills ( & mut editor) . await ;
774+ assert_eq ! ( updated_fills. len( ) , 1 ) ;
775+ let ( updated_fill, transform) = updated_fills. first ( ) . unwrap ( ) ;
776+ let updated_gradient = updated_fill. as_gradient ( ) . unwrap ( ) ;
777+
778+ // Verify the start point hasn't changed
779+ let updated_start = transform. transform_point2 ( updated_gradient. start ) ;
780+ assert ! ( updated_start. abs_diff_eq( DVec2 :: new( 0. , 0. ) , 1e-10 ) ) ;
781+
782+ // Verify the end point has been updated to the new position
783+ let updated_end = transform. transform_point2 ( updated_gradient. end ) ;
784+ assert ! ( updated_end. abs_diff_eq( DVec2 :: new( 100. , 50. ) , 1e-10 ) , "Expected end point at (100, 50), got {:?}" , updated_end) ;
785+ }
712786}
0 commit comments