@@ -705,7 +705,7 @@ mod test_transform_layer {
705705 use crate :: messages:: portfolio:: document:: graph_operation:: transform_utils;
706706 use crate :: test_utils:: test_prelude:: * ;
707707 // Use ModifyInputsContext to locate the transform node
708- use crate :: messages:: portfolio:: document:: graph_operation:: utility_types:: ModifyInputsContext ;
708+ use crate :: messages:: portfolio:: document:: graph_operation:: utility_types:: { ModifyInputsContext , TransformIn } ;
709709 use crate :: messages:: prelude:: Message ;
710710 use glam:: DAffine2 ;
711711 use std:: collections:: VecDeque ;
@@ -982,4 +982,86 @@ mod test_transform_layer {
982982 assert ! ( final_transform. abs_diff_eq( after_scale_transform, 1e-5 ) , "Final transform should match the transform before committing" ) ;
983983 assert ! ( !final_transform. abs_diff_eq( original_transform, 1e-5 ) , "Final transform should be different from original transform" ) ;
984984 }
985+
986+ #[ tokio:: test]
987+ async fn test_scale_with_panned_view ( ) {
988+ let mut editor = EditorTestUtils :: create ( ) ;
989+ editor. new_document ( ) . await ;
990+ editor. drag_tool ( ToolType :: Rectangle , 0. , 0. , 100. , 100. , ModifierKeys :: empty ( ) ) . await ;
991+ let document = editor. active_document ( ) ;
992+ let layer = document. metadata ( ) . all_layers ( ) . next ( ) . unwrap ( ) ;
993+
994+ let original_transform = get_layer_transform ( & mut editor, layer) . await . unwrap ( ) ;
995+
996+ let pan_amount = DVec2 :: new ( 200.0 , 150.0 ) ;
997+ editor. handle_message ( NavigationMessage :: CanvasPan { delta : pan_amount } ) . await ;
998+
999+ editor. handle_message ( TransformLayerMessage :: BeginScale ) . await ;
1000+ editor. handle_message ( TransformLayerMessage :: TypeDigit { digit : 2 } ) . await ;
1001+ editor. handle_message ( TransformLayerMessage :: ApplyTransformOperation { final_transform : true } ) . await ;
1002+
1003+ let final_transform = get_layer_transform ( & mut editor, layer) . await . unwrap ( ) ;
1004+
1005+ let scale_x = final_transform. matrix2 . x_axis . length ( ) / original_transform. matrix2 . x_axis . length ( ) ;
1006+ let scale_y = final_transform. matrix2 . y_axis . length ( ) / original_transform. matrix2 . y_axis . length ( ) ;
1007+
1008+ assert ! ( ( scale_x - 2.0 ) . abs( ) < 0.1 , "Expected scale factor X of 2.0, got: {}" , scale_x) ;
1009+ assert ! ( ( scale_y - 2.0 ) . abs( ) < 0.1 , "Expected scale factor Y of 2.0, got: {}" , scale_y) ;
1010+ }
1011+
1012+ #[ tokio:: test]
1013+ async fn test_scale_with_zoomed_view ( ) {
1014+ let mut editor = EditorTestUtils :: create ( ) ;
1015+ editor. new_document ( ) . await ;
1016+ editor. drag_tool ( ToolType :: Rectangle , 0. , 0. , 100. , 100. , ModifierKeys :: empty ( ) ) . await ;
1017+ let document = editor. active_document ( ) ;
1018+ let layer = document. metadata ( ) . all_layers ( ) . next ( ) . unwrap ( ) ;
1019+
1020+ let original_transform = get_layer_transform ( & mut editor, layer) . await . unwrap ( ) ;
1021+
1022+ editor. handle_message ( NavigationMessage :: CanvasZoomIncrease { center_on_mouse : false } ) . await ;
1023+ editor. handle_message ( NavigationMessage :: CanvasZoomIncrease { center_on_mouse : false } ) . await ;
1024+
1025+ editor. handle_message ( TransformLayerMessage :: BeginScale ) . await ;
1026+ editor. handle_message ( TransformLayerMessage :: TypeDigit { digit : 2 } ) . await ;
1027+ editor. handle_message ( TransformLayerMessage :: ApplyTransformOperation { final_transform : true } ) . await ;
1028+
1029+ let final_transform = get_layer_transform ( & mut editor, layer) . await . unwrap ( ) ;
1030+
1031+ let scale_x = final_transform. matrix2 . x_axis . length ( ) / original_transform. matrix2 . x_axis . length ( ) ;
1032+ let scale_y = final_transform. matrix2 . y_axis . length ( ) / original_transform. matrix2 . y_axis . length ( ) ;
1033+
1034+ assert ! ( ( scale_x - 2.0 ) . abs( ) < 0.1 , "Expected scale factor X of 2.0, got: {}" , scale_x) ;
1035+ assert ! ( ( scale_y - 2.0 ) . abs( ) < 0.1 , "Expected scale factor Y of 2.0, got: {}" , scale_y) ;
1036+ }
1037+
1038+ #[ tokio:: test]
1039+ async fn test_rotate_with_rotated_view ( ) {
1040+ let mut editor = EditorTestUtils :: create ( ) ;
1041+ editor. new_document ( ) . await ;
1042+ editor. drag_tool ( ToolType :: Rectangle , 0. , 0. , 100. , 100. , ModifierKeys :: empty ( ) ) . await ;
1043+ let document = editor. active_document ( ) ;
1044+ let layer = document. metadata ( ) . all_layers ( ) . next ( ) . unwrap ( ) ;
1045+
1046+ let original_transform = get_layer_transform ( & mut editor, layer) . await . unwrap ( ) ;
1047+
1048+ // Rotate the document view (45 degrees)
1049+ editor. handle_message ( NavigationMessage :: BeginCanvasTilt { was_dispatched_from_menu : false } ) . await ;
1050+ editor. handle_message ( NavigationMessage :: CanvasTiltSet { angle_radians : 45.0_f64 . to_radians ( ) } ) . await ;
1051+ editor. handle_message ( TransformLayerMessage :: BeginRotate ) . await ;
1052+
1053+ editor. handle_message ( TransformLayerMessage :: TypeDigit { digit : 9 } ) . await ;
1054+ editor. handle_message ( TransformLayerMessage :: TypeDigit { digit : 0 } ) . await ;
1055+ editor. handle_message ( TransformLayerMessage :: ApplyTransformOperation { final_transform : true } ) . await ;
1056+
1057+ let final_transform = get_layer_transform ( & mut editor, layer) . await . unwrap ( ) ;
1058+
1059+ let original_angle = original_transform. to_scale_angle_translation ( ) . 1 ;
1060+ let final_angle = final_transform. to_scale_angle_translation ( ) . 1 ;
1061+ let angle_change = ( final_angle - original_angle) . to_degrees ( ) ;
1062+
1063+ // Normalize angle between 0 and 360
1064+ let angle_change = ( ( angle_change % 360.0 ) + 360.0 ) % 360.0 ;
1065+ assert ! ( ( angle_change - 90.0 ) . abs( ) < 0.1 , "Expected rotation of 90 degrees, got: {}" , angle_change) ;
1066+ }
9851067}
0 commit comments