mirror of
https://github.com/pipipi-pikachu/PPTist.git
synced 2025-04-15 02:20:00 +08:00
perf: 代码优化、UI调整
This commit is contained in:
parent
aba93ce0ed
commit
c60208a117
@ -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()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
35
src/hooks/useHideElement.ts
Normal file
35
src/hooks/useHideElement.ts
Normal 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,
|
||||||
|
}
|
||||||
|
}
|
@ -1,19 +1,31 @@
|
|||||||
import { storeToRefs } from 'pinia'
|
import { storeToRefs } from 'pinia'
|
||||||
import { useMainStore, useSlidesStore } from '@/store'
|
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
// 将指定元素设置为被选择状态
|
||||||
selectAllElement,
|
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 {
|
||||||
|
selectAllElements,
|
||||||
|
selectElement,
|
||||||
|
}
|
||||||
}
|
}
|
@ -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: '锁定',
|
||||||
|
@ -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>
|
||||||
|
@ -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: '标尺',
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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) => {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user