|
<template> |
|
<div class="latex-style-panel"> |
|
<div class="row"> |
|
<Button style="flex: 1;" @click="latexEditorVisible = true">编辑 LaTeX</Button> |
|
</div> |
|
|
|
<Divider /> |
|
|
|
<div class="row"> |
|
<div style="width: 40%;">颜色:</div> |
|
<Popover trigger="click" style="width: 60%;"> |
|
<template #content> |
|
<ColorPicker |
|
:modelValue="handleLatexElement.color" |
|
@update:modelValue="value => updateLatex({ color: value })" |
|
/> |
|
</template> |
|
<ColorButton :color="handleLatexElement.color" /> |
|
</Popover> |
|
</div> |
|
<div class="row"> |
|
<div style="width: 40%;">粗细:</div> |
|
<NumberInput |
|
:min="1" |
|
:max="3" |
|
:value="handleLatexElement.strokeWidth" |
|
@update:value="value => updateLatex({ strokeWidth: value })" |
|
style="width: 60%;" |
|
/> |
|
</div> |
|
|
|
<Modal |
|
v-model:visible="latexEditorVisible" |
|
:width="880" |
|
> |
|
<LaTeXEditor |
|
:value="handleLatexElement.latex" |
|
@close="latexEditorVisible = false" |
|
@update="data => { updateLatexData(data); latexEditorVisible = false }" |
|
/> |
|
</Modal> |
|
</div> |
|
</template> |
|
|
|
<script lang="ts" setup> |
|
import { onUnmounted, ref, type Ref } from 'vue' |
|
import { storeToRefs } from 'pinia' |
|
import { useMainStore, useSlidesStore } from '@/store' |
|
import type { PPTLatexElement } from '@/types/slides' |
|
import emitter, { EmitterEvents } from '@/utils/emitter' |
|
import useHistorySnapshot from '@/hooks/useHistorySnapshot' |
|
|
|
import ColorButton from '@/components/ColorButton.vue' |
|
import LaTeXEditor from '@/components/LaTeXEditor/index.vue' |
|
import ColorPicker from '@/components/ColorPicker/index.vue' |
|
import Modal from '@/components/Modal.vue' |
|
import Divider from '@/components/Divider.vue' |
|
import Button from '@/components/Button.vue' |
|
import NumberInput from '@/components/NumberInput.vue' |
|
import Popover from '@/components/Popover.vue' |
|
|
|
const slidesStore = useSlidesStore() |
|
const { handleElement } = storeToRefs(useMainStore()) |
|
|
|
const handleLatexElement = handleElement as Ref<PPTLatexElement> |
|
|
|
const latexEditorVisible = ref(false) |
|
|
|
const { addHistorySnapshot } = useHistorySnapshot() |
|
|
|
const updateLatex = (props: Partial<PPTLatexElement>) => { |
|
if (!handleElement.value) return |
|
slidesStore.updateElement({ id: handleElement.value.id, props }) |
|
addHistorySnapshot() |
|
} |
|
|
|
const updateLatexData = (data: { path: string; latex: string; w: number; h: number; }) => { |
|
updateLatex({ |
|
path: data.path, |
|
latex: data.latex, |
|
width: data.w, |
|
height: data.h, |
|
viewBox: [data.w, data.h], |
|
}) |
|
} |
|
|
|
const openLatexEditor = () => latexEditorVisible.value = true |
|
|
|
emitter.on(EmitterEvents.OPEN_LATEX_EDITOR, openLatexEditor) |
|
onUnmounted(() => { |
|
emitter.off(EmitterEvents.OPEN_LATEX_EDITOR, openLatexEditor) |
|
}) |
|
</script> |
|
|
|
<style lang="scss" scoped> |
|
.row { |
|
width: 100%; |
|
display: flex; |
|
align-items: center; |
|
margin-bottom: 10px; |
|
} |
|
</style> |