From 9061ae544bbce37fa8188653f712cfd71a790be1 Mon Sep 17 00:00:00 2001 From: pipipi-pikachu Date: Sun, 30 Jul 2023 21:15:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=A7=BB=E5=8A=A8=E7=AB=AF=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=97=8B=E8=BD=AC=EF=BC=88#214=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Canvas/Operate/CommonElementOperate.vue | 8 ++-- .../Canvas/Operate/ImageElementOperate.vue | 4 +- .../Canvas/Operate/ShapeElementOperate.vue | 4 +- .../Canvas/Operate/TableElementOperate.vue | 4 +- .../Canvas/Operate/TextElementOperate.vue | 4 +- src/views/Editor/Canvas/Operate/index.vue | 12 +++++- .../Editor/Canvas/hooks/useRotateElement.ts | 37 ++++++++++++++----- src/views/Editor/Canvas/index.vue | 2 +- .../Mobile/MobileEditor/MobileOperate.vue | 14 ++++++- src/views/Mobile/MobileEditor/index.vue | 6 ++- 10 files changed, 68 insertions(+), 27 deletions(-) diff --git a/src/views/Editor/Canvas/Operate/CommonElementOperate.vue b/src/views/Editor/Canvas/Operate/CommonElementOperate.vue index 0ce3913f..b7d2f236 100644 --- a/src/views/Editor/Canvas/Operate/CommonElementOperate.vue +++ b/src/views/Editor/Canvas/Operate/CommonElementOperate.vue @@ -21,7 +21,7 @@ class="operate-rotate-handler" v-if="!cannotRotate" :style="{ left: scaleWidth / 2 + 'px' }" - @mousedown.stop="rotateElement(elementInfo)" + @mousedown.stop="$event => rotateElement($event, elementInfo)" /> @@ -37,7 +37,7 @@ export default { import { computed } from 'vue' import { storeToRefs } from 'pinia' import { useMainStore } from '@/store' -import type { PPTShapeElement, PPTVideoElement, PPTLatexElement, PPTAudioElement } from '@/types/slides' +import type { PPTVideoElement, PPTLatexElement, PPTAudioElement, PPTChartElement } from '@/types/slides' import type { OperateResizeHandlers } from '@/types/edit' import useCommonOperate from '../hooks/useCommonOperate' @@ -45,12 +45,12 @@ import RotateHandler from './RotateHandler.vue' import ResizeHandler from './ResizeHandler.vue' import BorderLine from './BorderLine.vue' -type PPTElement = PPTShapeElement | PPTVideoElement | PPTLatexElement | PPTAudioElement +type PPTElement = PPTVideoElement | PPTLatexElement | PPTAudioElement | PPTChartElement const props = defineProps<{ elementInfo: PPTElement handlerVisible: boolean - rotateElement: (element: PPTElement) => void + rotateElement: (e: MouseEvent, element: PPTElement) => void scaleElement: (e: MouseEvent, element: PPTElement, command: OperateResizeHandlers) => void }>() diff --git a/src/views/Editor/Canvas/Operate/ImageElementOperate.vue b/src/views/Editor/Canvas/Operate/ImageElementOperate.vue index fc88f44a..bf728c24 100644 --- a/src/views/Editor/Canvas/Operate/ImageElementOperate.vue +++ b/src/views/Editor/Canvas/Operate/ImageElementOperate.vue @@ -20,7 +20,7 @@ @@ -47,7 +47,7 @@ import BorderLine from './BorderLine.vue' const props = defineProps<{ elementInfo: PPTImageElement handlerVisible: boolean - rotateElement: (element: PPTImageElement) => void + rotateElement: (e: MouseEvent, element: PPTImageElement) => void scaleElement: (e: MouseEvent, element: PPTImageElement, command: OperateResizeHandlers) => void }>() diff --git a/src/views/Editor/Canvas/Operate/ShapeElementOperate.vue b/src/views/Editor/Canvas/Operate/ShapeElementOperate.vue index 456a8027..6877fdc4 100644 --- a/src/views/Editor/Canvas/Operate/ShapeElementOperate.vue +++ b/src/views/Editor/Canvas/Operate/ShapeElementOperate.vue @@ -20,7 +20,7 @@
void + rotateElement: (e: MouseEvent, element: PPTShapeElement) => void scaleElement: (e: MouseEvent, element: PPTShapeElement, command: OperateResizeHandlers) => void moveShapeKeypoint: (e: MouseEvent, element: PPTShapeElement) => void }>() diff --git a/src/views/Editor/Canvas/Operate/TableElementOperate.vue b/src/views/Editor/Canvas/Operate/TableElementOperate.vue index 040eb369..b4811dca 100644 --- a/src/views/Editor/Canvas/Operate/TableElementOperate.vue +++ b/src/views/Editor/Canvas/Operate/TableElementOperate.vue @@ -20,7 +20,7 @@
@@ -47,7 +47,7 @@ import BorderLine from './BorderLine.vue' const props = defineProps<{ elementInfo: PPTTableElement handlerVisible: boolean - rotateElement: (element: PPTTableElement) => void + rotateElement: (e: MouseEvent, element: PPTTableElement) => void scaleElement: (e: MouseEvent, element: PPTTableElement, command: OperateResizeHandlers) => void }>() diff --git a/src/views/Editor/Canvas/Operate/TextElementOperate.vue b/src/views/Editor/Canvas/Operate/TextElementOperate.vue index be5c4ffa..68caf462 100644 --- a/src/views/Editor/Canvas/Operate/TextElementOperate.vue +++ b/src/views/Editor/Canvas/Operate/TextElementOperate.vue @@ -20,7 +20,7 @@ @@ -47,7 +47,7 @@ import BorderLine from './BorderLine.vue' const props = defineProps<{ elementInfo: PPTTextElement handlerVisible: boolean - rotateElement: (element: PPTTextElement) => void + rotateElement: (e: MouseEvent, element: PPTTextElement) => void scaleElement: (e: MouseEvent, element: PPTTextElement, command: OperateResizeHandlers) => void }>() diff --git a/src/views/Editor/Canvas/Operate/index.vue b/src/views/Editor/Canvas/Operate/index.vue index 9951fa2a..c931ad3e 100644 --- a/src/views/Editor/Canvas/Operate/index.vue +++ b/src/views/Editor/Canvas/Operate/index.vue @@ -41,7 +41,15 @@ import { computed } from 'vue' import { storeToRefs } from 'pinia' import { useMainStore, useSlidesStore } from '@/store' -import { ElementTypes, type PPTElement, type PPTLineElement, type PPTVideoElement, type PPTAudioElement, type PPTShapeElement } from '@/types/slides' +import { + ElementTypes, + type PPTElement, + type PPTLineElement, + type PPTVideoElement, + type PPTAudioElement, + type PPTShapeElement, + type PPTChartElement, +} from '@/types/slides' import type { OperateLineHandlers, OperateResizeHandlers } from '@/types/edit' import ImageElementOperate from './ImageElementOperate.vue' @@ -58,7 +66,7 @@ const props = defineProps<{ isActive: boolean isActiveGroupElement: boolean isMultiSelect: boolean - rotateElement: (element: Exclude) => void + rotateElement: (e: MouseEvent, element: Exclude) => void scaleElement: (e: MouseEvent, element: Exclude, command: OperateResizeHandlers) => void dragLineElement: (e: MouseEvent, element: PPTLineElement, command: OperateLineHandlers) => void moveShapeKeypoint: (e: MouseEvent, element: PPTShapeElement) => void diff --git a/src/views/Editor/Canvas/hooks/useRotateElement.ts b/src/views/Editor/Canvas/hooks/useRotateElement.ts index f60c4448..5813732f 100644 --- a/src/views/Editor/Canvas/hooks/useRotateElement.ts +++ b/src/views/Editor/Canvas/hooks/useRotateElement.ts @@ -1,7 +1,6 @@ import type { Ref } from 'vue' -import { storeToRefs } from 'pinia' -import { useMainStore, useSlidesStore } from '@/store' -import type { PPTElement, PPTLineElement, PPTVideoElement, PPTAudioElement } from '@/types/slides' +import { useSlidesStore } from '@/store' +import type { PPTElement, PPTLineElement, PPTVideoElement, PPTAudioElement, PPTChartElement } from '@/types/slides' import useHistorySnapshot from '@/hooks/useHistorySnapshot' /** @@ -15,14 +14,20 @@ const getAngleFromCoordinate = (x: number, y: number) => { return angle } -export default (elementList: Ref, viewportRef: Ref) => { +export default ( + elementList: Ref, + viewportRef: Ref, + canvasScale: Ref, +) => { const slidesStore = useSlidesStore() - const { canvasScale } = storeToRefs(useMainStore()) const { addHistorySnapshot } = useHistorySnapshot() // 旋转元素 - const rotateElement = (element: Exclude) => { + const rotateElement = (e: MouseEvent | TouchEvent, element: Exclude) => { + const isTouchEvent = !(e instanceof MouseEvent) + if (isTouchEvent && (!e.changedTouches || !e.changedTouches[0])) return + let isMouseDown = true let angle = 0 const elOriginRotate = element.rotate || 0 @@ -39,12 +44,15 @@ export default (elementList: Ref, viewportRef: Ref { + const handleMousemove = (e: MouseEvent | TouchEvent) => { if (!isMouseDown) return + + const currentPageX = e instanceof MouseEvent ? e.pageX : e.changedTouches[0].pageX + const currentPageY = e instanceof MouseEvent ? e.pageY : e.changedTouches[0].pageY // 计算当前鼠标位置相对元素中心点连线的角度(弧度) - const mouseX = (e.pageX - viewportRect.left) / canvasScale.value - const mouseY = (e.pageY - viewportRect.top) / canvasScale.value + const mouseX = (currentPageX - viewportRect.left) / canvasScale.value + const mouseY = (currentPageY - viewportRect.top) / canvasScale.value const x = mouseX - centerX const y = centerY - mouseY @@ -65,7 +73,7 @@ export default (elementList: Ref, viewportRef: Ref element.id === el.id ? { ...el, rotate: angle } : el) } - document.onmouseup = () => { + const handleMouseup = () => { isMouseDown = false document.onmousemove = null document.onmouseup = null @@ -75,6 +83,15 @@ export default (elementList: Ref, viewportRef: Ref +