From bfb24e5055cda2aa409f94c541b25ef5178c7f90 Mon Sep 17 00:00:00 2001 From: pipipi-pikachu <1171051090@qq.com> Date: Fri, 25 Dec 2020 15:43:33 +0800 Subject: [PATCH] update --- src/types/edit.ts | 17 ++ src/views/Editor/Canvas/AlignmentLine.vue | 16 +- .../Canvas/Operate}/AnimationIndex.vue | 0 .../Canvas/Operate}/BorderLine.vue | 0 .../Canvas/Operate}/ImageClipHandler.vue | 24 +- .../Canvas/Operate/ImageElementOperate.vue | 169 +++++++++++++ .../{ => Operate}/MultiSelectOperate.vue | 13 +- .../Canvas/Operate}/ResizeHandler.vue | 0 .../Editor/Canvas/Operate/RotateHandler.vue | 22 ++ .../Canvas/Operate/TextElementOperate.vue | 131 ++++++++++ src/views/Editor/Canvas/Operate/index.vue | 97 ++++++++ .../Canvas}/hooks/useCommonOperate.ts | 8 + .../Editor/Canvas/hooks/useDragElement.ts | 12 +- .../Editor/Canvas/hooks/useScaleElement.ts | 4 +- src/views/Editor/Canvas/index.vue | 64 +++-- src/views/Editor/Thumbnails/index.vue | 2 +- src/views/Screen/ScreenSlide.vue | 2 +- src/views/Screen/index.vue | 4 +- src/views/{_common => }/ThumbnailSlide.vue | 2 +- .../_common/_element/TextElement/index.vue | 223 ------------------ src/views/_common/_operate/RotateHandler.vue | 34 --- .../{_common => }/_element/BaseElement.vue | 0 .../_element/EditableElement.vue | 42 +--- .../{_common => }/_element/ElementOutline.vue | 2 +- .../ImageElement/BaseImageElement.vue | 2 +- .../ImageElement/ImageEllipseOutline.vue | 2 +- .../ImageElement/ImagePolygonOutline.vue | 2 +- .../ImageElement/ImageRectOutline.vue | 2 +- .../_element/ImageElement/index.vue | 195 ++------------- .../_element/TextElement/BaseTextElement.vue | 4 +- src/views/_element/TextElement/index.vue | 111 +++++++++ .../_element/hooks/useElementOutline.ts | 0 .../_element/hooks/useElementShadow.ts | 0 33 files changed, 650 insertions(+), 556 deletions(-) rename src/views/{_common/_operate => Editor/Canvas/Operate}/AnimationIndex.vue (100%) rename src/views/{_common/_operate => Editor/Canvas/Operate}/BorderLine.vue (100%) rename src/views/{_common/_element/ImageElement => Editor/Canvas/Operate}/ImageClipHandler.vue (93%) create mode 100644 src/views/Editor/Canvas/Operate/ImageElementOperate.vue rename src/views/Editor/Canvas/{ => Operate}/MultiSelectOperate.vue (88%) rename src/views/{_common/_operate => Editor/Canvas/Operate}/ResizeHandler.vue (100%) create mode 100644 src/views/Editor/Canvas/Operate/RotateHandler.vue create mode 100644 src/views/Editor/Canvas/Operate/TextElementOperate.vue create mode 100644 src/views/Editor/Canvas/Operate/index.vue rename src/views/{_common/_element => Editor/Canvas}/hooks/useCommonOperate.ts (82%) rename src/views/{_common => }/ThumbnailSlide.vue (95%) delete mode 100644 src/views/_common/_element/TextElement/index.vue delete mode 100644 src/views/_common/_operate/RotateHandler.vue rename src/views/{_common => }/_element/BaseElement.vue (100%) rename src/views/{_common => }/_element/EditableElement.vue (75%) rename src/views/{_common => }/_element/ElementOutline.vue (89%) rename src/views/{_common => }/_element/ImageElement/BaseImageElement.vue (98%) rename src/views/{_common => }/_element/ImageElement/ImageEllipseOutline.vue (89%) rename src/views/{_common => }/_element/ImageElement/ImagePolygonOutline.vue (89%) rename src/views/{_common => }/_element/ImageElement/ImageRectOutline.vue (89%) rename src/views/{_common => }/_element/ImageElement/index.vue (51%) rename src/views/{_common => }/_element/TextElement/BaseTextElement.vue (91%) create mode 100644 src/views/_element/TextElement/index.vue rename src/views/{_common => }/_element/hooks/useElementOutline.ts (100%) rename src/views/{_common => }/_element/hooks/useElementShadow.ts (100%) diff --git a/src/types/edit.ts b/src/types/edit.ts index c22a365a..d41c54ff 100644 --- a/src/types/edit.ts +++ b/src/types/edit.ts @@ -63,4 +63,21 @@ export interface MultiSelectRange { maxX: number; minY: number; maxY: number; +} + +export type ImageClipDataRange = [[number, number], [number, number]] + +export interface ImageClipData { + range: ImageClipDataRange; + path: string; +} + +export interface ImageClipedEmitData { + range: ImageClipDataRange; + position: { + left: number; + top: number; + width: number; + height: number; + }; } \ No newline at end of file diff --git a/src/views/Editor/Canvas/AlignmentLine.vue b/src/views/Editor/Canvas/AlignmentLine.vue index deee9ec8..b39e7bf9 100644 --- a/src/views/Editor/Canvas/AlignmentLine.vue +++ b/src/views/Editor/Canvas/AlignmentLine.vue @@ -25,21 +25,13 @@ export default defineComponent({ type: Number, required: true, }, - offsetX: { - type: Number, - required: true, - }, - offsetY: { - type: Number, - required: true, - }, }, setup(props) { const store = useStore() const canvasScale = computed(() => store.state.canvasScale) - const left = computed(() => props.axis.x * canvasScale.value + props.offsetX + 'px') - const top = computed(() => props.axis.y * canvasScale.value + props.offsetY + 'px') + const left = computed(() => props.axis.x * canvasScale.value + 'px') + const top = computed(() => props.axis.y * canvasScale.value + 'px') const sizeStyle = computed(() => { if(props.type === 'vertical') return { height: props.length * canvasScale.value + 'px' } @@ -66,11 +58,11 @@ export default defineComponent({ border: 0 dashed $themeColor; &.vertical { - margin-left: -0.5px; + transform: translateY(-0.5px); border-left-width: 1px; } &.horizontal { - margin-top: -0.5px; + transform: translateX(-0.5px); border-top-width: 1px; } } diff --git a/src/views/_common/_operate/AnimationIndex.vue b/src/views/Editor/Canvas/Operate/AnimationIndex.vue similarity index 100% rename from src/views/_common/_operate/AnimationIndex.vue rename to src/views/Editor/Canvas/Operate/AnimationIndex.vue diff --git a/src/views/_common/_operate/BorderLine.vue b/src/views/Editor/Canvas/Operate/BorderLine.vue similarity index 100% rename from src/views/_common/_operate/BorderLine.vue rename to src/views/Editor/Canvas/Operate/BorderLine.vue diff --git a/src/views/_common/_element/ImageElement/ImageClipHandler.vue b/src/views/Editor/Canvas/Operate/ImageClipHandler.vue similarity index 93% rename from src/views/_common/_element/ImageElement/ImageClipHandler.vue rename to src/views/Editor/Canvas/Operate/ImageClipHandler.vue index 0856876e..dfe9ce59 100644 --- a/src/views/_common/_element/ImageElement/ImageClipHandler.vue +++ b/src/views/Editor/Canvas/Operate/ImageClipHandler.vue @@ -50,26 +50,10 @@ + + \ No newline at end of file diff --git a/src/views/Editor/Canvas/MultiSelectOperate.vue b/src/views/Editor/Canvas/Operate/MultiSelectOperate.vue similarity index 88% rename from src/views/Editor/Canvas/MultiSelectOperate.vue rename to src/views/Editor/Canvas/Operate/MultiSelectOperate.vue index 1da9ea2c..01892924 100644 --- a/src/views/Editor/Canvas/MultiSelectOperate.vue +++ b/src/views/Editor/Canvas/Operate/MultiSelectOperate.vue @@ -2,9 +2,8 @@
@@ -28,10 +27,10 @@ import { State } from '@/store' import { PPTElement, ElementTypes } from '@/types/slides' import { getElementListRange } from '@/utils/element' import { OperateResizeHandler, MultiSelectRange } from '@/types/edit' -import useCommonOperate from '@/views/_common/_element/hooks/useCommonOperate' +import useCommonOperate from '../hooks/useCommonOperate' -import ResizeHandler from '@/views/_common/_operate/ResizeHandler.vue' -import BorderLine from '@/views/_common/_operate/BorderLine.vue' +import ResizeHandler from './ResizeHandler.vue' +import BorderLine from './BorderLine.vue' export default defineComponent({ name: 'multi-select-operate', @@ -102,6 +101,6 @@ export default defineComponent({ position: absolute; top: 0; left: 0; - z-index: 100; + z-index: 101; } \ No newline at end of file diff --git a/src/views/_common/_operate/ResizeHandler.vue b/src/views/Editor/Canvas/Operate/ResizeHandler.vue similarity index 100% rename from src/views/_common/_operate/ResizeHandler.vue rename to src/views/Editor/Canvas/Operate/ResizeHandler.vue diff --git a/src/views/Editor/Canvas/Operate/RotateHandler.vue b/src/views/Editor/Canvas/Operate/RotateHandler.vue new file mode 100644 index 00000000..abc8ac8e --- /dev/null +++ b/src/views/Editor/Canvas/Operate/RotateHandler.vue @@ -0,0 +1,22 @@ + + + + + \ No newline at end of file diff --git a/src/views/Editor/Canvas/Operate/TextElementOperate.vue b/src/views/Editor/Canvas/Operate/TextElementOperate.vue new file mode 100644 index 00000000..92923887 --- /dev/null +++ b/src/views/Editor/Canvas/Operate/TextElementOperate.vue @@ -0,0 +1,131 @@ + + + + + \ No newline at end of file diff --git a/src/views/Editor/Canvas/Operate/index.vue b/src/views/Editor/Canvas/Operate/index.vue new file mode 100644 index 00000000..3d7b1c19 --- /dev/null +++ b/src/views/Editor/Canvas/Operate/index.vue @@ -0,0 +1,97 @@ + + + + + \ No newline at end of file diff --git a/src/views/_common/_element/hooks/useCommonOperate.ts b/src/views/Editor/Canvas/hooks/useCommonOperate.ts similarity index 82% rename from src/views/_common/_element/hooks/useCommonOperate.ts rename to src/views/Editor/Canvas/hooks/useCommonOperate.ts index 6c2449f6..bfda5019 100644 --- a/src/views/_common/_element/hooks/useCommonOperate.ts +++ b/src/views/Editor/Canvas/hooks/useCommonOperate.ts @@ -13,6 +13,13 @@ export default (width: Ref, height: Ref) => { { direction: OperateResizeHandlers.BOTTOM, style: {left: width.value / 2 + 'px', top: height.value + 'px'} }, { direction: OperateResizeHandlers.RIGHT_BOTTOM, style: {left: width.value + 'px', top: height.value + 'px'} }, ] + } + ) + const textElementResizeHandlers = computed(() => { + return [ + { direction: OperateResizeHandlers.LEFT, style: {top: height.value / 2 + 'px'} }, + { direction: OperateResizeHandlers.RIGHT, style: {left: width.value + 'px', top: height.value / 2 + 'px'} }, + ] }) const borderLines = computed(() => { @@ -26,6 +33,7 @@ export default (width: Ref, height: Ref) => { return { resizeHandlers, + textElementResizeHandlers, borderLines, } } \ No newline at end of file diff --git a/src/views/Editor/Canvas/hooks/useDragElement.ts b/src/views/Editor/Canvas/hooks/useDragElement.ts index 6324c68c..7bf2cb10 100644 --- a/src/views/Editor/Canvas/hooks/useDragElement.ts +++ b/src/views/Editor/Canvas/hooks/useDragElement.ts @@ -216,21 +216,21 @@ export default ( targetTop = targetTop - (targetMinY - value) isHorizontalAdsorbed = true } - _alignmentLines.push({type: 'horizontal', axis: {x: min - 20, y: value}, length: max - min + 40}) + _alignmentLines.push({type: 'horizontal', axis: {x: min - 50, y: value}, length: max - min + 100}) } if(Math.abs(targetMaxY - value) < sorptionRange) { if(!isHorizontalAdsorbed) { targetTop = targetTop - (targetMaxY - value) isHorizontalAdsorbed = true } - _alignmentLines.push({type: 'horizontal', axis: {x: min - 20, y: value}, length: max - min + 40}) + _alignmentLines.push({type: 'horizontal', axis: {x: min - 50, y: value}, length: max - min + 100}) } if(Math.abs(targetCenterY - value) < sorptionRange) { if(!isHorizontalAdsorbed) { targetTop = targetTop - (targetCenterY - value) isHorizontalAdsorbed = true } - _alignmentLines.push({type: 'horizontal', axis: {x: min - 20, y: value}, length: max - min + 40}) + _alignmentLines.push({type: 'horizontal', axis: {x: min - 50, y: value}, length: max - min + 100}) } } for(let i = 0; i < verticalLines.length; i++) { @@ -243,21 +243,21 @@ export default ( targetLeft = targetLeft - (targetMinX - value) isVerticalAdsorbed = true } - _alignmentLines.push({type: 'vertical', axis: {x: value, y: min - 20}, length: max - min + 40}) + _alignmentLines.push({type: 'vertical', axis: {x: value, y: min - 50}, length: max - min + 100}) } if(Math.abs(targetMaxX - value) < sorptionRange) { if(!isVerticalAdsorbed) { targetLeft = targetLeft - (targetMaxX - value) isVerticalAdsorbed = true } - _alignmentLines.push({type: 'vertical', axis: {x: value, y: min - 20}, length: max - min + 40}) + _alignmentLines.push({type: 'vertical', axis: {x: value, y: min - 50}, length: max - min + 100}) } if(Math.abs(targetCenterX - value) < sorptionRange) { if(!isVerticalAdsorbed) { targetLeft = targetLeft - (targetCenterX - value) isVerticalAdsorbed = true } - _alignmentLines.push({type: 'vertical', axis: {x: value, y: min - 20}, length: max - min + 40}) + _alignmentLines.push({type: 'vertical', axis: {x: value, y: min - 50}, length: max - min + 100}) } } alignmentLines.value = _alignmentLines diff --git a/src/views/Editor/Canvas/hooks/useScaleElement.ts b/src/views/Editor/Canvas/hooks/useScaleElement.ts index dd134051..71a1c3ad 100644 --- a/src/views/Editor/Canvas/hooks/useScaleElement.ts +++ b/src/views/Editor/Canvas/hooks/useScaleElement.ts @@ -192,7 +192,7 @@ export default ( correctionVal.offsetY = currentY - value isHorizontalAdsorbed = true } - _alignmentLines.push({type: 'horizontal', axis: {x: min - 20, y: value}, length: max - min + 40}) + _alignmentLines.push({ type: 'horizontal', axis: {x: min - 50, y: value}, length: max - min + 100 }) } } } @@ -207,7 +207,7 @@ export default ( correctionVal.offsetX = currentX - value isVerticalAdsorbed = true } - _alignmentLines.push({ type: 'vertical', axis: {x: value, y: min - 20}, length: max - min + 40 }) + _alignmentLines.push({ type: 'vertical', axis: {x: value, y: min - 50}, length: max - min + 100 }) } } } diff --git a/src/views/Editor/Canvas/index.vue b/src/views/Editor/Canvas/index.vue index 1cad7d10..253e6a90 100644 --- a/src/views/Editor/Canvas/index.vue +++ b/src/views/Editor/Canvas/index.vue @@ -7,15 +7,37 @@ v-contextmenu="contextmenus" v-click-outside="removeEditorAreaFocus" > - +
+ + + +
+
- - - -
@@ -83,11 +92,12 @@ import useCopyAndPasteElement from '@/hooks/useCopyAndPasteElement' import useSelectAllElement from '@/hooks/useSelectAllElement' import useScaleCanvas from '@/hooks/useScaleCanvas' -import EditableElement from '@/views/_common/_element/EditableElement.vue' +import EditableElement from '@/views/_element/EditableElement.vue' import MouseSelection from './MouseSelection.vue' import SlideBackground from './SlideBackground.vue' -import MultiSelectOperate from './MultiSelectOperate.vue' import AlignmentLine from './AlignmentLine.vue' +import MultiSelectOperate from './Operate/MultiSelectOperate.vue' +import Operate from './Operate/index.vue' export default defineComponent({ name: 'editor-canvas', @@ -95,8 +105,9 @@ export default defineComponent({ EditableElement, MouseSelection, SlideBackground, - MultiSelectOperate, AlignmentLine, + MultiSelectOperate, + Operate, }, setup() { const store = useStore() @@ -218,4 +229,7 @@ export default defineComponent({ background-color: #fff; box-shadow: 0 0 20px 0 rgba(0, 0, 0, .1); } +.operates { + position: absolute; +} \ No newline at end of file diff --git a/src/views/Editor/Thumbnails/index.vue b/src/views/Editor/Thumbnails/index.vue index 46b011b8..f5c38340 100644 --- a/src/views/Editor/Thumbnails/index.vue +++ b/src/views/Editor/Thumbnails/index.vue @@ -42,7 +42,7 @@ import { fillDigit } from '@/utils/common' import { ContextmenuItem } from '@/components/Contextmenu/types' import useSlideHandler from '@/hooks/useSlideHandler' -import ThumbnailSlide from '@/views/_common/ThumbnailSlide.vue' +import ThumbnailSlide from '@/views/ThumbnailSlide.vue' export default defineComponent({ name: 'thumbnails', diff --git a/src/views/Screen/ScreenSlide.vue b/src/views/Screen/ScreenSlide.vue index c6a81ecd..1c8accbd 100644 --- a/src/views/Screen/ScreenSlide.vue +++ b/src/views/Screen/ScreenSlide.vue @@ -23,7 +23,7 @@ import { Slide } from '@/types/slides' import { VIEWPORT_SIZE, VIEWPORT_ASPECT_RATIO } from '@/configs/canvas' import useSlideBackgroundStyle from '@/hooks/useSlideBackgroundStyle' -import BaseElement from '@/views/_common/_element/BaseElement.vue' +import BaseElement from '@/views/_element/BaseElement.vue' export default defineComponent({ name: 'screen-slide', diff --git a/src/views/Screen/index.vue b/src/views/Screen/index.vue index efc2bc7d..4193dd86 100644 --- a/src/views/Screen/index.vue +++ b/src/views/Screen/index.vue @@ -172,10 +172,10 @@ export default defineComponent({ z-index: 2; } &.prev { - transform: translateX(-100%); + transform: translateY(-100%); } &.next { - transform: translateX(100%); + transform: translateY(100%); } } .slide-content { diff --git a/src/views/_common/ThumbnailSlide.vue b/src/views/ThumbnailSlide.vue similarity index 95% rename from src/views/_common/ThumbnailSlide.vue rename to src/views/ThumbnailSlide.vue index f6ba428f..71eeaf5d 100644 --- a/src/views/_common/ThumbnailSlide.vue +++ b/src/views/ThumbnailSlide.vue @@ -30,7 +30,7 @@ import { Slide } from '@/types/slides' import { VIEWPORT_SIZE, VIEWPORT_ASPECT_RATIO } from '@/configs/canvas' import useSlideBackgroundStyle from '@/hooks/useSlideBackgroundStyle' -import BaseElement from '@/views/_common/_element/BaseElement.vue' +import BaseElement from '@/views/_element/BaseElement.vue' export default defineComponent({ name: 'thumbnail-slide', diff --git a/src/views/_common/_element/TextElement/index.vue b/src/views/_common/_element/TextElement/index.vue deleted file mode 100644 index 218a9176..00000000 --- a/src/views/_common/_element/TextElement/index.vue +++ /dev/null @@ -1,223 +0,0 @@ - - - - - diff --git a/src/views/_common/_operate/RotateHandler.vue b/src/views/_common/_operate/RotateHandler.vue deleted file mode 100644 index 84105544..00000000 --- a/src/views/_common/_operate/RotateHandler.vue +++ /dev/null @@ -1,34 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/views/_common/_element/BaseElement.vue b/src/views/_element/BaseElement.vue similarity index 100% rename from src/views/_common/_element/BaseElement.vue rename to src/views/_element/BaseElement.vue diff --git a/src/views/_common/_element/EditableElement.vue b/src/views/_element/EditableElement.vue similarity index 75% rename from src/views/_common/_element/EditableElement.vue rename to src/views/_element/EditableElement.vue index 6363ec2a..d30c4b35 100644 --- a/src/views/_common/_element/EditableElement.vue +++ b/src/views/_element/EditableElement.vue @@ -7,16 +7,8 @@ > @@ -24,9 +16,7 @@ + + diff --git a/src/views/_common/_element/hooks/useElementOutline.ts b/src/views/_element/hooks/useElementOutline.ts similarity index 100% rename from src/views/_common/_element/hooks/useElementOutline.ts rename to src/views/_element/hooks/useElementOutline.ts diff --git a/src/views/_common/_element/hooks/useElementShadow.ts b/src/views/_element/hooks/useElementShadow.ts similarity index 100% rename from src/views/_common/_element/hooks/useElementShadow.ts rename to src/views/_element/hooks/useElementShadow.ts