PPTist/src/hooks/useMoveElement.ts
2023-07-23 13:25:23 +08:00

61 lines
1.8 KiB
TypeScript

import { storeToRefs } from 'pinia'
import { useMainStore, useSlidesStore } from '@/store'
import type { PPTElement } from '@/types/slides'
import { KEYS } from '@/configs/hotkey'
import useHistorySnapshot from '@/hooks/useHistorySnapshot'
export default () => {
const slidesStore = useSlidesStore()
const { activeElementIdList, activeGroupElementId } = storeToRefs(useMainStore())
const { currentSlide } = storeToRefs(slidesStore)
const { addHistorySnapshot } = useHistorySnapshot()
/**
* 将元素向指定方向移动指定的距离
* 组合元素成员中,存在被选中可独立操作的元素时,优先移动该元素。否则默认移动所有被选中的元素
* @param command 移动方向
* @param step 移动距离
*/
const moveElement = (command: string, step = 1) => {
let newElementList: PPTElement[] = []
const move = (el: PPTElement) => {
let { left, top } = el
switch (command) {
case KEYS.LEFT:
left = left - step
break
case KEYS.RIGHT:
left = left + step
break
case KEYS.UP:
top = top - step
break
case KEYS.DOWN:
top = top + step
break
default: break
}
return { ...el, left, top }
}
if (activeGroupElementId.value) {
newElementList = currentSlide.value.elements.map(el => {
return activeGroupElementId.value === el.id ? move(el) : el
})
}
else {
newElementList = currentSlide.value.elements.map(el => {
return activeElementIdList.value.includes(el.id) ? move(el) : el
})
}
slidesStore.updateSlide({ elements: newElementList })
addHistorySnapshot()
}
return {
moveElement,
}
}