diff --git a/src/enums/editPageEnum.ts b/src/enums/editPageEnum.ts index 8de053d4..e2044bd8 100644 --- a/src/enums/editPageEnum.ts +++ b/src/enums/editPageEnum.ts @@ -6,7 +6,7 @@ export enum MouseEventButton { // 页面拖拽键名 export enum DragKeyEnum { - DROG_KEY = 'ChartData' + DRAG_KEY = 'ChartData' } // 操作枚举 diff --git a/src/settings/designSetting.ts b/src/settings/designSetting.ts index 0988c7a5..713b88bd 100644 --- a/src/settings/designSetting.ts +++ b/src/settings/designSetting.ts @@ -59,4 +59,10 @@ export const requestInterval = 30 export const requestIntervalUnit = RequestHttpIntervalEnum.SECOND // 工作区域历史记录存储最大数量 -export const editHistoryMax = 100 \ No newline at end of file +export const editHistoryMax = 100 + +// 拖拽时蒙层的 z-index,需比所有图表高 +export const canvasModelIndex = 9999 + +// 框选时蒙层的 z-index,需比所有图表高 +export const selectBoxIndex = canvasModelIndex + 10 diff --git a/src/store/modules/chartEditStore/chartEditStore.d.ts b/src/store/modules/chartEditStore/chartEditStore.d.ts index 82c59501..1defbb77 100644 --- a/src/store/modules/chartEditStore/chartEditStore.d.ts +++ b/src/store/modules/chartEditStore/chartEditStore.d.ts @@ -21,7 +21,8 @@ export enum EditCanvasTypeEnum { USER_SCALE = 'userScale', LOCK_SCALE = 'lockScale', IS_CREATE = 'isCreate', - IS_DRAG = 'isDrag' + IS_DRAG = 'isDrag', + IS_SELECT = 'isSelect' } // 编辑区域 @@ -41,6 +42,8 @@ export type EditCanvasType = { [EditCanvasTypeEnum.IS_CREATE]: boolean // 拖拽中 [EditCanvasTypeEnum.IS_DRAG]: boolean + // 框选中 + [EditCanvasTypeEnum.IS_SELECT]: boolean } // 滤镜/背景色/宽高主题等 diff --git a/src/store/modules/chartEditStore/chartEditStore.ts b/src/store/modules/chartEditStore/chartEditStore.ts index 61ccd070..9b9567be 100644 --- a/src/store/modules/chartEditStore/chartEditStore.ts +++ b/src/store/modules/chartEditStore/chartEditStore.ts @@ -52,7 +52,9 @@ export const useChartEditStore = defineStore({ // 初始化 isCreate: false, // 拖拽中 - isDrag: false + isDrag: false, + // 框选中 + isSelect: false }, // 右键菜单 rightMenuShow: false, @@ -216,10 +218,10 @@ export const useChartEditStore = defineStore({ }, // * 设置鼠标位置 setMousePosition(x?: number, y?: number, startX?: number, startY?: number): void { - if (startX) this.mousePosition.startX = startX - if (startY) this.mousePosition.startY = startY if (x) this.mousePosition.x = x if (y) this.mousePosition.y = y + if (startX) this.mousePosition.startX = startX + if (startY) this.mousePosition.startY = startY }, // * 找到目标 id 数据的下标位置,id可为父级或子集数组(无则返回-1) fetchTargetIndex(id?: string): number { diff --git a/src/views/chart/ContentCharts/components/ChartsItemBox/index.vue b/src/views/chart/ContentCharts/components/ChartsItemBox/index.vue index 06208652..696fd6e3 100644 --- a/src/views/chart/ContentCharts/components/ChartsItemBox/index.vue +++ b/src/views/chart/ContentCharts/components/ChartsItemBox/index.vue @@ -45,7 +45,7 @@ const dragStartHandle = (e: DragEvent, item: ConfigType) => { componentInstall(item.chartKey, fetchChartComponent(item)) componentInstall(item.conKey, fetchConfigComponent(item)) // 将配置项绑定到拖拽属性上 - e!.dataTransfer!.setData(DragKeyEnum.DROG_KEY, JSON.stringify(omit(item, ['image']))) + e!.dataTransfer!.setData(DragKeyEnum.DRAG_KEY, JSON.stringify(omit(item, ['image']))) // 修改状态 chartEditStore.setEditCanvas(EditCanvasTypeEnum.IS_CREATE, true) } diff --git a/src/views/chart/ContentEdit/components/EditRange/index.vue b/src/views/chart/ContentEdit/components/EditRange/index.vue index 72a01672..9b251f85 100644 --- a/src/views/chart/ContentEdit/components/EditRange/index.vue +++ b/src/views/chart/ContentEdit/components/EditRange/index.vue @@ -1,5 +1,5 @@ diff --git a/src/views/chart/ContentEdit/components/EditSelect/index.ts b/src/views/chart/ContentEdit/components/EditSelect/index.ts new file mode 100644 index 00000000..88b3334f --- /dev/null +++ b/src/views/chart/ContentEdit/components/EditSelect/index.ts @@ -0,0 +1,3 @@ +import EditSelect from './index.vue' + +export { EditSelect } diff --git a/src/views/chart/ContentEdit/components/EditSelect/index.vue b/src/views/chart/ContentEdit/components/EditSelect/index.vue new file mode 100644 index 00000000..bfe78959 --- /dev/null +++ b/src/views/chart/ContentEdit/components/EditSelect/index.vue @@ -0,0 +1,107 @@ + + + + + diff --git a/src/views/chart/ContentEdit/hooks/useDrag.hook.ts b/src/views/chart/ContentEdit/hooks/useDrag.hook.ts index 7e41e593..6039046d 100644 --- a/src/views/chart/ContentEdit/hooks/useDrag.hook.ts +++ b/src/views/chart/ContentEdit/hooks/useDrag.hook.ts @@ -20,7 +20,7 @@ export const dragHandle = async (e: DragEvent) => { loadingStart() // 获取拖拽数据 - const drayDataString = e!.dataTransfer!.getData(DragKeyEnum.DROG_KEY) + const drayDataString = e!.dataTransfer!.getData(DragKeyEnum.DRAG_KEY) if (!drayDataString) { loadingFinish() return @@ -60,6 +60,38 @@ export const mousedownHandleUnStop = (e: MouseEvent, item?: CreateComponentType chartEditStore.setTargetSelectChart(undefined) } +// * 框选 +export const mousedownBoxSelect = (e: MouseEvent, item?: CreateComponentType | CreateComponentGroupType) => { + mousedownHandleUnStop(e) + + // 记录点击初始位置 + const startOffsetX = e.offsetX + const startOffsetY = e.offsetY + const startScreenX = e.screenX + const startScreenY = e.screenY + + chartEditStore.setMousePosition(undefined, undefined, startOffsetX, startOffsetY) + + // 移动框选 + const mousemove = throttle((moveEvent: MouseEvent) => { + const currX = startOffsetX + moveEvent.screenX - startScreenX + const currY = startOffsetY + moveEvent.screenY - startScreenY + + chartEditStore.setEditCanvas(EditCanvasTypeEnum.IS_SELECT, true) + chartEditStore.setMousePosition(currX, currY) + }, 50) + + // 鼠标抬起 + const mouseup = () => { + chartEditStore.setEditCanvas(EditCanvasTypeEnum.IS_SELECT, false) + chartEditStore.setMousePosition(0, 0, 0, 0) + document.removeEventListener('mousemove', mousemove) + document.removeEventListener('mouseup', mouseup) + } + document.addEventListener('mousemove', mousemove) + document.addEventListener('mouseup', mouseup) +} + // * 鼠标事件 export const useMouseHandle = () => { // * Click 事件, 松开鼠标触发 @@ -86,7 +118,6 @@ export const useMouseHandle = () => { e.preventDefault() e.stopPropagation() onClickOutSide() - // 按下左键 + CTRL if ( e.buttons === MouseEventButton.LEFT && @@ -124,11 +155,10 @@ export const useMouseHandle = () => { const startY = e.screenY // 记录初始位置 - chartEditStore.setMousePosition(startX, startY) + chartEditStore.setMousePosition(undefined, undefined, startX, startY) // 移动-计算偏移量 const mousemove = throttle((moveEvent: MouseEvent) => { - chartEditStore.setEditCanvas(EditCanvasTypeEnum.IS_DRAG, true) chartEditStore.setMousePosition(moveEvent.screenX, moveEvent.screenY) // 当前偏移量,处理 scale 比例问题 @@ -136,8 +166,8 @@ export const useMouseHandle = () => { let offsetY = (moveEvent.screenY - startY) / scale chartEditStore.getTargetChart.selectId.forEach(id => { - if(!targetMap.has(id)) return - + if (!targetMap.has(id)) return + const index = chartEditStore.fetchTargetIndex(id) // 拿到初始位置数据 const { x, y, w, h } = targetMap.get(id) @@ -166,8 +196,7 @@ export const useMouseHandle = () => { }, 30) const mouseup = () => { - chartEditStore.setEditCanvas(EditCanvasTypeEnum.IS_DRAG, false) - chartEditStore.setMousePosition(0, 0) + chartEditStore.setMousePosition(0, 0, 0, 0) document.removeEventListener('mousemove', mousemove) document.removeEventListener('mouseup', mouseup) } @@ -237,7 +266,7 @@ export const useMousePointHandle = (e: MouseEvent, point: string, attr: PickCrea const mouseup = () => { chartEditStore.setEditCanvas(EditCanvasTypeEnum.IS_DRAG, false) - chartEditStore.setMousePosition(0, 0) + chartEditStore.setMousePosition(0, 0, 0, 0) document.removeEventListener('mousemove', mousemove) document.removeEventListener('mouseup', mouseup) }