feat: 新增多选组件同时移动

This commit is contained in:
奔跑的面条 2022-08-15 16:19:36 +08:00
parent 46f93ffb86
commit 8832da10c9

View File

@ -1,3 +1,4 @@
import { toRaw } from 'vue'
import { DragKeyEnum, MouseEventButton, WinKeyboard, MacKeyboard } from '@/enums/editPageEnum' import { DragKeyEnum, MouseEventButton, WinKeyboard, MacKeyboard } from '@/enums/editPageEnum'
import { createComponent } from '@/packages' import { createComponent } from '@/packages'
import { ConfigType } from '@/packages/index.d' import { ConfigType } from '@/packages/index.d'
@ -71,7 +72,7 @@ export const useMouseHandle = () => {
window.$KeyboardActive?.has(MacKeyboard.CTRL_SOURCE_KEY) window.$KeyboardActive?.has(MacKeyboard.CTRL_SOURCE_KEY)
) { ) {
// 若已选中,则去除 // 若已选中,则去除
if(chartEditStore.targetChart.selectId.includes(item.id)) { if (chartEditStore.targetChart.selectId.includes(item.id)) {
const exList = chartEditStore.targetChart.selectId.filter(e => e !== item.id) const exList = chartEditStore.targetChart.selectId.filter(e => e !== item.id)
chartEditStore.setTargetSelectChart(exList) chartEditStore.setTargetSelectChart(exList)
} else { } else {
@ -105,41 +106,61 @@ export const useMouseHandle = () => {
if (e.buttons === MouseEventButton.RIGHT) return if (e.buttons === MouseEventButton.RIGHT) return
const scale = chartEditStore.getEditCanvas.scale const scale = chartEditStore.getEditCanvas.scale
const width = chartEditStore.getEditCanvasConfig.width const canvasWidth = chartEditStore.getEditCanvasConfig.width
const height = chartEditStore.getEditCanvasConfig.height const canvasHeight = chartEditStore.getEditCanvasConfig.height
// 记录图表初始位置和大小 // 记录图表初始位置和大小
const itemAttrX = item.attr.x const targetMap = new Map()
const itemAttrY = item.attr.y chartEditStore.getTargetChart.selectId.forEach(id => {
const itemAttrW = item.attr.w const index = chartEditStore.fetchTargetIndex(id)
const itemAttrH = item.attr.h if (index !== -1) {
const { x, y, w, h } = toRaw(chartEditStore.getComponentList[index]).attr
targetMap.set(id, { x, y, w, h })
}
})
// 记录点击初始位置 // 记录点击初始位置
const startX = e.screenX const startX = e.screenX
const startY = e.screenY const startY = e.screenY
// 记录初始位置 // 记录初始位置
chartEditStore.setMousePosition(startX, startY) chartEditStore.setMousePosition(startX, startY)
// 计算偏移量(处理 scale 比例问题) // 移动-计算偏移量
const mousemove = throttle((moveEvent: MouseEvent) => { const mousemove = throttle((moveEvent: MouseEvent) => {
chartEditStore.setEditCanvas(EditCanvasTypeEnum.IS_DRAG, true) chartEditStore.setEditCanvas(EditCanvasTypeEnum.IS_DRAG, true)
chartEditStore.setMousePosition(moveEvent.screenX, moveEvent.screenY) chartEditStore.setMousePosition(moveEvent.screenX, moveEvent.screenY)
let currX = Math.round(itemAttrX + (moveEvent.screenX - startX) / scale) // 当前偏移量,处理 scale 比例问题
let currY = Math.round(itemAttrY + (moveEvent.screenY - startY) / scale) let offsetX = (moveEvent.screenX - startX) / scale
let offsetY = (moveEvent.screenY - startY) / scale
// 要预留的距离 chartEditStore.getTargetChart.selectId.forEach(id => {
const distance = 50 const index = chartEditStore.fetchTargetIndex(id)
// 基于左上角位置检测 // 拿到初始位置数据
currX = currX < -itemAttrW + distance ? -itemAttrW + distance : currX const { x, y, w, h } = targetMap.get(id)
currY = currY < -itemAttrH + distance ? -itemAttrH + distance : currY const componentInstance = chartEditStore.getComponentList[index]
// 基于右下角位置检测 let currX = Math.round(x + offsetX)
currX = currX > width - distance ? width - distance : currX let currY = Math.round(y + offsetY)
currY = currY > height - distance ? height - distance : currY
item.attr.x = currX // 要预留的距离
item.attr.y = currY const distance = 50
// 基于左上角位置检测
currX = currX < -w + distance ? -w + distance : currX
currY = currY < -h + distance ? -h + distance : currY
// 基于右下角位置检测
currX = currX > canvasWidth - distance ? canvasWidth - distance : currX
currY = currY > canvasHeight - distance ? canvasHeight - distance : currY
componentInstance.attr = Object.assign(componentInstance.attr, {
x: currX,
y: currY
})
})
return
}, 30) }, 30)
const mouseup = () => { const mouseup = () => {