mirror of
https://github.com/pipipi-pikachu/PPTist.git
synced 2025-04-15 02:20:00 +08:00
fix: 图片旋转后裁剪操作异常(#76)
This commit is contained in:
parent
09004ef1dd
commit
f51c474ccc
@ -34,8 +34,8 @@
|
|||||||
@mousedown.stop="$event => moveClipRange($event)"
|
@mousedown.stop="$event => moveClipRange($event)"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
:class="['clip-point', point]"
|
:class="['clip-point', point, rotateClassName]"
|
||||||
v-for="point in ['t-l', 't-r', 'b-l', 'b-r']"
|
v-for="point in ['left-top', 'right-top', 'left-bottom', 'right-bottom']"
|
||||||
:key="point"
|
:key="point"
|
||||||
@mousedown.stop="$event => scaleClipRange($event, point)"
|
@mousedown.stop="$event => scaleClipRange($event, point)"
|
||||||
>
|
>
|
||||||
@ -48,8 +48,8 @@
|
|||||||
</svg>
|
</svg>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
:class="['clip-point', '', point]"
|
:class="['clip-point', point, rotateClassName]"
|
||||||
v-for="point in ['t', 'b', 'l', 'r']"
|
v-for="point in ['top', 'bottom', 'left', 'right']"
|
||||||
:key="point"
|
:key="point"
|
||||||
@mousedown.stop="$event => scaleClipRange($event, point)"
|
@mousedown.stop="$event => scaleClipRange($event, point)"
|
||||||
>
|
>
|
||||||
@ -70,9 +70,7 @@ import { computed, defineComponent, onMounted, onUnmounted, PropType, reactive,
|
|||||||
import { storeToRefs } from 'pinia'
|
import { storeToRefs } from 'pinia'
|
||||||
import { useMainStore, useKeyboardStore } from '@/store'
|
import { useMainStore, useKeyboardStore } from '@/store'
|
||||||
import { KEYS } from '@/configs/hotkey'
|
import { KEYS } from '@/configs/hotkey'
|
||||||
import { ImageClipData, ImageClipDataRange, ImageClipedEmitData } from '@/types/edit'
|
import { ImageClipData, ImageClipDataRange, ImageClipedEmitData, OperateResizeHandler, OperateResizeHandlers } from '@/types/edit'
|
||||||
|
|
||||||
type ScaleClipRangeType = 't-l' | 't-r' | 'b-l' | 'b-r'
|
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'image-clip-handler',
|
name: 'image-clip-handler',
|
||||||
@ -105,6 +103,10 @@ export default defineComponent({
|
|||||||
type: Number,
|
type: Number,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
|
rotate: {
|
||||||
|
type: Number,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
setup(props, { emit }) {
|
setup(props, { emit }) {
|
||||||
const { canvasScale } = storeToRefs(useMainStore())
|
const { canvasScale } = storeToRefs(useMainStore())
|
||||||
@ -282,8 +284,21 @@ export default defineComponent({
|
|||||||
const currentPageX = e.pageX
|
const currentPageX = e.pageX
|
||||||
const currentPageY = e.pageY
|
const currentPageY = e.pageY
|
||||||
|
|
||||||
const moveX = (currentPageX - startPageX) / canvasScale.value / props.width * 100
|
let moveX = (currentPageX - startPageX) / canvasScale.value / props.width * 100
|
||||||
const moveY = (currentPageY - startPageY) / canvasScale.value / props.height * 100
|
let moveY = (currentPageY - startPageY) / canvasScale.value / props.height * 100
|
||||||
|
|
||||||
|
if (props.rotate > 45 && props.rotate < 135) {
|
||||||
|
moveX = (currentPageY - startPageY) / canvasScale.value / props.width * 100
|
||||||
|
moveY = -(currentPageX - startPageX) / canvasScale.value / props.height * 100
|
||||||
|
}
|
||||||
|
if ((props.rotate >= 135 && props.rotate <= 180) || (props.rotate >= -180 && props.rotate <= -135)) {
|
||||||
|
moveX = -moveX
|
||||||
|
moveY = -moveY
|
||||||
|
}
|
||||||
|
if (props.rotate > -135 && props.rotate < -45) {
|
||||||
|
moveX = -(currentPageY - startPageY) / canvasScale.value / props.width * 100
|
||||||
|
moveY = (currentPageX - startPageX) / canvasScale.value / props.height * 100
|
||||||
|
}
|
||||||
|
|
||||||
let targetLeft = originPositopn.left + moveX
|
let targetLeft = originPositopn.left + moveX
|
||||||
let targetTop = originPositopn.top + moveY
|
let targetTop = originPositopn.top + moveY
|
||||||
@ -315,7 +330,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 缩放裁剪区域
|
// 缩放裁剪区域
|
||||||
const scaleClipRange = (e: MouseEvent, type: ScaleClipRangeType) => {
|
const scaleClipRange = (e: MouseEvent, type: OperateResizeHandler) => {
|
||||||
isSettingClipRange.value = true
|
isSettingClipRange.value = true
|
||||||
let isMouseDown = true
|
let isMouseDown = true
|
||||||
|
|
||||||
@ -343,14 +358,27 @@ export default defineComponent({
|
|||||||
let moveX = (currentPageX - startPageX) / canvasScale.value / props.width * 100
|
let moveX = (currentPageX - startPageX) / canvasScale.value / props.width * 100
|
||||||
let moveY = (currentPageY - startPageY) / canvasScale.value / props.height * 100
|
let moveY = (currentPageY - startPageY) / canvasScale.value / props.height * 100
|
||||||
|
|
||||||
|
if (props.rotate > 45 && props.rotate < 135) {
|
||||||
|
moveX = (currentPageY - startPageY) / canvasScale.value / props.width * 100
|
||||||
|
moveY = -(currentPageX - startPageX) / canvasScale.value / props.height * 100
|
||||||
|
}
|
||||||
|
if ((props.rotate >= 135 && props.rotate <= 180) || (props.rotate >= -180 && props.rotate <= -135)) {
|
||||||
|
moveX = -moveX
|
||||||
|
moveY = -moveY
|
||||||
|
}
|
||||||
|
if (props.rotate > -135 && props.rotate < -45) {
|
||||||
|
moveX = -(currentPageY - startPageY) / canvasScale.value / props.width * 100
|
||||||
|
moveY = (currentPageX - startPageX) / canvasScale.value / props.height * 100
|
||||||
|
}
|
||||||
|
|
||||||
if (ctrlOrShiftKeyActive.value) {
|
if (ctrlOrShiftKeyActive.value) {
|
||||||
if (type === 'b-r' || type === 't-l') moveY = moveX / aspectRatio
|
if (type === OperateResizeHandlers.RIGHT_BOTTOM || type === OperateResizeHandlers.LEFT_TOP) moveY = moveX / aspectRatio
|
||||||
if (type === 'b-l' || type === 't-r') moveY = -moveX / aspectRatio
|
if (type === OperateResizeHandlers.LEFT_BOTTOM || type === OperateResizeHandlers.RIGHT_TOP) moveY = -moveX / aspectRatio
|
||||||
}
|
}
|
||||||
|
|
||||||
let targetLeft, targetTop, targetWidth, targetHeight
|
let targetLeft, targetTop, targetWidth, targetHeight
|
||||||
|
|
||||||
if (type === 't-l') {
|
if (type === OperateResizeHandlers.LEFT_TOP) {
|
||||||
if (originPositopn.left + moveX < 0) {
|
if (originPositopn.left + moveX < 0) {
|
||||||
moveX = -originPositopn.left
|
moveX = -originPositopn.left
|
||||||
}
|
}
|
||||||
@ -368,7 +396,7 @@ export default defineComponent({
|
|||||||
targetLeft = originPositopn.left + moveX
|
targetLeft = originPositopn.left + moveX
|
||||||
targetTop = originPositopn.top + moveY
|
targetTop = originPositopn.top + moveY
|
||||||
}
|
}
|
||||||
else if (type === 't-r') {
|
else if (type === OperateResizeHandlers.RIGHT_TOP) {
|
||||||
if (originPositopn.left + originPositopn.width + moveX > bottomPosition.width) {
|
if (originPositopn.left + originPositopn.width + moveX > bottomPosition.width) {
|
||||||
moveX = bottomPosition.width - (originPositopn.left + originPositopn.width)
|
moveX = bottomPosition.width - (originPositopn.left + originPositopn.width)
|
||||||
}
|
}
|
||||||
@ -386,7 +414,7 @@ export default defineComponent({
|
|||||||
targetLeft = originPositopn.left
|
targetLeft = originPositopn.left
|
||||||
targetTop = originPositopn.top + moveY
|
targetTop = originPositopn.top + moveY
|
||||||
}
|
}
|
||||||
else if (type === 'b-l') {
|
else if (type === OperateResizeHandlers.LEFT_BOTTOM) {
|
||||||
if (originPositopn.left + moveX < 0) {
|
if (originPositopn.left + moveX < 0) {
|
||||||
moveX = -originPositopn.left
|
moveX = -originPositopn.left
|
||||||
}
|
}
|
||||||
@ -404,7 +432,7 @@ export default defineComponent({
|
|||||||
targetLeft = originPositopn.left + moveX
|
targetLeft = originPositopn.left + moveX
|
||||||
targetTop = originPositopn.top
|
targetTop = originPositopn.top
|
||||||
}
|
}
|
||||||
else if (type === 'b-r') {
|
else if (type === OperateResizeHandlers.RIGHT_BOTTOM) {
|
||||||
if (originPositopn.left + originPositopn.width + moveX > bottomPosition.width) {
|
if (originPositopn.left + originPositopn.width + moveX > bottomPosition.width) {
|
||||||
moveX = bottomPosition.width - (originPositopn.left + originPositopn.width)
|
moveX = bottomPosition.width - (originPositopn.left + originPositopn.width)
|
||||||
}
|
}
|
||||||
@ -422,7 +450,7 @@ export default defineComponent({
|
|||||||
targetLeft = originPositopn.left
|
targetLeft = originPositopn.left
|
||||||
targetTop = originPositopn.top
|
targetTop = originPositopn.top
|
||||||
}
|
}
|
||||||
else if (type === 't') {
|
else if (type === OperateResizeHandlers.TOP) {
|
||||||
if (originPositopn.top + moveY < 0) {
|
if (originPositopn.top + moveY < 0) {
|
||||||
moveY = -originPositopn.top
|
moveY = -originPositopn.top
|
||||||
}
|
}
|
||||||
@ -434,7 +462,7 @@ export default defineComponent({
|
|||||||
targetLeft = originPositopn.left
|
targetLeft = originPositopn.left
|
||||||
targetTop = originPositopn.top + moveY
|
targetTop = originPositopn.top + moveY
|
||||||
}
|
}
|
||||||
else if (type === 'b') {
|
else if (type === OperateResizeHandlers.BOTTOM) {
|
||||||
if (originPositopn.top + originPositopn.height + moveY > bottomPosition.height) {
|
if (originPositopn.top + originPositopn.height + moveY > bottomPosition.height) {
|
||||||
moveY = bottomPosition.height - (originPositopn.top + originPositopn.height)
|
moveY = bottomPosition.height - (originPositopn.top + originPositopn.height)
|
||||||
}
|
}
|
||||||
@ -446,7 +474,7 @@ export default defineComponent({
|
|||||||
targetLeft = originPositopn.left
|
targetLeft = originPositopn.left
|
||||||
targetTop = originPositopn.top
|
targetTop = originPositopn.top
|
||||||
}
|
}
|
||||||
else if (type === 'l') {
|
else if (type === OperateResizeHandlers.LEFT) {
|
||||||
if (originPositopn.left + moveX < 0) {
|
if (originPositopn.left + moveX < 0) {
|
||||||
moveX = -originPositopn.left
|
moveX = -originPositopn.left
|
||||||
}
|
}
|
||||||
@ -488,11 +516,26 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const rotateClassName = computed(() => {
|
||||||
|
const prefix = 'rotate-'
|
||||||
|
const rotate = props.rotate
|
||||||
|
if (rotate > -22.5 && rotate <= 22.5) return prefix + 0
|
||||||
|
else if (rotate > 22.5 && rotate <= 67.5) return prefix + 45
|
||||||
|
else if (rotate > 67.5 && rotate <= 112.5) return prefix + 90
|
||||||
|
else if (rotate > 112.5 && rotate <= 157.5) return prefix + 135
|
||||||
|
else if (rotate > 157.5 || rotate <= -157.5) return prefix + 0
|
||||||
|
else if (rotate > -157.5 && rotate <= -112.5) return prefix + 45
|
||||||
|
else if (rotate > -112.5 && rotate <= -67.5) return prefix + 90
|
||||||
|
else if (rotate > -67.5 && rotate <= -22.5) return prefix + 135
|
||||||
|
return prefix + 0
|
||||||
|
})
|
||||||
|
|
||||||
return {
|
return {
|
||||||
clipWrapperPositionStyle,
|
clipWrapperPositionStyle,
|
||||||
bottomImgPositionStyle,
|
bottomImgPositionStyle,
|
||||||
topImgWrapperPositionStyle,
|
topImgWrapperPositionStyle,
|
||||||
topImgPositionStyle,
|
topImgPositionStyle,
|
||||||
|
rotateClassName,
|
||||||
handleClip,
|
handleClip,
|
||||||
moveClipRange,
|
moveClipRange,
|
||||||
scaleClipRange,
|
scaleClipRange,
|
||||||
@ -548,58 +591,91 @@ export default defineComponent({
|
|||||||
overflow: visible;
|
overflow: visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.t-l {
|
&.left-top {
|
||||||
left: 0;
|
left: 0;
|
||||||
top: 0;
|
top: 0;
|
||||||
cursor: nwse-resize;
|
|
||||||
}
|
}
|
||||||
&.t-r {
|
&.right-top {
|
||||||
left: 100%;
|
left: 100%;
|
||||||
top: 0;
|
top: 0;
|
||||||
transform: rotate(90deg);
|
transform: rotate(90deg);
|
||||||
transform-origin: 0 0;
|
transform-origin: 0 0;
|
||||||
cursor: nesw-resize;
|
|
||||||
}
|
}
|
||||||
&.b-l {
|
&.left-bottom {
|
||||||
left: 0;
|
left: 0;
|
||||||
top: 100%;
|
top: 100%;
|
||||||
transform: rotate(-90deg);
|
transform: rotate(-90deg);
|
||||||
transform-origin: 0 0;
|
transform-origin: 0 0;
|
||||||
cursor: nesw-resize;
|
|
||||||
}
|
}
|
||||||
&.b-r {
|
&.right-bottom {
|
||||||
left: 100%;
|
left: 100%;
|
||||||
top: 100%;
|
top: 100%;
|
||||||
transform: rotate(180deg);
|
transform: rotate(180deg);
|
||||||
transform-origin: 0 0;
|
transform-origin: 0 0;
|
||||||
cursor: nwse-resize;
|
|
||||||
}
|
}
|
||||||
&.t {
|
&.top {
|
||||||
cursor: n-resize;
|
|
||||||
left: 50%;
|
left: 50%;
|
||||||
top: 0;
|
top: 0;
|
||||||
margin-left: -8px;
|
margin-left: -8px;
|
||||||
}
|
}
|
||||||
&.b {
|
&.bottom {
|
||||||
cursor: n-resize;
|
|
||||||
left: 50%;
|
left: 50%;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
margin-left: -8px;
|
margin-left: -8px;
|
||||||
transform: rotate(180deg);
|
transform: rotate(180deg);
|
||||||
}
|
}
|
||||||
&.l {
|
&.left {
|
||||||
cursor: w-resize;
|
|
||||||
left: 0;
|
left: 0;
|
||||||
top: 50%;
|
top: 50%;
|
||||||
margin-top: -8px;
|
margin-top: -8px;
|
||||||
transform: rotate(-90deg);
|
transform: rotate(-90deg);
|
||||||
}
|
}
|
||||||
&.r {
|
&.right {
|
||||||
cursor: w-resize;
|
|
||||||
right: 0;
|
right: 0;
|
||||||
top: 50%;
|
top: 50%;
|
||||||
margin-top: -8px;
|
margin-top: -8px;
|
||||||
transform: rotate(90deg);
|
transform: rotate(90deg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.left-top.rotate-0,
|
||||||
|
&.right-bottom.rotate-0,
|
||||||
|
&.left.rotate-45,
|
||||||
|
&.right.rotate-45,
|
||||||
|
&.left-bottom.rotate-90,
|
||||||
|
&.right-top.rotate-90,
|
||||||
|
&.top.rotate-135,
|
||||||
|
&.bottom.rotate-135 {
|
||||||
|
cursor: nwse-resize;
|
||||||
|
}
|
||||||
|
&.top.rotate-0,
|
||||||
|
&.bottom.rotate-0,
|
||||||
|
&.left-top.rotate-45,
|
||||||
|
&.right-bottom.rotate-45,
|
||||||
|
&.left.rotate-90,
|
||||||
|
&.right.rotate-90,
|
||||||
|
&.left-bottom.rotate-135,
|
||||||
|
&.right-top.rotate-135 {
|
||||||
|
cursor: ns-resize;
|
||||||
|
}
|
||||||
|
&.left-bottom.rotate-0,
|
||||||
|
&.right-top.rotate-0,
|
||||||
|
&.top.rotate-45,
|
||||||
|
&.bottom.rotate-45,
|
||||||
|
&.left-top.rotate-90,
|
||||||
|
&.right-bottom.rotate-90,
|
||||||
|
&.left.rotate-135,
|
||||||
|
&.right.rotate-135 {
|
||||||
|
cursor: nesw-resize;
|
||||||
|
}
|
||||||
|
&.left.rotate-0,
|
||||||
|
&.right.rotate-0,
|
||||||
|
&.left-bottom.rotate-45,
|
||||||
|
&.right-top.rotate-45,
|
||||||
|
&.top.rotate-90,
|
||||||
|
&.bottom.rotate-90,
|
||||||
|
&.left-top.rotate-135,
|
||||||
|
&.right-bottom.rotate-135 {
|
||||||
|
cursor: ew-resize;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
@ -21,6 +21,7 @@
|
|||||||
:height="elementInfo.height"
|
:height="elementInfo.height"
|
||||||
:top="elementInfo.top"
|
:top="elementInfo.top"
|
||||||
:left="elementInfo.left"
|
:left="elementInfo.left"
|
||||||
|
:rotate="elementInfo.rotate"
|
||||||
:clipPath="clipShape.style"
|
:clipPath="clipShape.style"
|
||||||
@clip="range => handleClip(range)"
|
@clip="range => handleClip(range)"
|
||||||
/>
|
/>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user