@@ -709,4 +709,78 @@ mod test_gradient {
709
709
positions
710
710
) ;
711
711
}
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
+ }
712
786
}
0 commit comments