ImageElementOperate.vue 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. <template>
  2. <div class="image-element-operate" :class="{ 'cliping': isCliping }">
  3. <BorderLine
  4. class="operate-border-line"
  5. v-for="line in borderLines"
  6. :key="line.type"
  7. :type="line.type"
  8. :style="line.style"
  9. />
  10. <template v-if="handlerVisible">
  11. <ResizeHandler
  12. class="operate-resize-handler"
  13. v-for="point in resizeHandlers"
  14. :key="point.direction"
  15. :type="point.direction"
  16. :rotate="elementInfo.rotate"
  17. :style="point.style"
  18. @mousedown.stop="$event => scaleElement($event, elementInfo, point.direction)"
  19. />
  20. <RotateHandler
  21. class="operate-rotate-handler"
  22. :style="{ left: scaleWidth / 2 + 'px' }"
  23. @mousedown.stop="$event => rotateElement($event, elementInfo)"
  24. />
  25. </template>
  26. </div>
  27. </template>
  28. <script lang="ts">
  29. export default {
  30. inheritAttrs: false,
  31. }
  32. </script>
  33. <script lang="ts" setup>
  34. import { computed } from 'vue'
  35. import { storeToRefs } from 'pinia'
  36. import { useMainStore } from '@/store'
  37. import type { PPTImageElement } from '@/types/slides'
  38. import type { OperateResizeHandlers } from '@/types/edit'
  39. import useCommonOperate from '../hooks/useCommonOperate'
  40. import RotateHandler from './RotateHandler.vue'
  41. import ResizeHandler from './ResizeHandler.vue'
  42. import BorderLine from './BorderLine.vue'
  43. const props = defineProps<{
  44. elementInfo: PPTImageElement
  45. handlerVisible: boolean
  46. rotateElement: (e: MouseEvent, element: PPTImageElement) => void
  47. scaleElement: (e: MouseEvent, element: PPTImageElement, command: OperateResizeHandlers) => void
  48. }>()
  49. const { canvasScale, clipingImageElementId } = storeToRefs(useMainStore())
  50. const isCliping = computed(() => clipingImageElementId.value === props.elementInfo.id)
  51. const scaleWidth = computed(() => props.elementInfo.width * canvasScale.value)
  52. const scaleHeight = computed(() => props.elementInfo.height * canvasScale.value)
  53. const { resizeHandlers, borderLines } = useCommonOperate(scaleWidth, scaleHeight)
  54. </script>
  55. <style lang="scss" scoped>
  56. .image-element-operate.cliping {
  57. visibility: hidden;
  58. }
  59. </style>