@idraw/core 0.3.0-alpha.6 → 0.3.0-alpha.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/dist/esm/constant/element.d.ts +2 -0
  2. package/dist/esm/constant/element.js +10 -0
  3. package/dist/esm/constant/static.d.ts +11 -0
  4. package/dist/esm/constant/static.js +13 -0
  5. package/dist/esm/index.d.ts +59 -0
  6. package/{esm → dist/esm}/index.js +10 -10
  7. package/dist/esm/lib/calculate.d.ts +5 -0
  8. package/dist/esm/lib/calculate.js +64 -0
  9. package/dist/esm/lib/check.d.ts +28 -0
  10. package/dist/esm/lib/check.js +115 -0
  11. package/dist/esm/lib/config.d.ts +3 -0
  12. package/dist/esm/lib/config.js +20 -0
  13. package/dist/esm/lib/core-event.d.ts +49 -0
  14. package/dist/esm/lib/core-event.js +50 -0
  15. package/dist/esm/lib/diff.d.ts +6 -0
  16. package/dist/esm/lib/diff.js +80 -0
  17. package/dist/esm/lib/draw/base.d.ts +5 -0
  18. package/dist/esm/lib/draw/base.js +90 -0
  19. package/dist/esm/lib/draw/wrapper.d.ts +4 -0
  20. package/dist/esm/lib/draw/wrapper.js +144 -0
  21. package/dist/esm/lib/element/element-base.d.ts +3 -0
  22. package/dist/esm/lib/element/element-base.js +5 -0
  23. package/dist/esm/lib/element/element-controller.d.ts +3 -0
  24. package/dist/esm/lib/element/element-controller.js +3 -0
  25. package/dist/esm/lib/element/element-hub.d.ts +9 -0
  26. package/dist/esm/lib/element/element-hub.js +16 -0
  27. package/dist/esm/lib/element.d.ts +15 -0
  28. package/dist/esm/lib/element.js +380 -0
  29. package/dist/esm/lib/engine-temp.d.ts +22 -0
  30. package/dist/esm/lib/engine-temp.js +29 -0
  31. package/dist/esm/lib/engine.d.ts +47 -0
  32. package/dist/esm/lib/engine.js +323 -0
  33. package/dist/esm/lib/helper.d.ts +30 -0
  34. package/dist/esm/lib/helper.js +363 -0
  35. package/dist/esm/lib/index.d.ts +13 -0
  36. package/dist/esm/lib/index.js +13 -0
  37. package/dist/esm/lib/is.d.ts +26 -0
  38. package/dist/esm/lib/is.js +100 -0
  39. package/dist/esm/lib/mapper.d.ts +26 -0
  40. package/dist/esm/lib/mapper.js +89 -0
  41. package/dist/esm/lib/parse.d.ts +2 -0
  42. package/dist/esm/lib/parse.js +29 -0
  43. package/dist/esm/lib/temp.d.ts +11 -0
  44. package/dist/esm/lib/temp.js +19 -0
  45. package/dist/esm/lib/transform.d.ts +4 -0
  46. package/dist/esm/lib/transform.js +20 -0
  47. package/dist/esm/lib/value.d.ts +2 -0
  48. package/dist/esm/lib/value.js +7 -0
  49. package/dist/esm/mixins/element.d.ts +20 -0
  50. package/dist/esm/mixins/element.js +156 -0
  51. package/{esm → dist/esm}/names.d.ts +0 -0
  52. package/{esm → dist/esm}/names.js +0 -0
  53. package/dist/esm/plugins/helper.d.ts +12 -0
  54. package/dist/esm/plugins/helper.js +21 -0
  55. package/dist/esm/util/filter.d.ts +1 -0
  56. package/dist/esm/util/filter.js +3 -0
  57. package/dist/index.global.js +4431 -5923
  58. package/dist/index.global.min.js +1 -1
  59. package/package.json +11 -16
  60. package/dist/index.cjs.js +0 -5995
  61. package/dist/index.d.ts +0 -163
  62. package/dist/index.esm.js +0 -5993
  63. package/esm/default.d.ts +0 -1
  64. package/esm/default.js +0 -2
  65. package/esm/esm.d.ts +0 -2
  66. package/esm/esm.js +0 -3
