perf: 代码优化、UI调整

This commit is contained in:
pipipi-pikachu 2024-03-10 13:44:59 +08:00
parent aba93ce0ed
commit c60208a117
9 changed files with 96 additions and 69 deletions

View File

@ -215,7 +215,7 @@ const openEyeDropper = () => {
// //
const browserEyeDropper = () => { const browserEyeDropper = () => {
message.success('按 ESC 键关闭取色吸管') message.success('按 ESC 键关闭取色吸管', { duration: 0 })
// eslint-disable-next-line // eslint-disable-next-line
const eyeDropper = new (window as any).EyeDropper() const eyeDropper = new (window as any).EyeDropper()
@ -226,7 +226,7 @@ const browserEyeDropper = () => {
updateRecentColorsCache() updateRecentColorsCache()
}).catch(() => { }).catch(() => {
message.success('关闭取色吸管') message.closeAll()
}) })
} }

View File

@ -9,7 +9,7 @@ import useLockElement from './useLockElement'
import useDeleteElement from './useDeleteElement' import useDeleteElement from './useDeleteElement'
import useCombineElement from './useCombineElement' import useCombineElement from './useCombineElement'
import useCopyAndPasteElement from './useCopyAndPasteElement' import useCopyAndPasteElement from './useCopyAndPasteElement'
import useSelectAllElement from './useSelectAllElement' import useSelectElement from './useSelectElement'
import useMoveElement from './useMoveElement' import useMoveElement from './useMoveElement'
import useOrderElement from './useOrderElement' import useOrderElement from './useOrderElement'
import useHistorySnapshot from './useHistorySnapshot' import useHistorySnapshot from './useHistorySnapshot'
@ -45,7 +45,7 @@ export default () => {
const { deleteElement } = useDeleteElement() const { deleteElement } = useDeleteElement()
const { lockElement } = useLockElement() const { lockElement } = useLockElement()
const { copyElement, cutElement, quickCopyElement } = useCopyAndPasteElement() const { copyElement, cutElement, quickCopyElement } = useCopyAndPasteElement()
const { selectAllElement } = useSelectAllElement() const { selectAllElements } = useSelectElement()
const { moveElement } = useMoveElement() const { moveElement } = useMoveElement()
const { orderElement } = useOrderElement() const { orderElement } = useOrderElement()
const { redo, undo } = useHistorySnapshot() const { redo, undo } = useHistorySnapshot()
@ -68,7 +68,7 @@ export default () => {
} }
const selectAll = () => { const selectAll = () => {
if (editorAreaFocus.value) selectAllElement() if (editorAreaFocus.value) selectAllElements()
if (thumbnailsFocus.value) selectAllSlide() if (thumbnailsFocus.value) selectAllSlide()
} }

View File

@ -0,0 +1,35 @@
import { storeToRefs } from 'pinia'
import { useSlidesStore, useMainStore } from '@/store'
export default () => {
const slidesStore = useSlidesStore()
const mainStore = useMainStore()
const { currentSlide } = storeToRefs(slidesStore)
const { activeElementIdList, hiddenElementIdList } = storeToRefs(mainStore)
const toggleHideElement = (id: string) => {
if (hiddenElementIdList.value.includes(id)) {
mainStore.setHiddenElementIdList(hiddenElementIdList.value.filter(item => item !== id))
}
else mainStore.setHiddenElementIdList([...hiddenElementIdList.value, id])
if (activeElementIdList.value.includes(id)) mainStore.setActiveElementIdList([])
}
const showAllElements = () => {
const currentSlideElIdList = currentSlide.value.elements.map(item => item.id)
const needHiddenElementIdList = hiddenElementIdList.value.filter(item => !currentSlideElIdList.includes(item))
mainStore.setHiddenElementIdList(needHiddenElementIdList)
}
const hideAllElements = () => {
const currentSlideElIdList = currentSlide.value.elements.map(item => item.id)
mainStore.setHiddenElementIdList([...hiddenElementIdList.value, ...currentSlideElIdList])
if (activeElementIdList.value.length) mainStore.setActiveElementIdList([])
}
return {
toggleHideElement,
showAllElements,
hideAllElements,
}
}

View File

