@@ -3,13 +3,36 @@ import { GRID_SIZE, OBJECT_DEFAULTS } from "../defaults";
33import type { MoveDirection } from "../types" ;
44
55export class ImageEditorUtils {
6- static async cloneObject ( canvas : fabric . Canvas , selected : fabric . FabricObject ) : Promise < void > {
7- const obj = await selected . clone ( ) ;
8- obj . snapAngle = OBJECT_DEFAULTS . snapAngle ;
9- obj . top += GRID_SIZE ;
10- obj . left += GRID_SIZE ;
11- canvas . add ( obj ) ;
12- canvas . setActiveObject ( obj ) ;
6+ static async cloneSelection ( canvas : fabric . Canvas ) : Promise < void > {
7+ const clonedList : fabric . FabricObject [ ] = [ ] ;
8+
9+ const selection = canvas . getActiveObject ( ) ;
10+
11+ if ( selection === undefined ) {
12+ return ;
13+ }
14+
15+ let selected : fabric . FabricObject [ ] = canvas . getActiveObjects ( ) ;
16+
17+ for ( const obj of selected ) {
18+ const cloned = await obj . clone ( ) ;
19+
20+ if ( selection instanceof fabric . ActiveSelection ) {
21+ cloned . left += selection . left + selection . width / 2 ;
22+ cloned . top += selection . top + selection . height / 2 ;
23+ }
24+
25+ cloned . top += GRID_SIZE ;
26+ cloned . left += GRID_SIZE ;
27+ cloned . snapAngle = OBJECT_DEFAULTS . snapAngle ;
28+
29+ clonedList . push ( cloned ) ;
30+ }
31+
32+ canvas . add ( ...clonedList ) ;
33+
34+ const newSelection = new fabric . ActiveSelection ( clonedList ) ;
35+ canvas . setActiveObject ( newSelection ) ;
1336 }
1437
1538 static moveSelection ( canvas : fabric . Canvas , direction : MoveDirection , ctrl ?: boolean ) {
0 commit comments