useAlignElementToCanvas.ts 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import { storeToRefs } from 'pinia'
  2. import { useMainStore, useSlidesStore } from '@/store'
  3. import type { PPTElement } from '@/types/slides'
  4. import { ElementAlignCommands } from '@/types/edit'
  5. import { getElementListRange } from '@/utils/element'
  6. import useHistorySnapshot from './useHistorySnapshot'
  7. export default () => {
  8. const slidesStore = useSlidesStore()
  9. const { activeElementIdList, activeElementList } = storeToRefs(useMainStore())
  10. const { currentSlide, viewportRatio, viewportSize } = storeToRefs(slidesStore)
  11. const { addHistorySnapshot } = useHistorySnapshot()
  12. /**
  13. * 将所有选中的元素对齐到画布
  14. * @param command 对齐方向
  15. */
  16. const alignElementToCanvas = (command: ElementAlignCommands) => {
  17. const viewportWidth = viewportSize.value
  18. const viewportHeight = viewportSize.value * viewportRatio.value
  19. const { minX, maxX, minY, maxY } = getElementListRange(activeElementList.value)
  20. const newElementList: PPTElement[] = JSON.parse(JSON.stringify(currentSlide.value.elements))
  21. for (const element of newElementList) {
  22. if (!activeElementIdList.value.includes(element.id)) continue
  23. // 水平垂直居中
  24. if (command === ElementAlignCommands.CENTER) {
  25. const offsetY = minY + (maxY - minY) / 2 - viewportHeight / 2
  26. const offsetX = minX + (maxX - minX) / 2 - viewportWidth / 2
  27. element.top = element.top - offsetY
  28. element.left = element.left - offsetX
  29. }
  30. // 顶部对齐
  31. if (command === ElementAlignCommands.TOP) {
  32. const offsetY = minY - 0
  33. element.top = element.top - offsetY
  34. }
  35. // 垂直居中
  36. else if (command === ElementAlignCommands.VERTICAL) {
  37. const offsetY = minY + (maxY - minY) / 2 - viewportHeight / 2
  38. element.top = element.top - offsetY
  39. }
  40. // 底部对齐
  41. else if (command === ElementAlignCommands.BOTTOM) {
  42. const offsetY = maxY - viewportHeight
  43. element.top = element.top - offsetY
  44. }
  45. // 左侧对齐
  46. else if (command === ElementAlignCommands.LEFT) {
  47. const offsetX = minX - 0
  48. element.left = element.left - offsetX
  49. }
  50. // 水平居中
  51. else if (command === ElementAlignCommands.HORIZONTAL) {
  52. const offsetX = minX + (maxX - minX) / 2 - viewportWidth / 2
  53. element.left = element.left - offsetX
  54. }
  55. // 右侧对齐
  56. else if (command === ElementAlignCommands.RIGHT) {
  57. const offsetX = maxX - viewportWidth
  58. element.left = element.left - offsetX
  59. }
  60. }
  61. slidesStore.updateSlide({ elements: newElementList })
  62. addHistorySnapshot()
  63. }
  64. return {
  65. alignElementToCanvas,
  66. }
  67. }