@ -4,16 +4,28 @@ import { useMainStore, useSlidesStore } from '@/store'
export default () => { export default () => {
const mainStore = useMainStore() const mainStore = useMainStore()
const { currentSlide } = storeToRefs(useSlidesStore()) const { currentSlide } = storeToRefs(useSlidesStore())
const { hiddenElementIdList } = storeToRefs(mainStore) const { hiddenElementIdList, handleElementId } = storeToRefs(mainStore)
// 将当前页面全部元素设置为被选择状态 // 将当前页面全部元素设置为被选择状态
const selectAllElement = () => { const selectAllElements = () => {
const unlockedElements = currentSlide.value.elements.filter(el => !el.lock && !hiddenElementIdList.value.includes(el.id)) const unlockedElements = currentSlide.value.elements.filter(el => !el.lock && !hiddenElementIdList.value.includes(el.id))
const newActiveElementIdList = unlockedElements.map(el => el.id) const newActiveElementIdList = unlockedElements.map(el => el.id)
mainStore.setActiveElementIdList(newActiveElementIdList) mainStore.setActiveElementIdList(newActiveElementIdList)
} }
// 将指定元素设置为被选择状态
const selectElement = (id: string) => {
if (handleElementId.value === id) return
if (hiddenElementIdList.value.includes(id)) return
const lockedElements = currentSlide.value.elements.filter(el => el.lock)
if (lockedElements.some(el => el.id === id)) return
mainStore.setActiveElementIdList([id])
}
return { return {
selectAllElement, selectAllElements,
selectElement,
} }
} }

View File

