| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- <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>
|