|
<template>
|
|
<div class="image-element-operate" :class="{ 'cliping': isCliping }">
|
|
<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"
|
|
: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 { PPTImageElement } 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'
|
|
|
|
const props = defineProps<{
|
|
elementInfo: PPTImageElement
|
|
handlerVisible: boolean
|
|
rotateElement: (e: MouseEvent, element: PPTImageElement) => void
|
|
scaleElement: (e: MouseEvent, element: PPTImageElement, command: OperateResizeHandlers) => void
|
|
}>()
|
|
|
|
const { canvasScale, clipingImageElementId } = storeToRefs(useMainStore())
|
|
|
|
const isCliping = computed(() => clipingImageElementId.value === props.elementInfo.id)
|
|
|
|
const scaleWidth = computed(() => props.elementInfo.width * canvasScale.value)
|
|
const scaleHeight = computed(() => props.elementInfo.height * canvasScale.value)
|
|
const { resizeHandlers, borderLines } = useCommonOperate(scaleWidth, scaleHeight)
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.image-element-operate.cliping {
|
|
visibility: hidden;
|
|
}
|
|
</style> |