fix(stage): 修复多选组件处于拖拽状态时画布组件命中高亮的问题,优化多选拖拽体验 (#265)

* fix(stage): 修复多选组件处于拖拽状态时画布组件命中高亮的问题,优化多选拖拽体验

* fix(stage): 修复多选组件处于拖拽状态时画布组件命中高亮的问题,优化多选拖拽体验

* fix(stage): type.ts 中定义全局拖拽状态枚举 StageDragStatus,并修改相关的枚举使用项

Co-authored-by: jia000 <398009049@qq.com>
This commit is contained in:
王明华 2022-08-12 13:15:26 +08:00 committed by GitHub
parent cf9768ba96
commit 8f5acff0a6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 36 additions and 26 deletions

View File

@ -35,6 +35,7 @@ import {
Runtime, Runtime,
SortEventData, SortEventData,
StageCoreConfig, StageCoreConfig,
StageDragStatus,
UpdateData, UpdateData,
UpdateEventData, UpdateEventData,
} from './types'; } from './types';
@ -101,6 +102,8 @@ export default class StageCore extends EventEmitter {
.on('highlight', async (event: MouseEvent) => { .on('highlight', async (event: MouseEvent) => {
const el = await this.getElementFromPoint(event); const el = await this.getElementFromPoint(event);
if (!el) return; if (!el) return;
// 如果多选组件处于拖拽状态时不进行组件高亮
if (this.multiDr.dragStatus === StageDragStatus.ING) return;
await this.highlight(el); await this.highlight(el);
if (this.highlightedDom === this.selectedDom) { if (this.highlightedDom === this.selectedDom) {
this.highlightLayer.clearHighlight(); this.highlightLayer.clearHighlight();

View File

@ -29,18 +29,9 @@ import { DRAG_EL_ID_PREFIX, GHOST_EL_ID_PREFIX, GuidesType, Mode, ZIndex } from
import StageCore from './StageCore'; import StageCore from './StageCore';
import StageMask from './StageMask'; import StageMask from './StageMask';
import type { StageDragResizeConfig } from './types'; import type { StageDragResizeConfig } from './types';
import { StageDragStatus } from './types';
import { calcValueByFontsize, down, getAbsolutePosition, getMode, getOffset, getTargetElStyle, up } from './util'; import { calcValueByFontsize, down, getAbsolutePosition, getMode, getOffset, getTargetElStyle, up } from './util';
/** 拖动状态 */
enum ActionStatus {
/** 开始拖动 */
START = 'start',
/** 拖动中 */
ING = 'ing',
/** 拖动结束 */
END = 'end',
}
/** /**
* *
*/ */
@ -66,7 +57,7 @@ export default class StageDragResize extends EventEmitter {
private moveableOptions: MoveableOptions = {}; private moveableOptions: MoveableOptions = {};
/** 拖动状态 */ /** 拖动状态 */
private dragStatus: ActionStatus = ActionStatus.END; private dragStatus: StageDragStatus = StageDragStatus.END;
/** 流式布局下,目标节点的镜像节点 */ /** 流式布局下,目标节点的镜像节点 */
private ghostEl: HTMLElement | undefined; private ghostEl: HTMLElement | undefined;
private moveableHelper?: MoveableHelper; private moveableHelper?: MoveableHelper;
@ -165,7 +156,7 @@ export default class StageDragResize extends EventEmitter {
this.moveable?.destroy(); this.moveable?.destroy();
this.destroyGhostEl(); this.destroyGhostEl();
this.destroyDragEl(); this.destroyDragEl();
this.dragStatus = ActionStatus.END; this.dragStatus = StageDragStatus.END;
this.removeAllListeners(); this.removeAllListeners();
} }
@ -243,7 +234,7 @@ export default class StageDragResize extends EventEmitter {
.on('resizeStart', (e) => { .on('resizeStart', (e) => {
if (!this.target) return; if (!this.target) return;
this.dragStatus = ActionStatus.START; this.dragStatus = StageDragStatus.START;
this.moveableHelper?.onResizeStart(e); this.moveableHelper?.onResizeStart(e);
frame.top = this.target.offsetTop; frame.top = this.target.offsetTop;
@ -254,7 +245,7 @@ export default class StageDragResize extends EventEmitter {
if (!this.moveable || !this.target || !this.dragEl) return; if (!this.moveable || !this.target || !this.dragEl) return;
const { beforeTranslate } = drag; const { beforeTranslate } = drag;
this.dragStatus = ActionStatus.ING; this.dragStatus = StageDragStatus.ING;
this.moveableHelper?.onResize(e); this.moveableHelper?.onResize(e);
@ -270,7 +261,7 @@ export default class StageDragResize extends EventEmitter {
this.target.style.height = `${height}px`; this.target.style.height = `${height}px`;
}) })
.on('resizeEnd', () => { .on('resizeEnd', () => {
this.dragStatus = ActionStatus.END; this.dragStatus = StageDragStatus.END;
this.update(true); this.update(true);
}); });
} }
@ -292,7 +283,7 @@ export default class StageDragResize extends EventEmitter {
.on('dragStart', (e) => { .on('dragStart', (e) => {
if (!this.target) throw new Error('未选中组件'); if (!this.target) throw new Error('未选中组件');
this.dragStatus = ActionStatus.START; this.dragStatus = StageDragStatus.START;
this.moveableHelper?.onDragStart(e); this.moveableHelper?.onDragStart(e);
@ -313,7 +304,7 @@ export default class StageDragResize extends EventEmitter {
timeout = this.core.getAddContainerHighlightClassNameTimeout(e.inputEvent, [this.target]); timeout = this.core.getAddContainerHighlightClassNameTimeout(e.inputEvent, [this.target]);
this.dragStatus = ActionStatus.ING; this.dragStatus = StageDragStatus.ING;
// 流式布局 // 流式布局
if (this.ghostEl) { if (this.ghostEl) {
@ -339,7 +330,7 @@ export default class StageDragResize extends EventEmitter {
} }
// 点击不拖动时会触发dragStart和dragEnd但是不会有drag事件 // 点击不拖动时会触发dragStart和dragEnd但是不会有drag事件
if (this.dragStatus === ActionStatus.ING) { if (this.dragStatus === StageDragStatus.ING) {
if (parentEl) { if (parentEl) {
this.update(false, parentEl); this.update(false, parentEl);
} else { } else {
@ -353,7 +344,7 @@ export default class StageDragResize extends EventEmitter {
} }
} }
this.dragStatus = ActionStatus.END; this.dragStatus = StageDragStatus.END;
this.destroyGhostEl(); this.destroyGhostEl();
}); });
} }
@ -363,18 +354,18 @@ export default class StageDragResize extends EventEmitter {
this.moveable this.moveable
.on('rotateStart', (e) => { .on('rotateStart', (e) => {
this.dragStatus = ActionStatus.START; this.dragStatus = StageDragStatus.START;
this.moveableHelper?.onRotateStart(e); this.moveableHelper?.onRotateStart(e);
}) })
.on('rotate', (e) => { .on('rotate', (e) => {
if (!this.target || !this.dragEl) return; if (!this.target || !this.dragEl) return;
this.dragStatus = ActionStatus.ING; this.dragStatus = StageDragStatus.ING;
this.moveableHelper?.onRotate(e); this.moveableHelper?.onRotate(e);
const frame = this.moveableHelper?.getFrame(e.target); const frame = this.moveableHelper?.getFrame(e.target);
this.target.style.transform = frame?.toCSSObject().transform || ''; this.target.style.transform = frame?.toCSSObject().transform || '';
}) })
.on('rotateEnd', (e) => { .on('rotateEnd', (e) => {
this.dragStatus = ActionStatus.END; this.dragStatus = StageDragStatus.END;
const frame = this.moveableHelper?.getFrame(e.target); const frame = this.moveableHelper?.getFrame(e.target);
this.emit('update', { this.emit('update', {
el: this.target, el: this.target,
@ -390,18 +381,18 @@ export default class StageDragResize extends EventEmitter {
this.moveable this.moveable
.on('scaleStart', (e) => { .on('scaleStart', (e) => {
this.dragStatus = ActionStatus.START; this.dragStatus = StageDragStatus.START;
this.moveableHelper?.onScaleStart(e); this.moveableHelper?.onScaleStart(e);
}) })
.on('scale', (e) => { .on('scale', (e) => {
if (!this.target || !this.dragEl) return; if (!this.target || !this.dragEl) return;
this.dragStatus = ActionStatus.ING; this.dragStatus = StageDragStatus.ING;
this.moveableHelper?.onScale(e); this.moveableHelper?.onScale(e);
const frame = this.moveableHelper?.getFrame(e.target); const frame = this.moveableHelper?.getFrame(e.target);
this.target.style.transform = frame?.toCSSObject().transform || ''; this.target.style.transform = frame?.toCSSObject().transform || '';
}) })
.on('scaleEnd', (e) => { .on('scaleEnd', (e) => {
this.dragStatus = ActionStatus.END; this.dragStatus = StageDragStatus.END;
const frame = this.moveableHelper?.getFrame(e.target); const frame = this.moveableHelper?.getFrame(e.target);
this.emit('update', { this.emit('update', {
el: this.target, el: this.target,

View File

@ -25,8 +25,9 @@ import MoveableHelper from 'moveable-helper';
import { DRAG_EL_ID_PREFIX, PAGE_CLASS } from './const'; import { DRAG_EL_ID_PREFIX, PAGE_CLASS } from './const';
import StageCore from './StageCore'; import StageCore from './StageCore';
import StageMask from './StageMask'; import StageMask from './StageMask';
import { StageDragResizeConfig } from './types'; import { StageDragResizeConfig, StageDragStatus } from './types';
import { calcValueByFontsize, getMode, getTargetElStyle } from './util'; import { calcValueByFontsize, getMode, getTargetElStyle } from './util';
export default class StageMultiDragResize extends EventEmitter { export default class StageMultiDragResize extends EventEmitter {
public core: StageCore; public core: StageCore;
public mask: StageMask; public mask: StageMask;
@ -38,6 +39,8 @@ export default class StageMultiDragResize extends EventEmitter {
public dragElList: HTMLDivElement[] = []; public dragElList: HTMLDivElement[] = [];
/** Moveable多选拖拽类实例 */ /** Moveable多选拖拽类实例 */
public moveableForMulti?: Moveable; public moveableForMulti?: Moveable;
/** 拖动状态 */
public dragStatus: StageDragStatus = StageDragStatus.END;
private multiMoveableHelper?: MoveableHelper; private multiMoveableHelper?: MoveableHelper;
constructor(config: StageDragResizeConfig) { constructor(config: StageDragResizeConfig) {
@ -99,6 +102,7 @@ export default class StageMultiDragResize extends EventEmitter {
id: matchEventTarget.id, id: matchEventTarget.id,
}); });
}); });
this.dragStatus = StageDragStatus.START;
}) })
.on('dragGroup', (params) => { .on('dragGroup', (params) => {
const { events } = params; const { events } = params;
@ -121,9 +125,11 @@ export default class StageMultiDragResize extends EventEmitter {
} }
}); });
this.multiMoveableHelper?.onDragGroup(params); this.multiMoveableHelper?.onDragGroup(params);
this.dragStatus = StageDragStatus.ING;
}) })
.on('dragGroupEnd', () => { .on('dragGroupEnd', () => {
this.update(); this.update();
this.dragStatus = StageDragStatus.END;
}) })
.on('clickGroup', (params) => { .on('clickGroup', (params) => {
const { inputTarget, targets } = params; const { inputTarget, targets } = params;

View File

@ -61,6 +61,16 @@ export interface StageDragResizeConfig {
mask: StageMask; mask: StageMask;
} }
/** 拖动状态 */
export enum StageDragStatus {
/** 开始拖动 */
START = 'start',
/** 拖动中 */
ING = 'ing',
/** 拖动结束 */
END = 'end',
}
export type Rect = { export type Rect = {
width: number; width: number;
height: number; height: number;