perf: 连续粘贴优化(#70)

This commit is contained in:
pipipi-pikachu 2023-09-10 21:18:03 +08:00
parent d2ca9af81d
commit 32212a992f

View File

@ -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]
}