@@ -2707,3 +2707,82 @@ impl Iterator for ClickXRayIter<'_> {
2707
2707
None
2708
2708
}
2709
2709
}
2710
+
2711
+ #[ cfg( test) ]
2712
+ mod document_message_handler_tests {
2713
+ use super :: * ;
2714
+ use crate :: test_utils:: test_prelude:: * ;
2715
+
2716
+ #[ tokio:: test]
2717
+ async fn test_layer_selection_with_shift_and_ctrl ( ) {
2718
+ let mut editor = EditorTestUtils :: create ( ) ;
2719
+ editor. new_document ( ) . await ;
2720
+ // Three rectangle layers
2721
+ editor. drag_tool ( ToolType :: Rectangle , 0. , 0. , 100. , 100. , ModifierKeys :: empty ( ) ) . await ;
2722
+ editor. drag_tool ( ToolType :: Rectangle , 50. , 50. , 150. , 150. , ModifierKeys :: empty ( ) ) . await ;
2723
+ editor. drag_tool ( ToolType :: Rectangle , 100. , 100. , 200. , 200. , ModifierKeys :: empty ( ) ) . await ;
2724
+
2725
+ let layers: Vec < _ > = editor. active_document ( ) . metadata ( ) . all_layers ( ) . collect ( ) ;
2726
+
2727
+ // Case 1: Basic selection (no modifier)
2728
+ editor
2729
+ . handle_message ( DocumentMessage :: SelectLayer {
2730
+ id : layers[ 0 ] . to_node ( ) ,
2731
+ ctrl : false ,
2732
+ shift : false ,
2733
+ } )
2734
+ . await ;
2735
+ // Fresh document reference for verification
2736
+ let document = editor. active_document ( ) ;
2737
+ let selected_nodes = document. network_interface . selected_nodes ( ) ;
2738
+ assert_eq ! ( selected_nodes. selected_nodes_ref( ) . len( ) , 1 ) ;
2739
+ assert ! ( selected_nodes. selected_layers_contains( layers[ 0 ] , document. metadata( ) ) ) ;
2740
+
2741
+ // Case 2: Ctrl + click to add another layer
2742
+ editor
2743
+ . handle_message ( DocumentMessage :: SelectLayer {
2744
+ id : layers[ 2 ] . to_node ( ) ,
2745
+ ctrl : true ,
2746
+ shift : false ,
2747
+ } )
2748
+ . await ;
2749
+ let document = editor. active_document ( ) ;
2750
+ let selected_nodes = document. network_interface . selected_nodes ( ) ;
2751
+ assert_eq ! ( selected_nodes. selected_nodes_ref( ) . len( ) , 2 ) ;
2752
+ assert ! ( selected_nodes. selected_layers_contains( layers[ 0 ] , document. metadata( ) ) ) ;
2753
+ assert ! ( selected_nodes. selected_layers_contains( layers[ 2 ] , document. metadata( ) ) ) ;
2754
+
2755
+ // Case 3: Shift + click to select a range
2756
+ editor
2757
+ . handle_message ( DocumentMessage :: SelectLayer {
2758
+ id : layers[ 1 ] . to_node ( ) ,
2759
+ ctrl : false ,
2760
+ shift : true ,
2761
+ } )
2762
+ . await ;
2763
+ let document = editor. active_document ( ) ;
2764
+ let selected_nodes = document. network_interface . selected_nodes ( ) ;
2765
+ // We expect 2 layers to be selected (layers 1 and 2) - not 3
2766
+ assert_eq ! ( selected_nodes. selected_nodes_ref( ) . len( ) , 2 ) ;
2767
+ assert ! ( !selected_nodes. selected_layers_contains( layers[ 0 ] , document. metadata( ) ) ) ;
2768
+ assert ! ( selected_nodes. selected_layers_contains( layers[ 1 ] , document. metadata( ) ) ) ;
2769
+ assert ! ( selected_nodes. selected_layers_contains( layers[ 2 ] , document. metadata( ) ) ) ;
2770
+
2771
+ // Case 4: Ctrl + click to toggle selection (deselect)
2772
+ editor
2773
+ . handle_message ( DocumentMessage :: SelectLayer {
2774
+ id : layers[ 1 ] . to_node ( ) ,
2775
+ ctrl : true ,
2776
+ shift : false ,
2777
+ } )
2778
+ . await ;
2779
+
2780
+ // Final fresh document reference
2781
+ let document = editor. active_document ( ) ;
2782
+ let selected_nodes = document. network_interface . selected_nodes ( ) ;
2783
+ assert_eq ! ( selected_nodes. selected_nodes_ref( ) . len( ) , 1 ) ;
2784
+ assert ! ( !selected_nodes. selected_layers_contains( layers[ 0 ] , document. metadata( ) ) ) ;
2785
+ assert ! ( !selected_nodes. selected_layers_contains( layers[ 1 ] , document. metadata( ) ) ) ;
2786
+ assert ! ( selected_nodes. selected_layers_contains( layers[ 2 ] , document. metadata( ) ) ) ;
2787
+ }
2788
+ }
0 commit comments