@@ -0,0 +1,22 @@
1
+ import { TypeHelperWrapperControllerDirection, TypePoint } from '@idraw/types';
2
+ import { Mode, CursorStatus } from '../constant/static';
3
+ type TempDataDesc = {
4
+ hasInited: boolean;
5
+ mode: Mode;
6
+ cursorStatus: CursorStatus;
7
+ selectedUUID: string | null;
8
+ selectedUUIDList: string[];
9
+ hoverUUID: string | null;
10
+ selectedControllerDirection: TypeHelperWrapperControllerDirection | null;
11
+ hoverControllerDirection: TypeHelperWrapperControllerDirection | null;
12
+ prevPoint: TypePoint | null;
13
+ hasChangedElement: boolean;
14
+ };
15
+ export declare class TempData {
16
+ private _temp;
17
+ constructor();
18
+ set<T extends keyof TempDataDesc>(name: T, value: TempDataDesc[T]): void;
19
+ get<T extends keyof TempDataDesc>(name: T): TempDataDesc[T];
20
+ clear(): void;
21
+ }
22
+ export {};
@@ -0,0 +1,29 @@
1
+ import { Mode, CursorStatus } from '../constant/static';
2
+ function createData() {
3
+ return {
4
+ hasInited: false,
5
+ mode: Mode.NULL,
6
+ cursorStatus: CursorStatus.NULL,
7
+ selectedUUID: null,
8
+ selectedUUIDList: [],
9
+ hoverUUID: null,
10
+ selectedControllerDirection: null,
11
+ hoverControllerDirection: null,
12
+ prevPoint: null,
13
+ hasChangedElement: false
14
+ };
15
+ }
16
+ export class TempData {
17
+ constructor() {
18
+ this._temp = createData();
19
+ }
20
+ set(name, value) {
21
+ this._temp[name] = value;
22
+ }
23
+ get(name) {
24
+ return this._temp[name];
25
+ }
26
+ clear() {
27
+ this._temp = createData();
28
+ }
29
+ }
@@ -0,0 +1,47 @@
1
+ import { TypePoint, InterfaceHelperPlugin, TypeConfigStrict, TypeData, TypeHelperConfig } from '@idraw/types';
2
+ import Board from '@idraw/board';
3
+ import { TempData } from './engine-temp';
4
+ import { Helper } from './helper';
5
+ import { Element } from './element';
6
+ import { CoreEvent } from './core-event';
7
+ type Options = {
8
+ coreEvent: CoreEvent;
9
+ board: Board;
10
+ element: Element;
11
+ config: TypeConfigStrict;
12
+ drawFeekback: () => void;
13
+ getDataFeekback: () => TypeData;
14
+ selectElementByIndex: (index: number, opts?: {
15
+ useMode?: boolean;
16
+ }) => void;
17
+ emitChangeScreen: () => void;
18
+ emitChangeData: () => void;
19
+ };
20
+ export declare class Engine {
21
+ private _plugins;
22
+ private _opts;
23
+ private _mapper;
24
+ temp: TempData;
25
+ helper: Helper;
26
+ constructor(opts: Options);
27
+ addPlugin(plugin: InterfaceHelperPlugin): void;
28
+ getHelperConfig(): TypeHelperConfig;
29
+ updateHelperConfig(opts: {
30
+ width: number;
31
+ height: number;
32
+ devicePixelRatio: number;
33
+ }): void;
34
+ init(): void;
35
+ private _initEvent;
36
+ private _handleDoubleClick;
37
+ _handlePoint(point: TypePoint): void;
38
+ private _handleClick;
39
+ private _handleMoveStart;
40
+ private _handleMove;
41
+ private _dragElements;
42
+ private _transfromElement;
43
+ private _handleMoveEnd;
44
+ private _handleHover;
45
+ private _handleLeave;
46
+ }
47
+ export {};
@@ -0,0 +1,323 @@
1
+ import { deepClone, throttle } from '@idraw/util';
2
+ import { Mode, CursorStatus } from './../constant/static';
3
+ import { TempData } from './engine-temp';
4
+ import { Helper } from './helper';
5
+ import { Mapper } from './mapper';
6
+ export class Engine {
7
+ constructor(opts) {
8
+ this._plugins = [];
9
+ const { board, config, element } = opts;
10
+ const helper = new Helper(board, config);
11
+ this._opts = opts;
12
+ this.temp = new TempData();
13
+ this.helper = helper;
14
+ this._mapper = new Mapper({ board, helper, element });
15
+ }
16
+ addPlugin(plugin) {
17
+ this._plugins.push(plugin);
18
+ }
19
+ getHelperConfig() {
20
+ return this.helper.getConfig();
21
+ }
22
+ updateHelperConfig(opts) {
23
+ var _a;
24
+ const { board, getDataFeekback, config } = this._opts;
25
+ const data = getDataFeekback();
26
+ const transform = board.getTransform();
27
+ this.helper.updateConfig(data, {
28
+ width: opts.width,
29
+ height: opts.height,
30
+ devicePixelRatio: opts.devicePixelRatio,
31
+ canScroll: ((_a = config === null || config === void 0 ? void 0 : config.scrollWrapper) === null || _a === void 0 ? void 0 : _a.use) === true,
32
+ selectedUUID: this.temp.get('selectedUUID'),
33
+ selectedUUIDList: this.temp.get('selectedUUIDList'),
34
+ scale: transform.scale,
35
+ scrollX: transform.scrollX,
36
+ scrollY: transform.scrollY
37
+ });
38
+ }
39
+ init() {
40
+ this._initEvent();
41
+ }
42
+ _initEvent() {
43
+ if (this.temp.get('hasInited') === true) {
44
+ return;
45
+ }
46
+ const { board } = this._opts;
47
+ board.on('hover', throttle(this._handleHover.bind(this), 32));
48
+ board.on('leave', throttle(this._handleLeave.bind(this), 32));
49
+ board.on('point', throttle(this._handleClick.bind(this), 16));
50
+ board.on('doubleClick', this._handleDoubleClick.bind(this));
51
+ board.on('point', this._handlePoint.bind(this));
52
+ board.on('moveStart', this._handleMoveStart.bind(this));
53
+ board.on('move', throttle(this._handleMove.bind(this), 16));
54
+ board.on('moveEnd', this._handleMoveEnd.bind(this));
55
+ }
56
+ _handleDoubleClick(point) {
57
+ var _a, _b, _c;
58
+ const { element, getDataFeekback, drawFeekback, coreEvent } = this._opts;
59
+ const data = getDataFeekback();
60
+ const [index, uuid] = element.isPointInElement(point, data);
61
+ if (index >= 0 && uuid) {
62
+ const elem = deepClone((_a = data.elements) === null || _a === void 0 ? void 0 : _a[index]);
63
+ if (((_b = elem === null || elem === void 0 ? void 0 : elem.operation) === null || _b === void 0 ? void 0 : _b.invisible) !== true) {
64
+ coreEvent.trigger('screenDoubleClickElement', {
65
+ index,
66
+ uuid,
67
+ element: deepClone((_c = data.elements) === null || _c === void 0 ? void 0 : _c[index])
68
+ });
69
+ }
70
+ }
71
+ drawFeekback();
72
+ }
73
+ _handlePoint(point) {
74
+ var _a, _b, _c;
75
+ if (!this._mapper.isEffectivePoint(point)) {
76
+ return;
77
+ }
78
+ const { element, getDataFeekback, selectElementByIndex, coreEvent, emitChangeScreen, drawFeekback } = this._opts;
79
+ const helper = this.helper;
80
+ const data = getDataFeekback();
81
+ if (helper.isPointInElementList(point, data)) {
82
+ this.temp.set('mode', Mode.SELECT_ELEMENT_LIST);
83
+ }
84
+ else {
85
+ const { uuid, selectedControllerDirection } = helper.isPointInElementWrapperController(point, data);
86
+ if (uuid && selectedControllerDirection) {
87
+ this.temp.set('mode', Mode.SELECT_ELEMENT_WRAPPER_CONTROLLER);
88
+ this.temp.set('selectedControllerDirection', selectedControllerDirection);
89
+ this.temp.set('selectedUUID', uuid);
90
+ }
91
+ else {
92
+ const [index, uuid] = element.isPointInElement(point, data);
93
+ if (index >= 0 && ((_b = (_a = data.elements[index]) === null || _a === void 0 ? void 0 : _a.operation) === null || _b === void 0 ? void 0 : _b.invisible) !== true) {
94
+ selectElementByIndex(index, { useMode: true });
95
+ if (typeof uuid === 'string' &&
96
+ coreEvent.has('screenSelectElement')) {
97
+ coreEvent.trigger('screenSelectElement', {
98
+ index,
99
+ uuid,
100
+ element: deepClone((_c = data.elements) === null || _c === void 0 ? void 0 : _c[index])
101
+ });
102
+ emitChangeScreen();
103
+ }
104
+ this.temp.set('mode', Mode.SELECT_ELEMENT);
105
+ }
106
+ else {
107
+ this.temp.set('selectedUUIDList', []);
108
+ this.temp.set('selectedUUID', null);
109
+ this.temp.set('mode', Mode.SELECT_AREA);
110
+ }
111
+ }
112
+ }
113
+ drawFeekback();
114
+ }
115
+ _handleClick(point) {
116
+ var _a;
117
+ const { element, getDataFeekback, coreEvent, drawFeekback } = this._opts;
118
+ const data = getDataFeekback();
119
+ const [index, uuid] = element.isPointInElement(point, data);
120
+ if (index >= 0 && uuid) {
121
+ coreEvent.trigger('screenClickElement', {
122
+ index,
123
+ uuid,
124
+ element: deepClone((_a = data.elements) === null || _a === void 0 ? void 0 : _a[index])
125
+ });
126
+ }
127
+ drawFeekback();
128
+ }
129
+ _handleMoveStart(point) {
130
+ const { element, getDataFeekback, coreEvent } = this._opts;
131
+ const data = getDataFeekback();
132
+ const helper = this.helper;
133
+ this.temp.set('prevPoint', point);
134
+ const uuid = this.temp.get('selectedUUID');
135
+ if (this.temp.get('mode') === Mode.SELECT_ELEMENT_LIST) {
136
+ }
137
+ else if (this.temp.get('mode') === Mode.SELECT_ELEMENT) {
138
+ if (typeof uuid === 'string' && coreEvent.has('screenMoveElementStart')) {
139
+ coreEvent.trigger('screenMoveElementStart', {
140
+ index: element.getElementIndex(data, uuid),
141
+ uuid,
142
+ x: point.x,
143
+ y: point.y
144
+ });
145
+ }
146
+ }
147
+ else if (this.temp.get('mode') === Mode.SELECT_AREA) {
148
+ helper.startSelectArea(point);
149
+ }
150
+ }
151
+ _handleMove(point) {
152
+ const { drawFeekback } = this._opts;
153
+ const helper = this.helper;
154
+ if (this.temp.get('mode') === Mode.SELECT_ELEMENT_LIST) {
155
+ this.temp.set('hasChangedElement', true);
156
+ this._dragElements(this.temp.get('selectedUUIDList'), point, this.temp.get('prevPoint'));
157
+ drawFeekback();
158
+ this.temp.set('cursorStatus', CursorStatus.DRAGGING);
159
+ }
160
+ else if (typeof this.temp.get('selectedUUID') === 'string') {
161
+ if (this.temp.get('mode') === Mode.SELECT_ELEMENT) {
162
+ this.temp.set('hasChangedElement', true);
163
+ this._dragElements([this.temp.get('selectedUUID')], point, this.temp.get('prevPoint'));
164
+ drawFeekback();
165
+ this.temp.set('cursorStatus', CursorStatus.DRAGGING);
166
+ }
167
+ else if (this.temp.get('mode') === Mode.SELECT_ELEMENT_WRAPPER_CONTROLLER &&
168
+ this.temp.get('selectedControllerDirection')) {
169
+ this._transfromElement(this.temp.get('selectedUUID'), point, this.temp.get('prevPoint'), this.temp.get('selectedControllerDirection'));
170
+ this.temp.set('cursorStatus', CursorStatus.DRAGGING);
171
+ }
172
+ }
173
+ else if (this.temp.get('mode') === Mode.SELECT_AREA) {
174
+ helper.changeSelectArea(point);
175
+ drawFeekback();
176
+ }
177
+ this.temp.set('prevPoint', point);
178
+ }
179
+ _dragElements(uuids, point, prevPoint) {
180
+ if (!prevPoint) {
181
+ return;
182
+ }
183
+ const { board, element, getDataFeekback, drawFeekback } = this._opts;
184
+ const data = getDataFeekback();
185
+ const helper = this.helper;
186
+ uuids.forEach((uuid) => {
187
+ var _a, _b;
188
+ const idx = helper.getElementIndexByUUID(uuid);
189
+ if (idx === null)
190
+ return;
191
+ const elem = data.elements[idx];
192
+ if (((_a = elem === null || elem === void 0 ? void 0 : elem.operation) === null || _a === void 0 ? void 0 : _a.lock) !== true &&
193
+ ((_b = elem === null || elem === void 0 ? void 0 : elem.operation) === null || _b === void 0 ? void 0 : _b.invisible) !== true) {
194
+ element.dragElement(data, uuid, point, prevPoint, board.getContext().getTransform().scale);
195
+ }
196
+ });
197
+ drawFeekback();
198
+ }
199
+ _transfromElement(uuid, point, prevPoint, direction) {
200
+ if (!prevPoint) {
201
+ return null;
202
+ }
203
+ const { board, element, getDataFeekback, drawFeekback } = this._opts;
204
+ const data = getDataFeekback();
205
+ const result = element.transformElement(data, uuid, point, prevPoint, board.getContext().getTransform().scale, direction);
206
+ drawFeekback();
207
+ return result;
208
+ }
209
+ _handleMoveEnd(point) {
210
+ const { element, getDataFeekback, coreEvent, drawFeekback, emitChangeData } = this._opts;
211
+ const data = getDataFeekback();
212
+ const helper = this.helper;
213
+ const uuid = this.temp.get('selectedUUID');
214
+ if (typeof uuid === 'string') {
215
+ const index = element.getElementIndex(data, uuid);
216
+ const elem = data.elements[index];
217
+ if (elem) {
218
+ if (coreEvent.has('screenMoveElementEnd')) {
219
+ coreEvent.trigger('screenMoveElementEnd', {
220
+ index,
221
+ uuid,
222
+ x: point.x,
223
+ y: point.y
224
+ });
225
+ }
226
+ if (coreEvent.has('screenChangeElement')) {
227
+ coreEvent.trigger('screenChangeElement', {
228
+ index,
229
+ uuid,
230
+ width: elem.w,
231
+ height: elem.h,
232
+ angle: elem.angle || 0
233
+ });
234
+ }
235
+ }
236
+ }
237
+ else if (this.temp.get('mode') === Mode.SELECT_AREA) {
238
+ const uuids = helper.calcSelectedElements(data);
239
+ if (uuids.length > 0) {
240
+ this.temp.set('selectedUUIDList', uuids);
241
+ this.temp.set('selectedUUID', null);
242
+ }
243
+ else {
244
+ this.temp.set('mode', Mode.NULL);
245
+ }
246
+ helper.clearSelectedArea();
247
+ drawFeekback();
248
+ }
249
+ if (this.temp.get('mode') !== Mode.SELECT_ELEMENT) {
250
+ this.temp.set('selectedUUID', null);
251
+ }
252
+ this.temp.set('cursorStatus', CursorStatus.NULL);
253
+ this.temp.set('mode', Mode.NULL);
254
+ if (this.temp.get('hasChangedElement') === true) {
255
+ emitChangeData();
256
+ this.temp.set('hasChangedElement', false);
257
+ }
258
+ }
259
+ _handleHover(point) {
260
+ var _a, _b;
261
+ let isMouseOverElement = false;
262
+ const { board, getDataFeekback, coreEvent } = this._opts;
263
+ const data = getDataFeekback();
264
+ const helper = this.helper;
265
+ const mapper = this._mapper;
266
+ if (this.temp.get('mode') === Mode.SELECT_AREA) {
267
+ board.resetCursor();
268
+ }
269
+ else if (this.temp.get('cursorStatus') === CursorStatus.NULL) {
270
+ const { cursor, elementUUID } = mapper.judgePointCursor(point, data);
271
+ board.setCursor(cursor);
272
+ if (elementUUID) {
273
+ const index = helper.getElementIndexByUUID(elementUUID);
274
+ if (index !== null && index >= 0) {
275
+ const elem = data.elements[index];
276
+ if (((_a = elem === null || elem === void 0 ? void 0 : elem.operation) === null || _a === void 0 ? void 0 : _a.lock) === true ||
277
+ ((_b = elem === null || elem === void 0 ? void 0 : elem.operation) === null || _b === void 0 ? void 0 : _b.invisible) === true) {
278
+ board.resetCursor();
279
+ return;
280
+ }
281
+ if (this.temp.get('hoverUUID') !== elem.uuid) {
282
+ const preIndex = helper.getElementIndexByUUID(this.temp.get('hoverUUID') || '');
283
+ if (preIndex !== null && data.elements[preIndex]) {
284
+ coreEvent.trigger('mouseLeaveElement', {
285
+ uuid: this.temp.get('hoverUUID'),
286
+ index: preIndex,
287
+ element: data.elements[preIndex]
288
+ });
289
+ }
290
+ }
291
+ if (elem) {
292
+ coreEvent.trigger('mouseOverElement', {
293
+ uuid: elem.uuid,
294
+ index,
295
+ element: elem
296
+ });
297
+ this.temp.set('hoverUUID', elem.uuid);
298
+ isMouseOverElement = true;
299
+ }
300
+ }
301
+ }
302
+ }
303
+ if (isMouseOverElement !== true && this.temp.get('hoverUUID') !== null) {
304
+ const uuid = this.temp.get('hoverUUID');
305
+ const index = helper.getElementIndexByUUID(uuid || '');
306
+ if (index !== null)
307
+ coreEvent.trigger('mouseLeaveElement', {
308
+ uuid,
309
+ index,
310
+ element: data.elements[index]
311
+ });
312
+ this.temp.set('hoverUUID', null);
313
+ }
314
+ if (coreEvent.has('mouseOverScreen'))
315
+ coreEvent.trigger('mouseOverScreen', point);
316
+ }
317
+ _handleLeave() {
318
+ const { coreEvent } = this._opts;
319
+ if (coreEvent.has('mouseLeaveScreen')) {
320
+ coreEvent.trigger('mouseLeaveScreen', undefined);
321
+ }
322
+ }
323
+ }
@@ -0,0 +1,30 @@
1
+ import { TypeData, TypeHelper, TypeHelperConfig, TypeHelperUpdateOpts, TypeHelperWrapperControllerDirection, TypePoint, TypeConfigStrict } from '@idraw/types';
2
+ import Board from '@idraw/board';
3
+ export declare class Helper implements TypeHelper {
4
+ private _helperConfig;
5
+ private _coreConfig;
6
+ private _ctx;
7
+ private _board;
8
+ private _areaStart;
9
+ private _areaEnd;
10
+ constructor(board: Board, config: TypeConfigStrict);
11
+ updateConfig(data: TypeData, opts: TypeHelperUpdateOpts): void;
12
+ getConfig(): TypeHelperConfig;
13
+ getElementIndexByUUID(uuid: string): number | null;
14
+ isPointInElementWrapperController(p: TypePoint, data?: TypeData): {
15
+ uuid: string | null | undefined;
16
+ selectedControllerDirection: TypeHelperWrapperControllerDirection | null;
17
+ hoverControllerDirection: TypeHelperWrapperControllerDirection | null;
18
+ directIndex: number | null;
19
+ };
20
+ isPointInElementList(p: TypePoint, data: TypeData): boolean;
21
+ startSelectArea(p: TypePoint): void;
22
+ changeSelectArea(p: TypePoint): void;
23
+ clearSelectedArea(): void;
24
+ calcSelectedElements(data: TypeData): string[];
25
+ private _calcSelectedArea;
26
+ private _updateElementIndex;
27
+ private _updateSelectedElementWrapper;
28
+ private _updateSelectedElementListWrapper;
29
+ private _createSelectedElementWrapper;
30
+ }