@@ -713,6 +713,7 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
713713
714714#[ cfg( test) ]
715715mod test_transform_layer {
716+ use crate :: messages:: portfolio:: document:: utility_types:: misc:: GroupFolderType ;
716717 use crate :: messages:: {
717718 portfolio:: document:: graph_operation:: {
718719 transform_utils,
@@ -1150,4 +1151,113 @@ mod test_transform_layer {
11501151 assert ! ( new_scale_x > 0.0 , "After rescaling, scale factor X should be non-zero" ) ;
11511152 assert ! ( new_scale_y > 0.0 , "After rescaling, scale factor Y should be non-zero" ) ;
11521153 }
1154+
1155+ #[ tokio:: test]
1156+ async fn test_transform_with_different_selections ( ) {
1157+ let mut editor = EditorTestUtils :: create ( ) ;
1158+ editor. new_document ( ) . await ;
1159+ editor. draw_rect ( 0. , 0. , 100. , 100. ) . await ;
1160+ editor. draw_rect ( 150. , 0. , 250. , 100. ) . await ;
1161+ editor. draw_rect ( 0. , 150. , 100. , 250. ) . await ;
1162+ editor. draw_rect ( 150. , 150. , 250. , 250. ) . await ;
1163+ let document = editor. active_document ( ) ;
1164+ let layers: Vec < LayerNodeIdentifier > = document. metadata ( ) . all_layers ( ) . collect ( ) ;
1165+
1166+ assert ! ( layers. len( ) == 4 ) ;
1167+
1168+ // Creating a group with two rectangles
1169+ editor
1170+ . handle_message ( NodeGraphMessage :: SelectedNodesSet {
1171+ nodes : vec ! [ layers[ 2 ] . to_node( ) , layers[ 3 ] . to_node( ) ] ,
1172+ } )
1173+ . await ;
1174+ editor
1175+ . handle_message ( DocumentMessage :: GroupSelectedLayers {
1176+ group_folder_type : GroupFolderType :: Layer ,
1177+ } )
1178+ . await ;
1179+
1180+ // Get the group layer (should be the newest layer)
1181+ let document = editor. active_document ( ) ;
1182+ let group_layer = document. metadata ( ) . all_layers ( ) . next ( ) . unwrap ( ) ;
1183+
1184+ // Test 1: Transform single layer
1185+ editor. handle_message ( NodeGraphMessage :: SelectedNodesSet { nodes : vec ! [ layers[ 0 ] . to_node( ) ] } ) . await ;
1186+ let original_transform = get_layer_transform ( & mut editor, layers[ 0 ] ) . await . unwrap ( ) ;
1187+ editor. handle_message ( TransformLayerMessage :: BeginGrab ) . await ;
1188+ editor. move_mouse ( 50.0 , 50.0 , ModifierKeys :: empty ( ) , MouseKeys :: NONE ) . await ;
1189+ editor
1190+ . handle_message ( TransformLayerMessage :: PointerMove {
1191+ slow_key : Key :: Shift ,
1192+ increments_key : Key :: Control ,
1193+ } )
1194+ . await ;
1195+ editor. handle_message ( TransformLayerMessage :: ApplyTransformOperation { final_transform : true } ) . await ;
1196+ let final_transform = get_layer_transform ( & mut editor, layers[ 0 ] ) . await . unwrap ( ) ;
1197+ assert ! ( !final_transform. abs_diff_eq( original_transform, 1e-5 ) , "Transform should change for single layer" ) ;
1198+
1199+ // Test 2: Transform multiple layers
1200+ editor
1201+ . handle_message ( NodeGraphMessage :: SelectedNodesSet {
1202+ nodes : vec ! [ layers[ 0 ] . to_node( ) , layers[ 1 ] . to_node( ) ] ,
1203+ } )
1204+ . await ;
1205+ let original_transform_1 = get_layer_transform ( & mut editor, layers[ 0 ] ) . await . unwrap ( ) ;
1206+ let original_transform_2 = get_layer_transform ( & mut editor, layers[ 1 ] ) . await . unwrap ( ) ;
1207+ editor. handle_message ( TransformLayerMessage :: BeginRotate ) . await ;
1208+ editor. move_mouse ( 200.0 , 50.0 , ModifierKeys :: empty ( ) , MouseKeys :: NONE ) . await ;
1209+ editor
1210+ . handle_message ( TransformLayerMessage :: PointerMove {
1211+ slow_key : Key :: Shift ,
1212+ increments_key : Key :: Control ,
1213+ } )
1214+ . await ;
1215+ editor. handle_message ( TransformLayerMessage :: ApplyTransformOperation { final_transform : true } ) . await ;
1216+ let final_transform_1 = get_layer_transform ( & mut editor, layers[ 0 ] ) . await . unwrap ( ) ;
1217+ let final_transform_2 = get_layer_transform ( & mut editor, layers[ 1 ] ) . await . unwrap ( ) ;
1218+ assert ! ( !final_transform_1. abs_diff_eq( original_transform_1, 1e-5 ) , "Transform should change for first layer in multi-selection" ) ;
1219+ assert ! (
1220+ !final_transform_2. abs_diff_eq( original_transform_2, 1e-5 ) ,
1221+ "Transform should change for second layer in multi-selection"
1222+ ) ;
1223+
1224+ // Test 3: Transform group
1225+ editor. handle_message ( NodeGraphMessage :: SelectedNodesSet { nodes : vec ! [ group_layer. to_node( ) ] } ) . await ;
1226+ let original_group_transform = get_layer_transform ( & mut editor, group_layer) . await . unwrap ( ) ;
1227+ editor. handle_message ( TransformLayerMessage :: BeginScale ) . await ;
1228+ editor. handle_message ( TransformLayerMessage :: TypeDigit { digit : 2 } ) . await ;
1229+ editor. handle_message ( TransformLayerMessage :: ApplyTransformOperation { final_transform : true } ) . await ;
1230+ let final_group_transform = get_layer_transform ( & mut editor, group_layer) . await . unwrap ( ) ;
1231+ assert ! ( !final_group_transform. abs_diff_eq( original_group_transform, 1e-5 ) , "Transform should change for group" ) ;
1232+
1233+ // Test 4: Transform layers inside transformed group
1234+ let child_layer_id = {
1235+ let mut document = editor. active_document_mut ( ) ;
1236+ let group_children = document. network_interface . downstream_layers ( & group_layer. to_node ( ) , & [ ] ) ;
1237+ if !group_children. is_empty ( ) {
1238+ Some ( LayerNodeIdentifier :: new ( group_children[ 0 ] , & document. network_interface , & [ ] ) )
1239+ } else {
1240+ None
1241+ }
1242+ } ;
1243+ assert ! ( child_layer_id. is_some( ) , "Group should have child layers" ) ;
1244+ let child_layer_id = child_layer_id. unwrap ( ) ;
1245+ editor
1246+ . handle_message ( NodeGraphMessage :: SelectedNodesSet {
1247+ nodes : vec ! [ child_layer_id. to_node( ) ] ,
1248+ } )
1249+ . await ;
1250+ let original_child_transform = get_layer_transform ( & mut editor, child_layer_id) . await . unwrap ( ) ;
1251+ editor. handle_message ( TransformLayerMessage :: BeginGrab ) . await ;
1252+ editor. move_mouse ( 30.0 , 30.0 , ModifierKeys :: empty ( ) , MouseKeys :: NONE ) . await ;
1253+ editor
1254+ . handle_message ( TransformLayerMessage :: PointerMove {
1255+ slow_key : Key :: Shift ,
1256+ increments_key : Key :: Control ,
1257+ } )
1258+ . await ;
1259+ editor. handle_message ( TransformLayerMessage :: ApplyTransformOperation { final_transform : true } ) . await ;
1260+ let final_child_transform = get_layer_transform ( & mut editor, child_layer_id) . await . unwrap ( ) ;
1261+ assert ! ( !final_child_transform. abs_diff_eq( original_child_transform, 1e-5 ) , "Child layer inside transformed group should change" ) ;
1262+ }
11531263}
0 commit comments