perf: 形状内文字编辑优化

This commit is contained in:
pipipi-pikachu 2022-05-03 18:37:02 +08:00
parent 54b122b77e
commit d6ba32c190
3 changed files with 11 additions and 38 deletions

View File

@ -26,7 +26,6 @@ export interface MainState {
isScaling: boolean; isScaling: boolean;
richTextAttrs: TextAttrs; richTextAttrs: TextAttrs;
selectedTableCells: string[]; selectedTableCells: string[];
editingShapeElementId: string;
selectedSlidesIndex: number[]; selectedSlidesIndex: number[];
} }
@ -50,7 +49,6 @@ export const useMainStore = defineStore('main', {
richTextAttrs: defaultRichTextAttrs, // 富文本状态 richTextAttrs: defaultRichTextAttrs, // 富文本状态
selectedTableCells: [], // 选中的表格单元格 selectedTableCells: [], // 选中的表格单元格
isScaling: false, // 正在进行元素缩放 isScaling: false, // 正在进行元素缩放
editingShapeElementId: '', // 当前正处在编辑文字状态的形状ID
selectedSlidesIndex: [], // 当前被选中的页面索引集合 selectedSlidesIndex: [], // 当前被选中的页面索引集合
}), }),
@ -145,10 +143,6 @@ export const useMainStore = defineStore('main', {
setScalingState(isScaling: boolean) { setScalingState(isScaling: boolean) {
this.isScaling = isScaling this.isScaling = isScaling
}, },
setEditingShapeElementId(ellId: string) {
this.editingShapeElementId = ellId
},
updateSelectedSlidesIndex(selectedSlidesIndex: number[]) { updateSelectedSlidesIndex(selectedSlidesIndex: number[]) {
this.selectedSlidesIndex = selectedSlidesIndex this.selectedSlidesIndex = selectedSlidesIndex

View File

@ -71,7 +71,7 @@
<ElementFlip /> <ElementFlip />
<Divider /> <Divider />
<template v-if="showTextTools"> <template v-if="handleElement?.text?.content">
<InputGroup compact class="row"> <InputGroup compact class="row">
<Select <Select
style="flex: 3;" style="flex: 3;"
@ -195,7 +195,7 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { computed, defineComponent, ref, watch } from 'vue' import { defineComponent, ref, watch } from 'vue'
import { storeToRefs } from 'pinia' import { storeToRefs } from 'pinia'
import { useMainStore, useSlidesStore } from '@/store' import { useMainStore, useSlidesStore } from '@/store'
import { PPTShapeElement, ShapeGradient, ShapeText } from '@/types/slides' import { PPTShapeElement, ShapeGradient, ShapeText } from '@/types/slides'
@ -223,9 +223,7 @@ export default defineComponent({
setup() { setup() {
const mainStore = useMainStore() const mainStore = useMainStore()
const slidesStore = useSlidesStore() const slidesStore = useSlidesStore()
const { handleElement, handleElementId, editingShapeElementId, richTextAttrs, availableFonts } = storeToRefs(mainStore) const { handleElement, handleElementId, richTextAttrs, availableFonts } = storeToRefs(mainStore)
const showTextTools = computed(() => editingShapeElementId.value === handleElementId.value)
const fill = ref<string>() const fill = ref<string>()
const gradient = ref<ShapeGradient>() const gradient = ref<ShapeGradient>()
@ -301,7 +299,7 @@ export default defineComponent({
availableFonts, availableFonts,
fontSizeOptions, fontSizeOptions,
webFonts, webFonts,
showTextTools, handleElement,
emitRichTextCommand, emitRichTextCommand,
updateFillType, updateFillType,
updateFill, updateFill,

View File

@ -24,7 +24,7 @@
}" }"
v-contextmenu="contextmenus" v-contextmenu="contextmenus"
@mousedown="$event => handleSelectElement($event)" @mousedown="$event => handleSelectElement($event)"
@dblclick="enterEditing()" @dblclick="editable = true"
> >
<svg <svg
overflow="visible" overflow="visible"
@ -58,9 +58,9 @@
</g> </g>
</svg> </svg>
<div class="shape-text" :class="[text.align, { 'editable': editable }]"> <div class="shape-text" :class="[text.align, { 'editable': editable || text.content }]">
<ProsemirrorEditor <ProsemirrorEditor
v-if="editable" v-if="editable || text.content"
:elementId="elementInfo.id" :elementId="elementInfo.id"
:defaultColor="text.defaultColor" :defaultColor="text.defaultColor"
:defaultFontName="text.defaultFontName" :defaultFontName="text.defaultFontName"
@ -68,13 +68,8 @@
:autoFocus="true" :autoFocus="true"
:value="text.content" :value="text.content"
@update="value => updateText(value)" @update="value => updateText(value)"
@mousedown.stop @mousedown="$event => handleSelectElement($event, false)"
/> />
<div
class="show-text ProseMirror-static"
v-else
v-html="text.content"
></div>
</div> </div>
</div> </div>
</div> </div>
@ -121,11 +116,11 @@ export default defineComponent({
const { addHistorySnapshot } = useHistorySnapshot() const { addHistorySnapshot } = useHistorySnapshot()
const handleSelectElement = (e: MouseEvent) => { const handleSelectElement = (e: MouseEvent, canMove = true) => {
if (props.elementInfo.lock) return if (props.elementInfo.lock) return
e.stopPropagation() e.stopPropagation()
props.selectElement(e, props.elementInfo) props.selectElement(e, props.elementInfo, canMove)
} }
const outline = computed(() => props.elementInfo.outline) const outline = computed(() => props.elementInfo.outline)
@ -139,20 +134,10 @@ export default defineComponent({
const { flipStyle } = useElementFlip(flipH, flipV) const { flipStyle } = useElementFlip(flipH, flipV)
const editable = ref(false) const editable = ref(false)
const enterEditing = () => {
editable.value = true
mainStore.setEditingShapeElementId(props.elementInfo.id)
}
const exitEditing = () => {
editable.value = false
mainStore.setEditingShapeElementId('')
}
watch(handleElementId, () => { watch(handleElementId, () => {
if (handleElementId.value !== props.elementInfo.id) { if (handleElementId.value !== props.elementInfo.id) {
if (editable.value) exitEditing() if (editable.value) editable.value = false
} }
}) })
@ -188,7 +173,6 @@ export default defineComponent({
text, text,
handleSelectElement, handleSelectElement,
updateText, updateText,
enterEditing,
} }
}, },
}) })
@ -249,7 +233,4 @@ export default defineComponent({
justify-content: flex-end; justify-content: flex-end;
} }
} }
.show-text {
pointer-events: none;
}
</style> </style>