| <template> | |
| <div class="common-element-operate"> | |
| <BorderLine | |
| class="operate-border-line" | |
| v-for="line in borderLines" | |
| :key="line.type" | |
| :type="line.type" | |
| :style="line.style" | |
| /> | |
| <template v-if="handlerVisible"> | |
| <ResizeHandler | |
| class="operate-resize-handler" | |
| v-for="point in resizeHandlers" | |
| :key="point.direction" | |
| :type="point.direction" | |
| :rotate="elementInfo.rotate" | |
| :style="point.style" | |
| @mousedown.stop="$event => scaleElement($event, elementInfo, point.direction)" | |
| /> | |
| <RotateHandler | |
| class="operate-rotate-handler" | |
| v-if="!cannotRotate" | |
| :style="{ left: scaleWidth / 2 + 'px' }" | |
| @mousedown.stop="$event => rotateElement($event, elementInfo)" | |
| /> | |
| </template> | |
| </div> | |
| </template> | |
| <script lang="ts"> | |
| export default { | |
| inheritAttrs: false, | |
| } | |
| </script> | |
| <script lang="ts" setup> | |
| import { computed } from 'vue' | |
| import { storeToRefs } from 'pinia' | |
| import { useMainStore } from '@/store' | |
| import type { PPTVideoElement, PPTLatexElement, PPTAudioElement, PPTChartElement } from '@/types/slides' | |
| import type { OperateResizeHandlers } from '@/types/edit' | |
| import useCommonOperate from '../hooks/useCommonOperate' | |
| import RotateHandler from './RotateHandler.vue' | |
| import ResizeHandler from './ResizeHandler.vue' | |
| import BorderLine from './BorderLine.vue' | |
| type PPTElement = PPTVideoElement | PPTLatexElement | PPTAudioElement | PPTChartElement | |
| const props = defineProps<{ | |
| elementInfo: PPTElement | |
| handlerVisible: boolean | |
| rotateElement: (e: MouseEvent, element: PPTElement) => void | |
| scaleElement: (e: MouseEvent, element: PPTElement, command: OperateResizeHandlers) => void | |
| }>() | |
| const { canvasScale } = storeToRefs(useMainStore()) | |
| const scaleWidth = computed(() => props.elementInfo.width * canvasScale.value) | |
| const scaleHeight = computed(() => props.elementInfo.height * canvasScale.value) | |
| const { resizeHandlers, borderLines } = useCommonOperate(scaleWidth, scaleHeight) | |
| const cannotRotate = computed(() => ['chart', 'video', 'audio'].includes(props.elementInfo.type)) | |
| </script> |