forked from alibaba/lowcode-engine
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdragon.ts
More file actions
130 lines (115 loc) · 3.37 KB
/
dragon.ts
File metadata and controls
130 lines (115 loc) · 3.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import {
IDragon,
ILocateEvent as InnerLocateEvent,
INode,
} 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,
IPublicTypeDragObject,
} from '@alilc/lowcode-types';
export const innerDragonSymbol = Symbol('innerDragonSymbol');
export class Dragon implements IPublicModelDragon {
private readonly [innerDragonSymbol]: IDragon;
constructor(innerDragon: IDragon, readonly workspaceMode: boolean) {
this[innerDragonSymbol] = innerDragon;
}
get [dragonSymbol](): IDragon {
if (this.workspaceMode) {
return this[innerDragonSymbol];
}
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: IDragon | null,
workspaceMode: boolean,
): IPublicModelDragon | null {
if (!dragon) {
return null;
}
return new Dragon(dragon, workspaceMode);
}
/**
* 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: IPublicTypeDragObject, boostEvent: MouseEvent | DragEvent, fromRglNode?: IPublicModelNode & {
[nodeSymbol]: INode;
}): void {
return this[dragonSymbol].boost({
...dragObject,
nodes: dragObject.nodes.map((node: any) => node[nodeSymbol]),
}, boostEvent, fromRglNode?.[nodeSymbol]);
}
/**
* 添加投放感应区
*/
addSensor(sensor: any): void {
return this[dragonSymbol].addSensor(sensor);
}
/**
* 移除投放感应
*/
removeSensor(sensor: any): void {
return this[dragonSymbol].removeSensor(sensor);
}
}