1
+ use super :: { DocumentMessageHandler , LayerData } ;
2
+ use crate :: consts:: DEFAULT_DOCUMENT_NAME ;
1
3
use crate :: frontend:: frontend_message_handler:: FrontendDocumentDetails ;
2
4
use crate :: input:: InputPreprocessor ;
3
5
use crate :: message_prelude:: * ;
4
6
use graphene:: layers:: Layer ;
5
7
use graphene:: { LayerId , Operation as DocumentOperation } ;
8
+
6
9
use log:: warn;
7
10
use serde:: { Deserialize , Serialize } ;
8
- use std:: collections:: { HashMap , VecDeque } ;
9
11
10
- use super :: DocumentMessageHandler ;
11
- use crate :: consts:: DEFAULT_DOCUMENT_NAME ;
12
+ use std:: collections:: { HashMap , VecDeque } ;
12
13
13
14
#[ repr( u8 ) ]
14
15
#[ derive( Serialize , Deserialize , Clone , Copy , PartialEq , Eq , Debug ) ]
@@ -17,7 +18,8 @@ pub enum Clipboard {
17
18
User ,
18
19
_ClipboardCount,
19
20
}
20
- static CLIPBOARD_COUNT : u8 = Clipboard :: _ClipboardCount as u8 ;
21
+
22
+ const CLIPBOARD_COUNT : u8 = Clipboard :: _ClipboardCount as u8 ;
21
23
22
24
#[ impl_message( Message , Documents ) ]
23
25
#[ derive( PartialEq , Clone , Debug , Serialize , Deserialize ) ]
@@ -60,7 +62,13 @@ pub struct DocumentsMessageHandler {
60
62
documents : HashMap < u64 , DocumentMessageHandler > ,
61
63
document_ids : Vec < u64 > ,
62
64
active_document_id : u64 ,
63
- copy_buffer : Vec < Vec < Layer > > ,
65
+ copy_buffer : [ Vec < CopyBufferEntry > ; CLIPBOARD_COUNT as usize ] ,
66
+ }
67
+
68
+ #[ derive( Debug , Clone , PartialEq , Serialize , Deserialize ) ]
69
+ pub struct CopyBufferEntry {
70
+ layer : Layer ,
71
+ layer_data : LayerData ,
64
72
}
65
73
66
74
impl DocumentsMessageHandler {
@@ -156,10 +164,12 @@ impl Default for DocumentsMessageHandler {
156
164
let starting_key = generate_uuid ( ) ;
157
165
documents_map. insert ( starting_key, DocumentMessageHandler :: default ( ) ) ;
158
166
167
+ const EMPTY_VEC : Vec < CopyBufferEntry > = vec ! [ ] ;
168
+
159
169
Self {
160
170
documents : documents_map,
161
171
document_ids : vec ! [ starting_key] ,
162
- copy_buffer : vec ! [ vec! [ ] ; CLIPBOARD_COUNT as usize ] ,
172
+ copy_buffer : [ EMPTY_VEC ; CLIPBOARD_COUNT as usize ] ,
163
173
active_document_id : starting_key,
164
174
}
165
175
}
@@ -345,11 +355,12 @@ impl MessageHandler<DocumentsMessage, &InputPreprocessor> for DocumentsMessageHa
345
355
let paths = self . active_document ( ) . selected_layers_sorted ( ) ;
346
356
self . copy_buffer [ clipboard as usize ] . clear ( ) ;
347
357
for path in paths {
348
- match self . active_document ( ) . graphene_document . layer ( & path) . map ( |t| t. clone ( ) ) {
349
- Ok ( layer) => {
350
- self . copy_buffer [ clipboard as usize ] . push ( layer) ;
358
+ let document = self . active_document ( ) ;
359
+ match ( document. graphene_document . layer ( & path) . map ( |t| t. clone ( ) ) , document. layer_data ( & path) . clone ( ) ) {
360
+ ( Ok ( layer) , layer_data) => {
361
+ self . copy_buffer [ clipboard as usize ] . push ( CopyBufferEntry { layer, layer_data } ) ;
351
362
}
352
- Err ( e) => warn ! ( "Could not access selected layer {:?}: {:?}" , path, e) ,
363
+ ( Err ( e) , _ ) => warn ! ( "Could not access selected layer {:?}: {:?}" , path, e) ,
353
364
}
354
365
}
355
366
}
@@ -374,24 +385,35 @@ impl MessageHandler<DocumentsMessage, &InputPreprocessor> for DocumentsMessageHa
374
385
) ;
375
386
}
376
387
PasteIntoFolder { clipboard, path, insert_index } => {
377
- let paste = |layer : & Layer , responses : & mut VecDeque < _ > | {
378
- log:: trace!( "Pasting into folder {:?} as index: {}" , path, insert_index) ;
388
+ let paste = |entry : & CopyBufferEntry , responses : & mut VecDeque < _ > | {
389
+ log:: trace!( "Pasting into folder {:?} as index: {}" , & path, insert_index) ;
390
+
391
+ let destination_path = [ path. to_vec ( ) , vec ! [ generate_uuid( ) ] ] . concat ( ) ;
392
+
379
393
responses. push_back (
380
- DocumentOperation :: PasteLayer {
381
- layer : layer. clone ( ) ,
382
- path : path . clone ( ) ,
394
+ DocumentOperation :: InsertLayer {
395
+ layer : entry . layer . clone ( ) ,
396
+ destination_path : destination_path . clone ( ) ,
383
397
insert_index,
384
398
}
385
399
. into ( ) ,
386
- )
400
+ ) ;
401
+ responses. push_back (
402
+ DocumentMessage :: UpdateLayerData {
403
+ path : destination_path,
404
+ layer_data_entry : entry. layer_data ,
405
+ }
406
+ . into ( ) ,
407
+ ) ;
387
408
} ;
409
+
388
410
if insert_index == -1 {
389
- for layer in self . copy_buffer [ clipboard as usize ] . iter ( ) {
390
- paste ( layer , responses)
411
+ for entry in self . copy_buffer [ clipboard as usize ] . iter ( ) {
412
+ paste ( entry , responses)
391
413
}
392
414
} else {
393
- for layer in self . copy_buffer [ clipboard as usize ] . iter ( ) . rev ( ) {
394
- paste ( layer , responses)
415
+ for entry in self . copy_buffer [ clipboard as usize ] . iter ( ) . rev ( ) {
416
+ paste ( entry , responses)
395
417
}
396
418
}
397
419
}
0 commit comments