diff --git a/src/hooks/useAddSlidesOrElements.ts b/src/hooks/useAddSlidesOrElements.ts index 598d9fcd..1e7fcd65 100644 --- a/src/hooks/useAddSlidesOrElements.ts +++ b/src/hooks/useAddSlidesOrElements.ts @@ -3,7 +3,7 @@ import { storeToRefs } from 'pinia' import { nanoid } from 'nanoid' import { useSlidesStore, useMainStore } from '@/store' import type { PPTElement, Slide } from '@/types/slides' -import { createSlideIdMap, createElementIdMap } from '@/utils/element' +import { createSlideIdMap, createElementIdMap, getElementRange } from '@/utils/element' import useHistorySnapshot from '@/hooks/useHistorySnapshot' export default () => { @@ -19,17 +19,39 @@ export default () => { */ const addElementsFromData = (elements: PPTElement[]) => { const { groupIdMap, elIdMap } = createElementIdMap(elements) - const currentSlideElementIdList = currentSlide.value.elements.map(el => el.id) + + const firstElement = elements[0] + let offset = 0 + let lastSameElement: PPTElement | undefined + + do { + lastSameElement = currentSlide.value.elements.find(el => { + if (el.type !== firstElement.type) return false + + const { minX: oMinX, maxX: oMaxX, minY: oMinY, maxY: oMaxY } = getElementRange(el) + const { minX: nMinX, maxX: nMaxX, minY: nMinY, maxY: nMaxY } = getElementRange({ + ...firstElement, + left: firstElement.left + offset, + top: firstElement.top + offset + }) + if ( + oMinX === nMinX && + oMaxX === nMaxX && + oMinY === nMinY && + oMaxY === nMaxY + ) return true + + return false + }) + if (lastSameElement) offset += 10 + + } while (lastSameElement) for (const element of elements) { - const inCurrentSlide = currentSlideElementIdList.includes(element.id) - element.id = elIdMap[element.id] - if (inCurrentSlide) { - element.left = element.left + 10 - element.top = element.top + 10 - } + element.left = element.left + offset + element.top = element.top + offset if (element.groupId) element.groupId = groupIdMap[element.groupId] }