@@ -65,72 +65,6 @@ impl Folder {
65
65
Ok ( ( ) )
66
66
}
67
67
68
- pub fn reorder_layers ( & mut self , source_ids : Vec < LayerId > , target_id : LayerId ) -> Result < ( ) , DocumentError > {
69
- let source_pos = self . position_of_layer ( source_ids[ 0 ] ) ?;
70
- let source_pos_end = source_pos + source_ids. len ( ) - 1 ;
71
- let target_pos = self . position_of_layer ( target_id) ?;
72
-
73
- let mut last_pos = source_pos;
74
- for layer_id in & source_ids[ 1 ..] {
75
- let layer_pos = self . position_of_layer ( * layer_id) ?;
76
- if ( layer_pos as i32 - last_pos as i32 ) . abs ( ) > 1 {
77
- // Selection is not contiguous
78
- return Err ( DocumentError :: NonReorderableSelection ) ;
79
- }
80
- last_pos = layer_pos;
81
- }
82
-
83
- if source_pos < target_pos {
84
- // Moving layers up the hierarchy
85
-
86
- // Prevent shifting past end
87
- if source_pos_end + 1 >= self . layers . len ( ) {
88
- return Err ( DocumentError :: NonReorderableSelection ) ;
89
- }
90
-
91
- fn reorder_up < T > ( arr : & mut Vec < T > , source_pos : usize , source_pos_end : usize , target_pos : usize )
92
- where
93
- T : Clone ,
94
- {
95
- * arr = [
96
- & arr[ 0 ..source_pos] , // Elements before selection
97
- & arr[ source_pos_end + 1 ..=target_pos] , // Elements between selection end and target
98
- & arr[ source_pos..=source_pos_end] , // Selection itself
99
- & arr[ target_pos + 1 ..] , // Elements before target
100
- ]
101
- . concat ( ) ;
102
- }
103
-
104
- reorder_up ( & mut self . layers , source_pos, source_pos_end, target_pos) ;
105
- reorder_up ( & mut self . layer_ids , source_pos, source_pos_end, target_pos) ;
106
- } else {
107
- // Moving layers down the hierarchy
108
-
109
- // Prevent shifting past end
110
- if source_pos == 0 {
111
- return Err ( DocumentError :: NonReorderableSelection ) ;
112
- }
113
-
114
- fn reorder_down < T > ( arr : & mut Vec < T > , source_pos : usize , source_pos_end : usize , target_pos : usize )
115
- where
116
- T : Clone ,
117
- {
118
- * arr = [
119
- & arr[ 0 ..target_pos] , // Elements before target
120
- & arr[ source_pos..=source_pos_end] , // Selection itself
121
- & arr[ target_pos..source_pos] , // Elements between selection and target
122
- & arr[ source_pos_end + 1 ..] , // Elements before selection
123
- ]
124
- . concat ( ) ;
125
- }
126
-
127
- reorder_down ( & mut self . layers , source_pos, source_pos_end, target_pos) ;
128
- reorder_down ( & mut self . layer_ids , source_pos, source_pos_end, target_pos) ;
129
- }
130
-
131
- Ok ( ( ) )
132
- }
133
-
134
68
/// Returns a list of layers in the folder
135
69
pub fn list_layers ( & self ) -> & [ LayerId ] {
136
70
self . layer_ids . as_slice ( )
@@ -209,144 +143,3 @@ impl Default for Folder {
209
143
}
210
144
}
211
145
}
212
-
213
- #[ cfg( test) ]
214
- mod test {
215
- use glam:: { DAffine2 , DVec2 } ;
216
-
217
- use crate :: layers:: { style:: PathStyle , Ellipse , Layer , LayerDataTypes , Line , PolyLine , Rect , Shape } ;
218
-
219
- use super :: Folder ;
220
-
221
- #[ test]
222
- fn reorder_layers ( ) {
223
- let mut folder = Folder :: default ( ) ;
224
-
225
- let identity_transform = DAffine2 :: IDENTITY . to_cols_array ( ) ;
226
- folder. add_layer ( Layer :: new ( LayerDataTypes :: Shape ( Shape :: new ( true , 3 ) ) , identity_transform, PathStyle :: default ( ) ) , 0 ) ;
227
- folder. add_layer ( Layer :: new ( LayerDataTypes :: Rect ( Rect :: default ( ) ) , identity_transform, PathStyle :: default ( ) ) , 1 ) ;
228
- folder. add_layer ( Layer :: new ( LayerDataTypes :: Ellipse ( Ellipse :: default ( ) ) , identity_transform, PathStyle :: default ( ) ) , 2 ) ;
229
- folder. add_layer ( Layer :: new ( LayerDataTypes :: Line ( Line :: default ( ) ) , identity_transform, PathStyle :: default ( ) ) , 3 ) ;
230
- folder. add_layer (
231
- Layer :: new ( LayerDataTypes :: PolyLine ( PolyLine :: new ( vec ! [ DVec2 :: ZERO , DVec2 :: ONE ] ) ) , identity_transform, PathStyle :: default ( ) ) ,
232
- 4 ,
233
- ) ;
234
-
235
- assert_eq ! ( folder. layer_ids[ 0 ] , 0 ) ;
236
- assert_eq ! ( folder. layer_ids[ 1 ] , 1 ) ;
237
- assert_eq ! ( folder. layer_ids[ 2 ] , 2 ) ;
238
- assert_eq ! ( folder. layer_ids[ 3 ] , 3 ) ;
239
- assert_eq ! ( folder. layer_ids[ 4 ] , 4 ) ;
240
-
241
- assert ! ( matches!( folder. layer( 0 ) . unwrap( ) . data, LayerDataTypes :: Shape ( _) ) ) ;
242
- assert ! ( matches!( folder. layer( 1 ) . unwrap( ) . data, LayerDataTypes :: Rect ( _) ) ) ;
243
- assert ! ( matches!( folder. layer( 2 ) . unwrap( ) . data, LayerDataTypes :: Ellipse ( _) ) ) ;
244
- assert ! ( matches!( folder. layer( 3 ) . unwrap( ) . data, LayerDataTypes :: Line ( _) ) ) ;
245
- assert ! ( matches!( folder. layer( 4 ) . unwrap( ) . data, LayerDataTypes :: PolyLine ( _) ) ) ;
246
-
247
- assert_eq ! ( folder. layer_ids. len( ) , 5 ) ;
248
- assert_eq ! ( folder. layers. len( ) , 5 ) ;
249
-
250
- folder. reorder_layers ( vec ! [ 0 , 1 ] , 2 ) . unwrap ( ) ;
251
-
252
- assert_eq ! ( folder. layer_ids[ 0 ] , 2 ) ;
253
- // Moved layers
254
- assert_eq ! ( folder. layer_ids[ 1 ] , 0 ) ;
255
- assert_eq ! ( folder. layer_ids[ 2 ] , 1 ) ;
256
-
257
- assert_eq ! ( folder. layer_ids[ 3 ] , 3 ) ;
258
- assert_eq ! ( folder. layer_ids[ 4 ] , 4 ) ;
259
-
260
- assert ! ( matches!( folder. layer( 2 ) . unwrap( ) . data, LayerDataTypes :: Ellipse ( _) ) ) ;
261
- // Moved layers
262
- assert ! ( matches!( folder. layer( 0 ) . unwrap( ) . data, LayerDataTypes :: Shape ( _) ) ) ;
263
- assert ! ( matches!( folder. layer( 1 ) . unwrap( ) . data, LayerDataTypes :: Rect ( _) ) ) ;
264
-
265
- assert ! ( matches!( folder. layer( 3 ) . unwrap( ) . data, LayerDataTypes :: Line ( _) ) ) ;
266
- assert ! ( matches!( folder. layer( 4 ) . unwrap( ) . data, LayerDataTypes :: PolyLine ( _) ) ) ;
267
-
268
- assert_eq ! ( folder. layer_ids. len( ) , 5 ) ;
269
- assert_eq ! ( folder. layers. len( ) , 5 ) ;
270
- }
271
-
272
- #[ test]
273
- fn reorder_layer_to_top ( ) {
274
- let mut folder = Folder :: default ( ) ;
275
-
276
- let identity_transform = DAffine2 :: IDENTITY . to_cols_array ( ) ;
277
- folder. add_layer ( Layer :: new ( LayerDataTypes :: Shape ( Shape :: new ( true , 3 ) ) , identity_transform, PathStyle :: default ( ) ) , 0 ) ;
278
- folder. add_layer ( Layer :: new ( LayerDataTypes :: Rect ( Rect :: default ( ) ) , identity_transform, PathStyle :: default ( ) ) , 1 ) ;
279
- folder. add_layer ( Layer :: new ( LayerDataTypes :: Ellipse ( Ellipse :: default ( ) ) , identity_transform, PathStyle :: default ( ) ) , 2 ) ;
280
- folder. add_layer ( Layer :: new ( LayerDataTypes :: Line ( Line :: default ( ) ) , identity_transform, PathStyle :: default ( ) ) , 3 ) ;
281
-
282
- assert_eq ! ( folder. layer_ids[ 0 ] , 0 ) ;
283
- assert_eq ! ( folder. layer_ids[ 1 ] , 1 ) ;
284
- assert_eq ! ( folder. layer_ids[ 2 ] , 2 ) ;
285
- assert_eq ! ( folder. layer_ids[ 3 ] , 3 ) ;
286
-
287
- assert ! ( matches!( folder. layer( 0 ) . unwrap( ) . data, LayerDataTypes :: Shape ( _) ) ) ;
288
- assert ! ( matches!( folder. layer( 1 ) . unwrap( ) . data, LayerDataTypes :: Rect ( _) ) ) ;
289
- assert ! ( matches!( folder. layer( 2 ) . unwrap( ) . data, LayerDataTypes :: Ellipse ( _) ) ) ;
290
- assert ! ( matches!( folder. layer( 3 ) . unwrap( ) . data, LayerDataTypes :: Line ( _) ) ) ;
291
-
292
- assert_eq ! ( folder. layer_ids. len( ) , 4 ) ;
293
- assert_eq ! ( folder. layers. len( ) , 4 ) ;
294
-
295
- folder. reorder_layers ( vec ! [ 1 ] , 3 ) . unwrap ( ) ;
296
-
297
- assert_eq ! ( folder. layer_ids[ 0 ] , 0 ) ;
298
- assert_eq ! ( folder. layer_ids[ 1 ] , 2 ) ;
299
- assert_eq ! ( folder. layer_ids[ 2 ] , 3 ) ;
300
- // Moved layer
301
- assert_eq ! ( folder. layer_ids[ 3 ] , 1 ) ;
302
-
303
- assert ! ( matches!( folder. layer( 0 ) . unwrap( ) . data, LayerDataTypes :: Shape ( _) ) ) ;
304
- assert ! ( matches!( folder. layer( 2 ) . unwrap( ) . data, LayerDataTypes :: Ellipse ( _) ) ) ;
305
- assert ! ( matches!( folder. layer( 3 ) . unwrap( ) . data, LayerDataTypes :: Line ( _) ) ) ;
306
- // Moved layer
307
- assert ! ( matches!( folder. layer( 1 ) . unwrap( ) . data, LayerDataTypes :: Rect ( _) ) ) ;
308
-
309
- assert_eq ! ( folder. layer_ids. len( ) , 4 ) ;
310
- assert_eq ! ( folder. layers. len( ) , 4 ) ;
311
- }
312
-
313
- #[ test]
314
- fn reorder_non_contiguous_selection ( ) {
315
- let mut folder = Folder :: default ( ) ;
316
-
317
- let identity_transform = DAffine2 :: IDENTITY . to_cols_array ( ) ;
318
- folder. add_layer ( Layer :: new ( LayerDataTypes :: Shape ( Shape :: new ( true , 3 ) ) , identity_transform, PathStyle :: default ( ) ) , 0 ) ;
319
- folder. add_layer ( Layer :: new ( LayerDataTypes :: Rect ( Rect :: default ( ) ) , identity_transform, PathStyle :: default ( ) ) , 1 ) ;
320
- folder. add_layer ( Layer :: new ( LayerDataTypes :: Ellipse ( Ellipse :: default ( ) ) , identity_transform, PathStyle :: default ( ) ) , 2 ) ;
321
- folder. add_layer ( Layer :: new ( LayerDataTypes :: Line ( Line :: default ( ) ) , identity_transform, PathStyle :: default ( ) ) , 3 ) ;
322
-
323
- assert_eq ! ( folder. layer_ids[ 0 ] , 0 ) ;
324
- assert_eq ! ( folder. layer_ids[ 1 ] , 1 ) ;
325
- assert_eq ! ( folder. layer_ids[ 2 ] , 2 ) ;
326
- assert_eq ! ( folder. layer_ids[ 3 ] , 3 ) ;
327
-
328
- assert ! ( matches!( folder. layer( 0 ) . unwrap( ) . data, LayerDataTypes :: Shape ( _) ) ) ;
329
- assert ! ( matches!( folder. layer( 1 ) . unwrap( ) . data, LayerDataTypes :: Rect ( _) ) ) ;
330
- assert ! ( matches!( folder. layer( 2 ) . unwrap( ) . data, LayerDataTypes :: Ellipse ( _) ) ) ;
331
- assert ! ( matches!( folder. layer( 3 ) . unwrap( ) . data, LayerDataTypes :: Line ( _) ) ) ;
332
-
333
- assert_eq ! ( folder. layer_ids. len( ) , 4 ) ;
334
- assert_eq ! ( folder. layers. len( ) , 4 ) ;
335
-
336
- folder. reorder_layers ( vec ! [ 0 , 2 ] , 3 ) . expect_err ( "Non-contiguous selections can't be reordered" ) ;
337
-
338
- // Expect identical state
339
- assert_eq ! ( folder. layer_ids[ 0 ] , 0 ) ;
340
- assert_eq ! ( folder. layer_ids[ 1 ] , 1 ) ;
341
- assert_eq ! ( folder. layer_ids[ 2 ] , 2 ) ;
342
- assert_eq ! ( folder. layer_ids[ 3 ] , 3 ) ;
343
-
344
- assert ! ( matches!( folder. layer( 0 ) . unwrap( ) . data, LayerDataTypes :: Shape ( _) ) ) ;
345
- assert ! ( matches!( folder. layer( 1 ) . unwrap( ) . data, LayerDataTypes :: Rect ( _) ) ) ;
346
- assert ! ( matches!( folder. layer( 2 ) . unwrap( ) . data, LayerDataTypes :: Ellipse ( _) ) ) ;
347
- assert ! ( matches!( folder. layer( 3 ) . unwrap( ) . data, LayerDataTypes :: Line ( _) ) ) ;
348
-
349
- assert_eq ! ( folder. layer_ids. len( ) , 4 ) ;
350
- assert_eq ! ( folder. layers. len( ) , 4 ) ;
351
- }
352
- }
0 commit comments