mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2026-06-09 00:42:23 +00:00
121 lines
3.1 KiB
TypeScript
121 lines
3.1 KiB
TypeScript
import {
|
||
ILocateEvent as InnerLocateEvent,
|
||
} from '@alilc/lowcode-designer';
|
||
import { dragonSymbol, nodeSymbol } from '../symbols';
|
||
import LocateEvent from './locate-event';
|
||
import { DragObject } from './drag-object';
|
||
import { globalContext } from '@alilc/lowcode-editor-core';
|
||
import {
|
||
IPublicModelDragon,
|
||
IPublicModelLocateEvent,
|
||
IPublicModelDragObject,
|
||
IPublicTypeDragNodeDataObject,
|
||
IPublicModelNode,
|
||
} from '@alilc/lowcode-types';
|
||
|
||
export const innerDragonSymbol = Symbol('innerDragonSymbol');
|
||
|
||
|
||
export class Dragon implements IPublicModelDragon {
|
||
private readonly [innerDragonSymbol]: IPublicModelDragon;
|
||
|
||
constructor(innerDragon: IPublicModelDragon) {
|
||
this[innerDragonSymbol] = innerDragon;
|
||
}
|
||
|
||
get [dragonSymbol](): any {
|
||
const workspace = globalContext.get('workspace');
|
||
let editor = globalContext.get('editor');
|
||
|
||
if (workspace.isActive) {
|
||
editor = workspace.window.editor;
|
||
}
|
||
|
||
const designer = editor.get('designer');
|
||
return designer.dragon;
|
||
}
|
||
|
||
static create(dragon: IPublicModelDragon | null): IPublicModelDragon | null {
|
||
if (!dragon) {
|
||
return null;
|
||
}
|
||
return new Dragon(dragon);
|
||
}
|
||
|
||
/**
|
||
* is dragging or not
|
||
*/
|
||
get dragging(): boolean {
|
||
return this[dragonSymbol].dragging;
|
||
}
|
||
|
||
/**
|
||
* 绑定 dragstart 事件
|
||
* @param func
|
||
* @returns
|
||
*/
|
||
onDragstart(func: (e: IPublicModelLocateEvent) => any): () => void {
|
||
return this[dragonSymbol].onDragstart((e: InnerLocateEvent) => func(LocateEvent.create(e)!));
|
||
}
|
||
|
||
/**
|
||
* 绑定 drag 事件
|
||
* @param func
|
||
* @returns
|
||
*/
|
||
onDrag(func: (e: IPublicModelLocateEvent) => any): () => void {
|
||
return this[dragonSymbol].onDrag((e: InnerLocateEvent) => func(LocateEvent.create(e)!));
|
||
}
|
||
|
||
/**
|
||
* 绑定 dragend 事件
|
||
* @param func
|
||
* @returns
|
||
*/
|
||
onDragend(func: (o: { dragObject: IPublicModelDragObject; copy?: boolean }) => any): () => void {
|
||
return this[dragonSymbol].onDragend(
|
||
(o: { dragObject: IPublicModelDragObject; copy?: boolean }) => {
|
||
const dragObject = DragObject.create(o.dragObject);
|
||
const { copy } = o;
|
||
return func({ dragObject: dragObject!, copy });
|
||
},
|
||
);
|
||
}
|
||
|
||
/**
|
||
* 设置拖拽监听的区域 shell,以及自定义拖拽转换函数 boost
|
||
* @param shell 拖拽监听的区域
|
||
* @param boost 拖拽转换函数
|
||
*/
|
||
from(shell: Element, boost: (e: MouseEvent) => IPublicTypeDragNodeDataObject | null): any {
|
||
return this[dragonSymbol].from(shell, boost);
|
||
}
|
||
|
||
/**
|
||
* boost your dragObject for dragging(flying) 发射拖拽对象
|
||
*
|
||
* @param dragObject 拖拽对象
|
||
* @param boostEvent 拖拽初始时事件
|
||
*/
|
||
boost(dragObject: DragObject, boostEvent: MouseEvent | DragEvent, fromRglNode?: Node | IPublicModelNode): void {
|
||
return this[dragonSymbol].boost({
|
||
...dragObject,
|
||
nodes: dragObject.nodes.map((node: any) => node[nodeSymbol]),
|
||
}, boostEvent, fromRglNode);
|
||
}
|
||
|
||
/**
|
||
* 添加投放感应区
|
||
*/
|
||
addSensor(sensor: any): void {
|
||
return this[dragonSymbol].addSensor(sensor);
|
||
}
|
||
|
||
/**
|
||
* 移除投放感应
|
||
*/
|
||
removeSensor(sensor: any): void {
|
||
return this[dragonSymbol].removeSensor(sensor);
|
||
}
|
||
}
|