useAlignElementToCanvas.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import { Ref, computed } from 'vue'
  2. import { useStore } from 'vuex'
  3. import { State, MutationTypes } from '@/store'
  4. import { PPTElement } from '@/types/slides'
  5. import { ElementAlignCommand, ElementAlignCommands } from '@/types/edit'
  6. import { getElementListRange } from '../utils/elementRange'
  7. import { VIEWPORT_SIZE, VIEWPORT_ASPECT_RATIO } from '@/configs/canvas'
  8. export default (elementList: Ref<PPTElement[]>) => {
  9. const store = useStore<State>()
  10. const activeElementIdList = computed(() => store.state.activeElementIdList)
  11. const activeElementList: Ref<PPTElement[]> = computed(() => store.getters.activeElementList)
  12. const alignElementToCanvas = (command: ElementAlignCommand) => {
  13. const viewportWidth = VIEWPORT_SIZE
  14. const viewportHeight = VIEWPORT_SIZE * VIEWPORT_ASPECT_RATIO
  15. const { minX, maxX, minY, maxY } = getElementListRange(activeElementList.value)
  16. const newElementList: PPTElement[] = JSON.parse(JSON.stringify(elementList.value))
  17. for(const element of newElementList) {
  18. if(!activeElementIdList.value.includes(element.elId)) continue
  19. if(command === ElementAlignCommands.TOP) {
  20. const offsetY = minY - 0
  21. element.top = element.top - offsetY
  22. }
  23. else if(command === ElementAlignCommands.VERTICAL) {
  24. const offsetY = minY + (maxY - minY) / 2 - viewportHeight / 2
  25. element.top = element.top - offsetY
  26. }
  27. else if(command === ElementAlignCommands.BOTTOM) {
  28. const offsetY = maxY - viewportHeight
  29. element.top = element.top - offsetY
  30. }
  31. else if(command === ElementAlignCommands.LEFT) {
  32. const offsetX = minX - 0
  33. element.left = element.left - offsetX
  34. }
  35. else if(command === ElementAlignCommands.HORIZONTAL) {
  36. const offsetX = minX + (maxX - minX) / 2 - viewportWidth / 2
  37. element.left = element.left - offsetX
  38. }
  39. else if(command === ElementAlignCommands.RIGHT) {
  40. const offsetX = maxX - viewportWidth
  41. element.left = element.left - offsetX
  42. }
  43. }
  44. store.commit(MutationTypes.UPDATE_SLIDE, { elements: newElementList })
  45. }
  46. return {
  47. alignElementToCanvas,
  48. }
  49. }