useLockElement.ts 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import { storeToRefs } from 'pinia'
  2. import { useMainStore, useSlidesStore } from '@/store'
  3. import type { PPTElement } from '@/types/slides'
  4. import useHistorySnapshot from '@/hooks/useHistorySnapshot'
  5. export default () => {
  6. const mainStore = useMainStore()
  7. const slidesStore = useSlidesStore()
  8. const { activeElementIdList } = storeToRefs(mainStore)
  9. const { currentSlide } = storeToRefs(slidesStore)
  10. const { addHistorySnapshot } = useHistorySnapshot()
  11. // 锁定选中的元素,并清空选中元素状态
  12. const lockElement = () => {
  13. const newElementList: PPTElement[] = JSON.parse(JSON.stringify(currentSlide.value.elements))
  14. for (const element of newElementList) {
  15. if (activeElementIdList.value.includes(element.id)) element.lock = true
  16. }
  17. slidesStore.updateSlide({ elements: newElementList })
  18. mainStore.setActiveElementIdList([])
  19. addHistorySnapshot()
  20. }
  21. /**
  22. * 解除元素的锁定状态,并将其设置为当前选择元素
  23. * @param handleElement 需要解锁的元素
  24. */
  25. const unlockElement = (handleElement: PPTElement) => {
  26. const newElementList: PPTElement[] = JSON.parse(JSON.stringify(currentSlide.value.elements))
  27. if (handleElement.groupId) {
  28. const groupElementIdList = []
  29. for (const element of newElementList) {
  30. if (element.groupId === handleElement.groupId) {
  31. element.lock = false
  32. groupElementIdList.push(element.id)
  33. }
  34. }
  35. slidesStore.updateSlide({ elements: newElementList })
  36. mainStore.setActiveElementIdList(groupElementIdList)
  37. }
  38. else {
  39. for (const element of newElementList) {
  40. if (element.id === handleElement.id) {
  41. element.lock = false
  42. break
  43. }
  44. }
  45. slidesStore.updateSlide({ elements: newElementList })
  46. mainStore.setActiveElementIdList([handleElement.id])
  47. }
  48. addHistorySnapshot()
  49. }
  50. return {
  51. lockElement,
  52. unlockElement,
  53. }
  54. }