mirror of
https://github.com/pipipi-pikachu/PPTist.git
synced 2025-04-15 02:20:00 +08:00
perf: 形状内文字编辑优化
This commit is contained in:
parent
54b122b77e
commit
d6ba32c190
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user