File size: 2,124 Bytes
89ce340
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<template>

  <div class="text-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" 

        :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 { PPTTextElement } 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: PPTTextElement

  handlerVisible: boolean

  rotateElement: (e: MouseEvent, element: PPTTextElement) => void

  scaleElement: (e: MouseEvent, element: PPTTextElement, command: OperateResizeHandlers) => void

}>()



const { canvasScale } = storeToRefs(useMainStore())



const scaleWidth = computed(() => props.elementInfo.width * canvasScale.value)

const scaleHeight = computed(() => props.elementInfo.height * canvasScale.value)



const { textElementResizeHandlers, verticalTextElementResizeHandlers, borderLines } = useCommonOperate(scaleWidth, scaleHeight)

const resizeHandlers = computed(() => props.elementInfo.vertical ? verticalTextElementResizeHandlers.value : textElementResizeHandlers.value)

</script>