您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

duplicate.ts 1.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import Command from './command'
  2. import history from '../history'
  3. import { Data } from 'types'
  4. import { getPage, getSelectedShapes } from 'utils/utils'
  5. import { v4 as uuid } from 'uuid'
  6. import { current } from 'immer'
  7. import * as vec from 'utils/vec'
  8. export default function duplicateCommand(data: Data) {
  9. const { currentPageId } = data
  10. const selectedShapes = getSelectedShapes(current(data))
  11. const duplicates = selectedShapes.map((shape) => ({
  12. ...shape,
  13. id: uuid(),
  14. point: vec.add(shape.point, vec.div([16, 16], data.camera.zoom)),
  15. }))
  16. history.execute(
  17. data,
  18. new Command({
  19. name: 'duplicate_shapes',
  20. category: 'canvas',
  21. manualSelection: true,
  22. do(data) {
  23. const { shapes } = getPage(data, currentPageId)
  24. data.selectedIds.clear()
  25. for (const duplicate of duplicates) {
  26. shapes[duplicate.id] = duplicate
  27. data.selectedIds.add(duplicate.id)
  28. }
  29. },
  30. undo(data) {
  31. const { shapes } = getPage(data, currentPageId)
  32. data.selectedIds.clear()
  33. for (const duplicate of duplicates) {
  34. delete shapes[duplicate.id]
  35. }
  36. for (let id in selectedShapes) {
  37. data.selectedIds.add(id)
  38. }
  39. },
  40. })
  41. )
  42. }