@ -27,7 +27,7 @@ import useCombineElement from '@/hooks/useCombineElement'
import useOrderElement from '@/hooks/useOrderElement' import useOrderElement from '@/hooks/useOrderElement'
import useAlignElementToCanvas from '@/hooks/useAlignElementToCanvas' import useAlignElementToCanvas from '@/hooks/useAlignElementToCanvas'
import useCopyAndPasteElement from '@/hooks/useCopyAndPasteElement' import useCopyAndPasteElement from '@/hooks/useCopyAndPasteElement'
import useSelectAllElement from '@/hooks/useSelectAllElement' import useSelectElement from '@/hooks/useSelectElement'
import { ElementOrderCommands, ElementAlignCommands } from '@/types/edit' import { ElementOrderCommands, ElementAlignCommands } from '@/types/edit'
@ -70,7 +70,7 @@ const { combineElements, uncombineElements } = useCombineElement()
const { deleteElement } = useDeleteElement() const { deleteElement } = useDeleteElement()
const { lockElement, unlockElement } = useLockElement() const { lockElement, unlockElement } = useLockElement()
const { copyElement, pasteElement, cutElement } = useCopyAndPasteElement() const { copyElement, pasteElement, cutElement } = useCopyAndPasteElement()
const { selectAllElement } = useSelectAllElement() const { selectAllElements } = useSelectElement()
const contextmenus = (): ContextmenuItem[] => { const contextmenus = (): ContextmenuItem[] => {
if (props.elementInfo.lock) { if (props.elementInfo.lock) {
@ -150,7 +150,7 @@ const contextmenus = (): ContextmenuItem[] => {
{ {
text: '全选', text: '全选',
subText: 'Ctrl + A', subText: 'Ctrl + A',
handler: selectAllElement, handler: selectAllElements,
}, },
{ {
text: '锁定', text: '锁定',

View File

@ -166,11 +166,14 @@ const keydownListener = (e: KeyboardEvent) => {
} }
onMounted(() => { onMounted(() => {
message.success('点击绘制任意形状,首尾闭合完成绘制,按 ESC 键或鼠标右键取消,按 ENTER 键提前完成', { message.success('点击绘制任意形状,首尾闭合完成绘制,按 ESC 键或鼠标右键取消,按 ENTER 键提前完成', {
duration: 5000, duration: 0,
}) })
document.addEventListener('keydown', keydownListener) document.addEventListener('keydown', keydownListener)
}) })
onUnmounted(() => document.removeEventListener('keydown', keydownListener)) onUnmounted(() => {
document.removeEventListener('keydown', keydownListener)
message.closeAll()
})
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -113,7 +113,7 @@ import useMouseSelection from './hooks/useMouseSelection'
import useDropImageOrText from './hooks/useDropImageOrText' import useDropImageOrText from './hooks/useDropImageOrText'
import useRotateElement from './hooks/useRotateElement' import useRotateElement from './hooks/useRotateElement'
import useScaleElement from './hooks/useScaleElement' import useScaleElement from './hooks/useScaleElement'
import useSelectElement from './hooks/useSelectElement' import useSelectAndMoveElement from './hooks/useSelectElement'
import useDragElement from './hooks/useDragElement' import useDragElement from './hooks/useDragElement'
import useDragLineElement from './hooks/useDragLineElement' import useDragLineElement from './hooks/useDragLineElement'
import useMoveShapeKeypoint from './hooks/useMoveShapeKeypoint' import useMoveShapeKeypoint from './hooks/useMoveShapeKeypoint'
@ -121,7 +121,7 @@ import useInsertFromCreateSelection from './hooks/useInsertFromCreateSelection'
import useDeleteElement from '@/hooks/useDeleteElement' import useDeleteElement from '@/hooks/useDeleteElement'
import useCopyAndPasteElement from '@/hooks/useCopyAndPasteElement' import useCopyAndPasteElement from '@/hooks/useCopyAndPasteElement'
import useSelectAllElement from '@/hooks/useSelectAllElement' import useSelectElement from '@/hooks/useSelectElement'
import useScaleCanvas from '@/hooks/useScaleCanvas' import useScaleCanvas from '@/hooks/useScaleCanvas'
import useScreening from '@/hooks/useScreening' import useScreening from '@/hooks/useScreening'
import useSlideHandler from '@/hooks/useSlideHandler' import useSlideHandler from '@/hooks/useSlideHandler'
@ -181,12 +181,12 @@ const { mouseSelection, mouseSelectionVisible, mouseSelectionQuadrant, updateMou
const { dragElement } = useDragElement(elementList, alignmentLines, canvasScale) const { dragElement } = useDragElement(elementList, alignmentLines, canvasScale)
const { dragLineElement } = useDragLineElement(elementList) const { dragLineElement } = useDragLineElement(elementList)
const { selectElement } = useSelectElement(elementList, dragElement) const { selectElement } = useSelectAndMoveElement(elementList, dragElement)
const { scaleElement, scaleMultiElement } = useScaleElement(elementList, alignmentLines, canvasScale) const { scaleElement, scaleMultiElement } = useScaleElement(elementList, alignmentLines, canvasScale)
const { rotateElement } = useRotateElement(elementList, viewportRef, canvasScale) const { rotateElement } = useRotateElement(elementList, viewportRef, canvasScale)
const { moveShapeKeypoint } = useMoveShapeKeypoint(elementList, canvasScale) const { moveShapeKeypoint } = useMoveShapeKeypoint(elementList, canvasScale)
const { selectAllElement } = useSelectAllElement() const { selectAllElements } = useSelectElement()
const { deleteAllElements } = useDeleteElement() const { deleteAllElements } = useDeleteElement()
const { pasteElement } = useCopyAndPasteElement() const { pasteElement } = useCopyAndPasteElement()
const { enterScreeningFromStart } = useScreening() const { enterScreeningFromStart } = useScreening()
@ -297,7 +297,7 @@ const contextmenus = (): ContextmenuItem[] => {
{ {
text: '全选', text: '全选',
subText: 'Ctrl + A', subText: 'Ctrl + A',
handler: selectAllElement, handler: selectAllElements,
}, },
{ {
text: '标尺', text: '标尺',

View File

@ -311,11 +311,11 @@ const close = () => {
.footer { .footer {
margin-top: 5px; margin-top: 10px;
display: flex; display: flex;
.btn + .btn { .btn + .btn {
margin-left: 5px; margin-left: 8px;
flex-shrink: 0; flex-shrink: 0;
} }
} }

View File

@ -10,8 +10,8 @@
> >
<div class="handler" v-if="elements.length"> <div class="handler" v-if="elements.length">
<div class="btns"> <div class="btns">
<Button size="small" style="margin-right: 5px;" @click="showAll()">全部显示</Button> <Button size="small" style="margin-right: 5px;" @click="showAllElements()">全部显示</Button>
<Button size="small" @click="hideAll()">全部隐藏</Button> <Button size="small" @click="hideAllElements()">全部隐藏</Button>
</div> </div>
<div class="icon-btns" v-if="handleElement"> <div class="icon-btns" v-if="handleElement">
<IconDown class="icon-btn" @click="orderElement(handleElement!, ElementOrderCommands.UP)" /> <IconDown class="icon-btn" @click="orderElement(handleElement!, ElementOrderCommands.UP)" />
@ -44,8 +44,8 @@
> >
<div v-else class="name">{{groupItem.name || ELEMENT_TYPE_ZH[groupItem.type]}}</div> <div v-else class="name">{{groupItem.name || ELEMENT_TYPE_ZH[groupItem.type]}}</div>
<div class="icons"> <div class="icons">
<IconPreviewClose style="font-size: 17px;" @click.stop="hideElement(groupItem.id)" v-if="hiddenElementIdList.includes(groupItem.id)" /> <IconPreviewClose style="font-size: 17px;" @click.stop="toggleHideElement(groupItem.id)" v-if="hiddenElementIdList.includes(groupItem.id)" />
<IconPreviewOpen style="font-size: 17px;" @click.stop="hideElement(groupItem.id)" v-else /> <IconPreviewOpen style="font-size: 17px;" @click.stop="toggleHideElement(groupItem.id)" v-else />
</div> </div>
</div> </div>
</div> </div>
@ -53,7 +53,7 @@
class="item" class="item"
:class="{ 'active': activeElementIdList.includes(item.id) }" :class="{ 'active': activeElementIdList.includes(item.id) }"
v-else v-else
@click="selectEl(item.id)" @click="selectElement(item.id)"
@dblclick="enterEdit(item.id)" @dblclick="enterEdit(item.id)"
> >
<input <input
@ -67,8 +67,8 @@
> >
<div v-else class="name">{{item.name || ELEMENT_TYPE_ZH[item.type]}}</div> <div v-else class="name">{{item.name || ELEMENT_TYPE_ZH[item.type]}}</div>
<div class="icons"> <div class="icons">
<IconPreviewClose style="font-size: 17px;" @click.stop="hideElement(item.id)" v-if="hiddenElementIdList.includes(item.id)" /> <IconPreviewClose style="font-size: 17px;" @click.stop="toggleHideElement(item.id)" v-if="hiddenElementIdList.includes(item.id)" />
<IconPreviewOpen style="font-size: 17px;" @click.stop="hideElement(item.id)" v-else /> <IconPreviewOpen style="font-size: 17px;" @click.stop="toggleHideElement(item.id)" v-else />
</div> </div>
</div> </div>
</template> </template>
@ -83,6 +83,8 @@ import { useSlidesStore, useMainStore } from '@/store'
import type { PPTElement } from '@/types/slides' import type { PPTElement } from '@/types/slides'
import { ELEMENT_TYPE_ZH } from '@/configs/element' import { ELEMENT_TYPE_ZH } from '@/configs/element'
import useOrderElement from '@/hooks/useOrderElement' import useOrderElement from '@/hooks/useOrderElement'
import useHideElement from '@/hooks/useHideElement'
import useSelectElement from '@/hooks/useSelectElement'
import { ElementOrderCommands } from '@/types/edit' import { ElementOrderCommands } from '@/types/edit'
import MoveablePanel from '@/components/MoveablePanel.vue' import MoveablePanel from '@/components/MoveablePanel.vue'
@ -94,6 +96,8 @@ const { currentSlide } = storeToRefs(slidesStore)
const { handleElement, handleElementId, activeElementIdList, activeGroupElementId, hiddenElementIdList } = storeToRefs(mainStore) const { handleElement, handleElementId, activeElementIdList, activeGroupElementId, hiddenElementIdList } = storeToRefs(mainStore)
const { orderElement } = useOrderElement() const { orderElement } = useOrderElement()
const { selectElement } = useSelectElement()
const { toggleHideElement, showAllElements, hideAllElements } = useHideElement()
interface GroupElements { interface GroupElements {
type: 'group' type: 'group'
@ -130,33 +134,6 @@ const selectGroupEl = (item: GroupElements, id: string) => {
nextTick(() => mainStore.setActiveGroupElementId(id)) nextTick(() => mainStore.setActiveGroupElementId(id))
} }
const selectEl = (id: string) => {
if (handleElementId.value === id) return
if (hiddenElementIdList.value.includes(id)) return
mainStore.setActiveElementIdList([id])
}
const hideElement = (id: string) => {
if (hiddenElementIdList.value.includes(id)) {
mainStore.setHiddenElementIdList(hiddenElementIdList.value.filter(item => item !== id))
}
else mainStore.setHiddenElementIdList([...hiddenElementIdList.value, id])
if (activeElementIdList.value.includes(id)) mainStore.setActiveElementIdList([])
}
const showAll = () => {
const currentSlideElIdList = currentSlide.value.elements.map(item => item.id)
const needHiddenElementIdList = hiddenElementIdList.value.filter(item => !currentSlideElIdList.includes(item))
mainStore.setHiddenElementIdList(needHiddenElementIdList)
}
const hideAll = () => {
const currentSlideElIdList = currentSlide.value.elements.map(item => item.id)
mainStore.setHiddenElementIdList([...hiddenElementIdList.value, ...currentSlideElIdList])
if (activeElementIdList.value.length) mainStore.setActiveElementIdList([])
}
const editingElId = ref('') const editingElId = ref('')
const saveElementName = (e: FocusEvent | KeyboardEvent, id: string) => { const saveElementName = (e: FocusEvent | KeyboardEvent, id: string) => {