@idraw/core 0.4.0-beta.4 → 0.4.0-beta.40

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 (85) hide show
  1. package/dist/esm/board/index.d.ts +46 -0
  2. package/dist/esm/board/index.js +371 -0
  3. package/dist/esm/board/sharer.d.ts +21 -0
  4. package/dist/esm/board/sharer.js +101 -0
  5. package/dist/esm/board/viewer.d.ts +32 -0
  6. package/dist/esm/board/viewer.js +165 -0
  7. package/dist/esm/board/watcher.d.ts +15 -0
  8. package/dist/esm/board/watcher.js +218 -0
  9. package/dist/esm/config.d.ts +28 -0
  10. package/dist/esm/config.js +34 -0
  11. package/dist/esm/index.d.ts +23 -9
  12. package/dist/esm/index.js +36 -12
  13. package/dist/esm/lib/cursor-image.d.ts +1 -0
  14. package/dist/esm/lib/cursor-image.js +1 -0
  15. package/dist/esm/lib/cursor.d.ts +3 -12
  16. package/dist/esm/lib/cursor.js +137 -112
  17. package/dist/esm/middleware/dragger/index.d.ts +2 -2
  18. package/dist/esm/middleware/dragger/index.js +5 -3
  19. package/dist/esm/middleware/info/config.d.ts +5 -0
  20. package/dist/esm/middleware/info/config.js +9 -0
  21. package/dist/esm/middleware/info/draw-info.d.ts +29 -0
  22. package/dist/esm/middleware/info/draw-info.js +113 -0
  23. package/dist/esm/middleware/info/index.d.ts +9 -0
  24. package/dist/esm/middleware/info/index.js +131 -0
  25. package/dist/esm/middleware/info/types.d.ts +3 -0
  26. package/dist/esm/middleware/info/types.js +1 -0
  27. package/dist/esm/middleware/layout-selector/config.d.ts +11 -0
  28. package/dist/esm/middleware/layout-selector/config.js +12 -0
  29. package/dist/esm/middleware/layout-selector/index.d.ts +5 -0
  30. package/dist/esm/middleware/layout-selector/index.js +349 -0
  31. package/dist/esm/middleware/layout-selector/types.d.ts +17 -0
  32. package/dist/esm/middleware/layout-selector/types.js +2 -0
  33. package/dist/esm/middleware/layout-selector/util.d.ts +9 -0
  34. package/dist/esm/middleware/layout-selector/util.js +63 -0
  35. package/dist/esm/middleware/pointer/index.d.ts +3 -0
  36. package/dist/esm/middleware/pointer/index.js +43 -0
  37. package/dist/esm/middleware/pointer/types.d.ts +3 -0
  38. package/dist/esm/middleware/pointer/types.js +1 -0
  39. package/dist/esm/middleware/ruler/config.d.ts +7 -0
  40. package/dist/esm/middleware/ruler/config.js +21 -0
  41. package/dist/esm/middleware/ruler/index.d.ts +3 -3
  42. package/dist/esm/middleware/ruler/index.js +33 -14
  43. package/dist/esm/middleware/ruler/types.d.ts +3 -0
  44. package/dist/esm/middleware/ruler/types.js +1 -0
  45. package/dist/esm/middleware/ruler/util.d.ts +20 -4
  46. package/dist/esm/middleware/ruler/util.js +97 -25
  47. package/dist/esm/middleware/scaler/index.d.ts +2 -3
  48. package/dist/esm/middleware/scaler/index.js +3 -2
  49. package/dist/esm/middleware/scroller/config.d.ts +4 -0
  50. package/dist/esm/middleware/scroller/config.js +10 -0
  51. package/dist/esm/middleware/scroller/index.d.ts +3 -2
  52. package/dist/esm/middleware/scroller/index.js +48 -6
  53. package/dist/esm/middleware/scroller/types.d.ts +11 -0
  54. package/dist/esm/middleware/scroller/types.js +1 -0
  55. package/dist/esm/middleware/scroller/util.d.ts +3 -2
  56. package/dist/esm/middleware/scroller/util.js +32 -43
  57. package/dist/esm/middleware/selector/config.d.ts +9 -1
  58. package/dist/esm/middleware/selector/config.js +17 -1
  59. package/dist/esm/middleware/selector/draw-auxiliary.d.ts +1 -0
  60. package/dist/esm/middleware/selector/draw-auxiliary.js +12 -0
  61. package/dist/esm/middleware/selector/draw-base.d.ts +30 -0
  62. package/dist/esm/middleware/selector/draw-base.js +100 -0
  63. package/dist/esm/middleware/selector/draw-debug.d.ts +5 -0
  64. package/dist/esm/middleware/selector/draw-debug.js +30 -0
  65. package/dist/esm/middleware/selector/draw-reference.d.ts +7 -0
  66. package/dist/esm/middleware/selector/draw-reference.js +31 -0
  67. package/dist/esm/middleware/selector/draw-wrapper.d.ts +16 -1
  68. package/dist/esm/middleware/selector/draw-wrapper.js +57 -35
  69. package/dist/esm/middleware/selector/index.d.ts +11 -4
  70. package/dist/esm/middleware/selector/index.js +420 -70
  71. package/dist/esm/middleware/selector/pattern/icon-rotate.d.ts +4 -0
  72. package/dist/esm/middleware/selector/pattern/icon-rotate.js +88 -0
  73. package/dist/esm/middleware/selector/pattern/index.d.ts +8 -0
  74. package/dist/esm/middleware/selector/pattern/index.js +38 -0
  75. package/dist/esm/middleware/selector/reference.d.ts +13 -0
  76. package/dist/esm/middleware/selector/reference.js +267 -0
  77. package/dist/esm/middleware/selector/types.d.ts +10 -4
  78. package/dist/esm/middleware/selector/types.js +2 -1
  79. package/dist/esm/middleware/selector/util.d.ts +14 -7
  80. package/dist/esm/middleware/selector/util.js +45 -43
  81. package/dist/esm/middleware/text-editor/index.d.ts +20 -3
  82. package/dist/esm/middleware/text-editor/index.js +96 -19
  83. package/dist/index.global.js +4765 -1466
  84. package/dist/index.global.min.js +1 -1
  85. package/package.json +5 -6
@@ -1,15 +1,29 @@
1
- import { calcElementsViewInfo, calcElementVertexesInGroup, calcElementQueueVertexesQueueInGroup, calcElementSizeController, rotatePointInGroup, getGroupQueueFromList, findElementsFromList, findElementsFromListByPositions } from '@idraw/util';
2
- import { drawHoverVertexesWrapper, drawArea, drawListArea, drawGroupQueueVertexesWrappers, drawSelectedElementControllersVertexes } from './draw-wrapper';
3
- import { getPointTarget, resizeElement, getSelectedListArea, calcSelectedElementsArea, isElementInGroup, isPointInViewActiveGroup, calcMoveInGroup } from './util';
4
- import { keyActionType, keyResizeType, keyAreaStart, keyAreaEnd, keyGroupQueue, keyGroupQueueVertexesList, keyHoverElement, keyHoverElementVertexes, keySelectedElementList, keySelectedElementListVertexes, keySelectedElementController } from './config';
5
- import { middlewareEventTextEdit } from '../text-editor';
6
- export const middlewareEventSelect = '@middleware/select';
7
- export const MiddlewareSelector = (opts) => {
1
+ import { is, calcElementsViewInfo, calcElementVertexesInGroup, calcElementQueueVertexesQueueInGroup, calcElementSizeController, calcElementCenterFromVertexes, rotatePointInGroup, getGroupQueueFromList, findElementsFromList, findElementsFromListByPositions, getElementPositionFromList, getElementPositionMapFromList, deepResizeGroupElement, getElementSize, calcPointMoveElementInGroup, isSameElementSize } from '@idraw/util';
2
+ import { drawHoverVertexesWrapper, drawLockedVertexesWrapper, drawArea, drawListArea, drawGroupQueueVertexesWrappers, drawSelectedElementControllersVertexes } from './draw-wrapper';
3
+ import { drawReferenceLines } from './draw-reference';
4
+ import { getPointTarget, resizeElement, rotateElement, getSelectedListArea, calcSelectedElementsArea, isElementInGroup, isPointInViewActiveGroup } from './util';
5
+ import { keyActionType, keyResizeType, keyAreaStart, keyAreaEnd, keyGroupQueue, keyGroupQueueVertexesList, keyHoverElement, keyHoverElementVertexes, keySelectedElementList, keySelectedElementListVertexes, keySelectedElementController, keySelectedElementPosition, keyIsMoving, keyEnableSelectInGroup, keyEnableSnapToGrid, controllerSize, rotateControllerSize, rotateControllerPosition, defaultStyle } from './config';
6
+ import { calcReferenceInfo } from './reference';
7
+ import { coreEventKeys } from '../../config';
8
+ import { keyLayoutIsSelected, keyLayoutIsBusyMoving } from '../layout-selector';
9
+ import { createRotateControllerPattern } from './pattern';
10
+ import { MIDDLEWARE_INTERNAL_EVENT_SHOW_INFO_ANGLE } from '../info';
11
+ export { keySelectedElementList, keyHoverElement, keyActionType, keyResizeType, keyGroupQueue };
12
+ export const MiddlewareSelector = (opts, config) => {
13
+ let innerConfig = Object.assign(Object.assign({}, defaultStyle), config);
8
14
  const { viewer, sharer, boardContent, calculator, eventHub } = opts;
9
- const { helperContext } = boardContent;
15
+ const { overlayContext } = boardContent;
10
16
  let prevPoint = null;
17
+ let moveOriginalStartPoint = null;
18
+ let moveOriginalStartElementSize = null;
11
19
  let inBusyMode = null;
20
+ let hasChangedData = null;
21
+ let rotateControllerPattern = createRotateControllerPattern({
22
+ fill: innerConfig.activeColor,
23
+ devicePixelRatio: sharer.getActiveViewSizeInfo().devicePixelRatio
24
+ });
12
25
  sharer.setSharedStorage(keyActionType, null);
26
+ sharer.setSharedStorage(keyEnableSnapToGrid, true);
13
27
  const getActiveElements = () => {
14
28
  return sharer.getSharedStorage(keySelectedElementList);
15
29
  };
@@ -44,26 +58,44 @@ export const MiddlewareSelector = (opts) => {
44
58
  }
45
59
  sharer.setSharedStorage(keyHoverElementVertexes, vertexes);
46
60
  };
47
- const updateSelectedElementList = (list, opts) => {
48
- sharer.setSharedStorage(keySelectedElementList, list);
61
+ const updateSelectedElemenetController = () => {
62
+ const list = sharer.getSharedStorage(keySelectedElementList);
49
63
  if (list.length === 1) {
50
64
  const controller = calcElementSizeController(list[0], {
51
65
  groupQueue: sharer.getSharedStorage(keyGroupQueue),
52
- controllerSize: 10,
53
- viewScaleInfo: sharer.getActiveViewScaleInfo()
66
+ controllerSize,
67
+ viewScaleInfo: sharer.getActiveViewScaleInfo(),
68
+ rotateControllerPosition,
69
+ rotateControllerSize
54
70
  });
55
71
  sharer.setSharedStorage(keySelectedElementController, controller);
56
72
  }
73
+ };
74
+ const updateSelectedElementList = (list, opts) => {
75
+ var _a;
76
+ sharer.setSharedStorage(keySelectedElementList, list);
77
+ if (list.length === 1) {
78
+ updateSelectedElemenetController();
79
+ sharer.setSharedStorage(keySelectedElementPosition, getElementPositionFromList(list[0].uuid, ((_a = sharer.getActiveStorage('data')) === null || _a === void 0 ? void 0 : _a.elements) || []));
80
+ }
57
81
  else {
58
82
  sharer.setSharedStorage(keySelectedElementController, null);
83
+ sharer.setSharedStorage(keySelectedElementPosition, []);
59
84
  }
60
85
  if ((opts === null || opts === void 0 ? void 0 : opts.triggerEvent) === true) {
61
- eventHub.trigger(middlewareEventSelect, { uuids: list.map((elem) => elem.uuid) });
86
+ const uuids = list.map((elem) => elem.uuid);
87
+ const data = sharer.getActiveStorage('data');
88
+ const positionMap = getElementPositionMapFromList(uuids, (data === null || data === void 0 ? void 0 : data.elements) || []);
89
+ eventHub.trigger(coreEventKeys.SELECT, {
90
+ type: 'clickCanvas',
91
+ uuids,
92
+ positions: list.map((elem) => [...positionMap[elem.uuid]])
93
+ });
62
94
  }
63
95
  };
64
96
  const pointTargetBaseOptions = () => {
65
97
  return {
66
- ctx: helperContext,
98
+ ctx: overlayContext,
67
99
  calculator,
68
100
  data: sharer.getActiveStorage('data'),
69
101
  selectedElements: getActiveElements(),
@@ -71,7 +103,8 @@ export const MiddlewareSelector = (opts) => {
71
103
  viewSizeInfo: sharer.getActiveViewSizeInfo(),
72
104
  groupQueue: sharer.getSharedStorage(keyGroupQueue),
73
105
  areaSize: null,
74
- selectedElementController: sharer.getSharedStorage(keySelectedElementController)
106
+ selectedElementController: sharer.getSharedStorage(keySelectedElementController),
107
+ selectedElementPosition: sharer.getSharedStorage(keySelectedElementPosition)
75
108
  };
76
109
  };
77
110
  const clear = () => {
@@ -86,9 +119,11 @@ export const MiddlewareSelector = (opts) => {
86
119
  sharer.setSharedStorage(keySelectedElementList, []);
87
120
  sharer.setSharedStorage(keySelectedElementListVertexes, null);
88
121
  sharer.setSharedStorage(keySelectedElementController, null);
122
+ sharer.setSharedStorage(keySelectedElementPosition, []);
123
+ sharer.setSharedStorage(keyIsMoving, null);
89
124
  };
90
125
  clear();
91
- const selectCallback = ({ uuids, positions }) => {
126
+ const selectCallback = ({ uuids = [], positions }) => {
92
127
  let elements = [];
93
128
  const actionType = sharer.getSharedStorage(keyActionType);
94
129
  const data = sharer.getActiveStorage('data');
@@ -114,22 +149,50 @@ export const MiddlewareSelector = (opts) => {
114
149
  viewer.drawFrame();
115
150
  }
116
151
  };
152
+ const selectClearCallback = () => {
153
+ clear();
154
+ viewer.drawFrame();
155
+ };
156
+ const setSnapToSnapCallback = (e) => {
157
+ sharer.setSharedStorage(keyEnableSnapToGrid, !!e.enable);
158
+ };
159
+ const selectInGroupCallback = (e) => {
160
+ sharer.setSharedStorage(keyEnableSelectInGroup, !!e.enable);
161
+ };
117
162
  return {
163
+ name: '@middleware/selector',
118
164
  use() {
119
- eventHub.on(middlewareEventSelect, selectCallback);
165
+ eventHub.on(coreEventKeys.SELECT, selectCallback);
166
+ eventHub.on(coreEventKeys.CLEAR_SELECT, selectClearCallback);
167
+ eventHub.on(coreEventKeys.SELECT_IN_GROUP, selectInGroupCallback);
168
+ eventHub.on(coreEventKeys.SNAP_TO_GRID, setSnapToSnapCallback);
120
169
  },
121
170
  disuse() {
122
- eventHub.off(middlewareEventSelect, selectCallback);
171
+ eventHub.off(coreEventKeys.SELECT, selectCallback);
172
+ eventHub.off(coreEventKeys.CLEAR_SELECT, selectClearCallback);
173
+ eventHub.off(coreEventKeys.SELECT_IN_GROUP, selectInGroupCallback);
174
+ eventHub.off(coreEventKeys.SNAP_TO_GRID, setSnapToSnapCallback);
175
+ },
176
+ resetConfig(config) {
177
+ innerConfig = Object.assign(Object.assign({}, innerConfig), config);
123
178
  },
124
179
  hover: (e) => {
125
- var _a, _b;
180
+ var _a, _b, _c, _d, _e;
181
+ const layoutIsSelected = sharer.getSharedStorage(keyLayoutIsSelected);
182
+ const layoutIsBusyMoving = sharer.getSharedStorage(keyLayoutIsBusyMoving);
183
+ if (layoutIsBusyMoving === true) {
184
+ return;
185
+ }
126
186
  const resizeType = sharer.getSharedStorage(keyResizeType);
127
187
  const actionType = sharer.getSharedStorage(keyActionType);
128
188
  const groupQueue = sharer.getSharedStorage(keyGroupQueue);
129
189
  const triggerCursor = (target) => {
190
+ if (layoutIsSelected === true) {
191
+ return;
192
+ }
130
193
  const cursor = target.type;
131
194
  if (inBusyMode === null) {
132
- eventHub.trigger('cursor', {
195
+ eventHub.trigger(coreEventKeys.CURSOR, {
133
196
  type: cursor,
134
197
  groupQueue: target.groupQueue,
135
198
  element: target.elements[0]
@@ -138,7 +201,7 @@ export const MiddlewareSelector = (opts) => {
138
201
  };
139
202
  if ((groupQueue === null || groupQueue === void 0 ? void 0 : groupQueue.length) > 0) {
140
203
  const isInActiveGroup = isPointInViewActiveGroup(e.point, {
141
- ctx: helperContext,
204
+ ctx: overlayContext,
142
205
  viewScaleInfo: sharer.getActiveViewScaleInfo(),
143
206
  viewSizeInfo: sharer.getActiveViewSizeInfo(),
144
207
  groupQueue: sharer.getSharedStorage(keyGroupQueue)
@@ -181,8 +244,27 @@ export const MiddlewareSelector = (opts) => {
181
244
  calculator
182
245
  }) }));
183
246
  triggerCursor(target);
184
- if (target.type === 'over-element' && ((_b = target === null || target === void 0 ? void 0 : target.elements) === null || _b === void 0 ? void 0 : _b.length) === 1) {
185
- sharer.setSharedStorage(keyHoverElement, target.elements[0]);
247
+ if (target.type === null) {
248
+ if (sharer.getSharedStorage(keyHoverElement) || sharer.getSharedStorage(keyHoverElementVertexes)) {
249
+ sharer.setSharedStorage(keyHoverElement, null);
250
+ sharer.setSharedStorage(keyHoverElementVertexes, null);
251
+ viewer.drawFrame();
252
+ }
253
+ return;
254
+ }
255
+ if (target.type === 'over-element' &&
256
+ sharer.getSharedStorage(keyActionType) === 'select' &&
257
+ target.elements.length === 1 &&
258
+ target.elements[0].uuid === ((_c = (_b = getActiveElements()) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.uuid)) {
259
+ return;
260
+ }
261
+ if (target.type === 'over-element' &&
262
+ sharer.getSharedStorage(keyActionType) === null &&
263
+ target.elements.length === 1 &&
264
+ target.elements[0].uuid === ((_d = sharer.getSharedStorage(keyHoverElement)) === null || _d === void 0 ? void 0 : _d.uuid)) {
265
+ return;
266
+ }
267
+ if (target.type === 'over-element' && ((_e = target === null || target === void 0 ? void 0 : target.elements) === null || _e === void 0 ? void 0 : _e.length) === 1) {
186
268
  updateHoverElement(target.elements[0]);
187
269
  viewer.drawFrame();
188
270
  return;
@@ -194,24 +276,31 @@ export const MiddlewareSelector = (opts) => {
194
276
  }
195
277
  },
196
278
  pointStart: (e) => {
197
- var _a, _b, _c, _d;
279
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
198
280
  prevPoint = e.point;
199
- updateHoverElement(null);
281
+ moveOriginalStartPoint = e.point;
200
282
  const groupQueue = sharer.getSharedStorage(keyGroupQueue);
201
283
  if ((groupQueue === null || groupQueue === void 0 ? void 0 : groupQueue.length) > 0) {
202
284
  if (isPointInViewActiveGroup(e.point, {
203
- ctx: helperContext,
285
+ ctx: overlayContext,
204
286
  viewScaleInfo: sharer.getActiveViewScaleInfo(),
205
287
  viewSizeInfo: sharer.getActiveViewSizeInfo(),
206
288
  groupQueue
207
289
  })) {
208
290
  const target = getPointTarget(e.point, pointTargetBaseOptions());
291
+ const isLockedElement = ((_a = target === null || target === void 0 ? void 0 : target.elements) === null || _a === void 0 ? void 0 : _a.length) === 1 && ((_c = (_b = target.elements[0]) === null || _b === void 0 ? void 0 : _b.operations) === null || _c === void 0 ? void 0 : _c.locked) === true;
209
292
  updateHoverElement(null);
210
- if (target.type === 'over-element' && ((_a = target === null || target === void 0 ? void 0 : target.elements) === null || _a === void 0 ? void 0 : _a.length) === 1) {
293
+ if (((_d = target === null || target === void 0 ? void 0 : target.elements) === null || _d === void 0 ? void 0 : _d.length) === 1) {
294
+ moveOriginalStartElementSize = getElementSize(target === null || target === void 0 ? void 0 : target.elements[0]);
295
+ }
296
+ if (isLockedElement === true) {
297
+ clear();
298
+ }
299
+ else if (target.type === 'over-element' && ((_e = target === null || target === void 0 ? void 0 : target.elements) === null || _e === void 0 ? void 0 : _e.length) === 1) {
211
300
  updateSelectedElementList([target.elements[0]], { triggerEvent: true });
212
301
  sharer.setSharedStorage(keyActionType, 'drag');
213
302
  }
214
- else if ((_b = target.type) === null || _b === void 0 ? void 0 : _b.startsWith('resize-')) {
303
+ else if ((_f = target.type) === null || _f === void 0 ? void 0 : _f.startsWith('resize-')) {
215
304
  sharer.setSharedStorage(keyResizeType, target.type);
216
305
  sharer.setSharedStorage(keyActionType, 'resize');
217
306
  }
@@ -231,14 +320,25 @@ export const MiddlewareSelector = (opts) => {
231
320
  calculator
232
321
  });
233
322
  const target = getPointTarget(e.point, Object.assign(Object.assign({}, pointTargetBaseOptions()), { areaSize: listAreaSize, groupQueue: [] }));
234
- if (target.type === 'list-area') {
323
+ const isLockedElement = ((_g = target === null || target === void 0 ? void 0 : target.elements) === null || _g === void 0 ? void 0 : _g.length) === 1 && ((_j = (_h = target.elements[0]) === null || _h === void 0 ? void 0 : _h.operations) === null || _j === void 0 ? void 0 : _j.locked) === true;
324
+ updateHoverElement(null);
325
+ if (((_k = target === null || target === void 0 ? void 0 : target.elements) === null || _k === void 0 ? void 0 : _k.length) === 1) {
326
+ moveOriginalStartElementSize = getElementSize(target === null || target === void 0 ? void 0 : target.elements[0]);
327
+ }
328
+ if (isLockedElement === true) {
329
+ clear();
330
+ sharer.setSharedStorage(keyActionType, 'area');
331
+ sharer.setSharedStorage(keyAreaStart, e.point);
332
+ updateSelectedElementList([], { triggerEvent: true });
333
+ }
334
+ else if (target.type === 'list-area') {
235
335
  sharer.setSharedStorage(keyActionType, 'drag-list');
236
336
  }
237
- else if (target.type === 'over-element' && ((_c = target === null || target === void 0 ? void 0 : target.elements) === null || _c === void 0 ? void 0 : _c.length) === 1) {
337
+ else if (target.type === 'over-element' && ((_l = target === null || target === void 0 ? void 0 : target.elements) === null || _l === void 0 ? void 0 : _l.length) === 1) {
238
338
  updateSelectedElementList([target.elements[0]], { triggerEvent: true });
239
339
  sharer.setSharedStorage(keyActionType, 'drag');
240
340
  }
241
- else if ((_d = target.type) === null || _d === void 0 ? void 0 : _d.startsWith('resize-')) {
341
+ else if ((_m = target.type) === null || _m === void 0 ? void 0 : _m.startsWith('resize-')) {
242
342
  sharer.setSharedStorage(keyResizeType, target.type);
243
343
  sharer.setSharedStorage(keyActionType, 'resize');
244
344
  }
@@ -251,33 +351,94 @@ export const MiddlewareSelector = (opts) => {
251
351
  viewer.drawFrame();
252
352
  },
253
353
  pointMove: (e) => {
354
+ var _a, _b, _c;
355
+ sharer.setSharedStorage(keyIsMoving, true);
254
356
  const data = sharer.getActiveStorage('data');
255
357
  const elems = getActiveElements();
256
358
  const scale = sharer.getActiveStorage('scale') || 1;
359
+ const viewScaleInfo = sharer.getActiveViewScaleInfo();
360
+ const viewSizeInfo = sharer.getActiveViewSizeInfo();
257
361
  const start = prevPoint;
362
+ const originalStart = moveOriginalStartPoint;
258
363
  const end = e.point;
259
364
  const resizeType = sharer.getSharedStorage(keyResizeType);
260
365
  const actionType = sharer.getSharedStorage(keyActionType);
261
366
  const groupQueue = sharer.getSharedStorage(keyGroupQueue);
367
+ const enableSnapToGrid = sharer.getSharedStorage(keyEnableSnapToGrid);
262
368
  if (actionType === 'drag') {
369
+ hasChangedData = true;
263
370
  inBusyMode = 'drag';
264
- if (data && (elems === null || elems === void 0 ? void 0 : elems.length) === 1 && start && end) {
265
- const { moveX, moveY } = calcMoveInGroup(start, end, groupQueue);
266
- elems[0].x += moveX / scale;
267
- elems[0].y += moveY / scale;
371
+ eventHub.trigger(MIDDLEWARE_INTERNAL_EVENT_SHOW_INFO_ANGLE, { show: false });
372
+ if (data &&
373
+ (elems === null || elems === void 0 ? void 0 : elems.length) === 1 &&
374
+ moveOriginalStartElementSize &&
375
+ originalStart &&
376
+ end &&
377
+ ((_b = (_a = elems[0]) === null || _a === void 0 ? void 0 : _a.operations) === null || _b === void 0 ? void 0 : _b.locked) !== true) {
378
+ const { moveX, moveY } = calcPointMoveElementInGroup(originalStart, end, groupQueue);
379
+ let totalMoveX = calculator.toGridNum(moveX / scale);
380
+ let totalMoveY = calculator.toGridNum(moveY / scale);
381
+ if (enableSnapToGrid === true) {
382
+ const referenceInfo = calcReferenceInfo(elems[0].uuid, {
383
+ calculator,
384
+ data,
385
+ groupQueue,
386
+ viewScaleInfo,
387
+ viewSizeInfo
388
+ });
389
+ try {
390
+ if (referenceInfo) {
391
+ if (is.x(referenceInfo.offsetX) && referenceInfo.offsetX !== null) {
392
+ totalMoveX = calculator.toGridNum(totalMoveX + referenceInfo.offsetX);
393
+ }
394
+ if (is.y(referenceInfo.offsetY) && referenceInfo.offsetY !== null) {
395
+ totalMoveY = calculator.toGridNum(totalMoveY + referenceInfo.offsetY);
396
+ }
397
+ }
398
+ }
399
+ catch (err) {
400
+ console.error(err);
401
+ }
402
+ }
403
+ elems[0].x = calculator.toGridNum(moveOriginalStartElementSize.x + totalMoveX);
404
+ elems[0].y = calculator.toGridNum(moveOriginalStartElementSize.y + totalMoveY);
268
405
  updateSelectedElementList([elems[0]]);
406
+ calculator.modifyVirtualFlatItemMap(data, {
407
+ modifyOptions: {
408
+ type: 'updateElement',
409
+ content: {
410
+ element: elems[0],
411
+ position: sharer.getSharedStorage(keySelectedElementPosition) || []
412
+ }
413
+ },
414
+ viewSizeInfo,
415
+ viewScaleInfo
416
+ });
269
417
  }
270
418
  viewer.drawFrame();
271
419
  }
272
420
  else if (actionType === 'drag-list') {
421
+ hasChangedData = true;
273
422
  inBusyMode = 'drag-list';
274
- if (data && start && end && (elems === null || elems === void 0 ? void 0 : elems.length) > 1) {
423
+ if (data && originalStart && start && end && (elems === null || elems === void 0 ? void 0 : elems.length) > 1) {
275
424
  const moveX = (end.x - start.x) / scale;
276
425
  const moveY = (end.y - start.y) / scale;
277
426
  elems.forEach((elem) => {
278
- if (elem) {
279
- elem.x += moveX;
280
- elem.y += moveY;
427
+ var _a;
428
+ if (elem && ((_a = elem === null || elem === void 0 ? void 0 : elem.operations) === null || _a === void 0 ? void 0 : _a.locked) !== true) {
429
+ elem.x = calculator.toGridNum(elem.x + moveX);
430
+ elem.y = calculator.toGridNum(elem.y + moveY);
431
+ calculator.modifyVirtualFlatItemMap(data, {
432
+ modifyOptions: {
433
+ type: 'updateElement',
434
+ content: {
435
+ element: elem,
436
+ position: getElementPositionFromList(elem.uuid, data.elements) || []
437
+ }
438
+ },
439
+ viewSizeInfo,
440
+ viewScaleInfo
441
+ });
281
442
  }
282
443
  });
283
444
  sharer.setActiveStorage('data', data);
@@ -285,7 +446,12 @@ export const MiddlewareSelector = (opts) => {
285
446
  viewer.drawFrame();
286
447
  }
287
448
  else if (actionType === 'resize') {
288
- if (data && (elems === null || elems === void 0 ? void 0 : elems.length) === 1 && start && (resizeType === null || resizeType === void 0 ? void 0 : resizeType.startsWith('resize-'))) {
449
+ if (data &&
450
+ (elems === null || elems === void 0 ? void 0 : elems.length) === 1 &&
451
+ originalStart &&
452
+ moveOriginalStartElementSize &&
453
+ (resizeType === null || resizeType === void 0 ? void 0 : resizeType.startsWith('resize-'))) {
454
+ hasChangedData = true;
289
455
  inBusyMode = 'resize';
290
456
  const pointGroupQueue = [];
291
457
  groupQueue.forEach((group) => {
@@ -298,18 +464,60 @@ export const MiddlewareSelector = (opts) => {
298
464
  angle: 0 - angle
299
465
  });
300
466
  });
301
- let resizeStart = start;
467
+ let resizeStart = originalStart;
302
468
  let resizeEnd = end;
303
469
  if (groupQueue.length > 0) {
304
- resizeStart = rotatePointInGroup(start, pointGroupQueue);
470
+ resizeStart = rotatePointInGroup(originalStart, pointGroupQueue);
305
471
  resizeEnd = rotatePointInGroup(end, pointGroupQueue);
306
472
  }
307
- const resizedElemSize = resizeElement(elems[0], { scale, start: resizeStart, end: resizeEnd, resizeType, sharer });
308
- elems[0].x = resizedElemSize.x;
309
- elems[0].y = resizedElemSize.y;
310
- elems[0].w = resizedElemSize.w;
311
- elems[0].h = resizedElemSize.h;
473
+ if (resizeType === 'resize-rotate') {
474
+ const controller = sharer.getSharedStorage(keySelectedElementController);
475
+ const viewVertexes = [
476
+ controller.topLeft.center,
477
+ controller.topRight.center,
478
+ controller.bottomLeft.center,
479
+ controller.bottomRight.center
480
+ ];
481
+ const viewCenter = calcElementCenterFromVertexes(viewVertexes);
482
+ const resizedElemSize = rotateElement(moveOriginalStartElementSize, {
483
+ center: viewCenter,
484
+ viewScaleInfo,
485
+ viewSizeInfo,
486
+ start: originalStart,
487
+ end,
488
+ resizeType,
489
+ sharer
490
+ });
491
+ elems[0].angle = calculator.toGridNum(resizedElemSize.angle || 0);
492
+ }
493
+ else {
494
+ const resizedElemSize = resizeElement(Object.assign(Object.assign({}, moveOriginalStartElementSize), { operations: elems[0].operations }), { scale, start: resizeStart, end: resizeEnd, resizeType, sharer });
495
+ const calcOpts = { ignore: !!moveOriginalStartElementSize.angle };
496
+ elems[0].x = calculator.toGridNum(resizedElemSize.x, calcOpts);
497
+ elems[0].y = calculator.toGridNum(resizedElemSize.y, calcOpts);
498
+ if (elems[0].type === 'group' && ((_c = elems[0].operations) === null || _c === void 0 ? void 0 : _c.deepResize) === true) {
499
+ deepResizeGroupElement(elems[0], {
500
+ w: calculator.toGridNum(resizedElemSize.w, calcOpts),
501
+ h: calculator.toGridNum(resizedElemSize.h, calcOpts)
502
+ });
503
+ }
504
+ else {
505
+ elems[0].w = calculator.toGridNum(resizedElemSize.w, calcOpts);
506
+ elems[0].h = calculator.toGridNum(resizedElemSize.h, calcOpts);
507
+ }
508
+ }
312
509
  updateSelectedElementList([elems[0]]);
510
+ calculator.modifyVirtualFlatItemMap(data, {
511
+ modifyOptions: {
512
+ type: 'updateElement',
513
+ content: {
514
+ element: elems[0],
515
+ position: sharer.getSharedStorage(keySelectedElementPosition) || []
516
+ }
517
+ },
518
+ viewSizeInfo,
519
+ viewScaleInfo
520
+ });
313
521
  viewer.drawFrame();
314
522
  }
315
523
  }
@@ -322,12 +530,20 @@ export const MiddlewareSelector = (opts) => {
322
530
  },
323
531
  pointEnd(e) {
324
532
  inBusyMode = null;
533
+ sharer.setSharedStorage(keyIsMoving, false);
325
534
  const data = sharer.getActiveStorage('data');
535
+ const selectedElements = sharer.getSharedStorage(keySelectedElementList);
536
+ const hoverElement = sharer.getSharedStorage(keyHoverElement);
326
537
  const resizeType = sharer.getSharedStorage(keyResizeType);
327
538
  const actionType = sharer.getSharedStorage(keyActionType);
328
539
  const viewSizeInfo = sharer.getActiveViewSizeInfo();
329
540
  let needDrawFrame = false;
330
541
  prevPoint = null;
542
+ moveOriginalStartPoint = null;
543
+ moveOriginalStartElementSize = null;
544
+ if (actionType === 'drag') {
545
+ eventHub.trigger(MIDDLEWARE_INTERNAL_EVENT_SHOW_INFO_ANGLE, { show: true });
546
+ }
331
547
  if (actionType === 'resize' && resizeType) {
332
548
  sharer.setSharedStorage(keyResizeType, null);
333
549
  needDrawFrame = true;
@@ -385,21 +601,38 @@ export const MiddlewareSelector = (opts) => {
385
601
  sharer.setActiveStorage('contextWidth', viewInfo.contextSize.contextWidth);
386
602
  }
387
603
  if (data && ['drag', 'drag-list', 'drag-list-end', 'resize'].includes(actionType)) {
388
- eventHub.trigger('change', { data });
604
+ let type = 'dragElement';
605
+ if (type === 'resize') {
606
+ type = 'resizeElement';
607
+ }
608
+ if (hasChangedData) {
609
+ eventHub.trigger(coreEventKeys.CHANGE, { data, type, selectedElements, hoverElement });
610
+ hasChangedData = false;
611
+ }
389
612
  }
390
613
  viewer.drawFrame();
391
614
  };
392
615
  finalDrawFrame();
393
616
  },
394
617
  pointLeave() {
395
- prevPoint = null;
396
- clear();
397
- viewer.drawFrame();
618
+ inBusyMode = null;
619
+ sharer.setSharedStorage(keyResizeType, null);
620
+ eventHub.trigger(coreEventKeys.CURSOR, {
621
+ type: 'default'
622
+ });
398
623
  },
399
624
  doubleClick(e) {
400
- var _a, _b;
625
+ var _a, _b, _c, _d, _e, _f, _g, _h;
626
+ if (sharer.getSharedStorage(keyEnableSelectInGroup) === false) {
627
+ return;
628
+ }
401
629
  const target = getPointTarget(e.point, pointTargetBaseOptions());
402
- if (target.elements.length === 1 && ((_a = target.elements[0]) === null || _a === void 0 ? void 0 : _a.type) === 'group') {
630
+ sharer.setSharedStorage(keySelectedElementController, null);
631
+ sharer.setSharedStorage(keySelectedElementList, []);
632
+ if (target.elements.length === 1 && ((_b = (_a = target.elements[0]) === null || _a === void 0 ? void 0 : _a.operations) === null || _b === void 0 ? void 0 : _b.locked) === true) {
633
+ return;
634
+ }
635
+ if (target.elements.length === 1 && ((_c = target.elements[0]) === null || _c === void 0 ? void 0 : _c.type) === 'group') {
403
636
  const pushResult = pushGroupQueue(target.elements[0]);
404
637
  if (pushResult === true) {
405
638
  sharer.setSharedStorage(keyActionType, null);
@@ -407,18 +640,74 @@ export const MiddlewareSelector = (opts) => {
407
640
  return;
408
641
  }
409
642
  }
410
- else if (target.elements.length === 1 && ((_b = target.elements[0]) === null || _b === void 0 ? void 0 : _b.type) === 'text') {
411
- eventHub.trigger(middlewareEventTextEdit, {
643
+ else if (target.elements.length === 1 &&
644
+ ((_d = target.elements[0]) === null || _d === void 0 ? void 0 : _d.type) === 'text' &&
645
+ !((_f = (_e = target.elements[0]) === null || _e === void 0 ? void 0 : _e.operations) === null || _f === void 0 ? void 0 : _f.invisible)) {
646
+ eventHub.trigger(coreEventKeys.TEXT_EDIT, {
412
647
  element: target.elements[0],
413
648
  groupQueue: sharer.getSharedStorage(keyGroupQueue) || [],
649
+ position: getElementPositionFromList((_g = target.elements[0]) === null || _g === void 0 ? void 0 : _g.uuid, ((_h = sharer.getActiveStorage('data')) === null || _h === void 0 ? void 0 : _h.elements) || []),
414
650
  viewScaleInfo: sharer.getActiveViewScaleInfo()
415
651
  });
416
652
  }
417
653
  sharer.setSharedStorage(keyActionType, null);
418
654
  },
655
+ wheel() {
656
+ updateSelectedElemenetController();
657
+ },
658
+ wheelScale() {
659
+ updateSelectedElemenetController();
660
+ },
661
+ contextMenu: (e) => {
662
+ var _a, _b, _c, _d, _e, _f, _g, _h;
663
+ const groupQueue = sharer.getSharedStorage(keyGroupQueue);
664
+ if ((groupQueue === null || groupQueue === void 0 ? void 0 : groupQueue.length) > 0) {
665
+ if (isPointInViewActiveGroup(e.point, {
666
+ ctx: overlayContext,
667
+ viewScaleInfo: sharer.getActiveViewScaleInfo(),
668
+ viewSizeInfo: sharer.getActiveViewSizeInfo(),
669
+ groupQueue
670
+ })) {
671
+ const target = getPointTarget(e.point, pointTargetBaseOptions());
672
+ if (((_a = target === null || target === void 0 ? void 0 : target.elements) === null || _a === void 0 ? void 0 : _a.length) === 1 && ((_c = (_b = target.elements[0]) === null || _b === void 0 ? void 0 : _b.operations) === null || _c === void 0 ? void 0 : _c.locked) !== true) {
673
+ clear();
674
+ updateSelectedElementList([target.elements[0]], { triggerEvent: true });
675
+ viewer.drawFrame();
676
+ }
677
+ else if (!((_d = target === null || target === void 0 ? void 0 : target.elements) === null || _d === void 0 ? void 0 : _d.length)) {
678
+ clear();
679
+ }
680
+ }
681
+ return;
682
+ }
683
+ const listAreaSize = calcSelectedElementsArea(getActiveElements(), {
684
+ viewScaleInfo: sharer.getActiveViewScaleInfo(),
685
+ viewSizeInfo: sharer.getActiveViewSizeInfo(),
686
+ calculator
687
+ });
688
+ const target = getPointTarget(e.point, Object.assign(Object.assign({}, pointTargetBaseOptions()), { areaSize: listAreaSize, groupQueue: [] }));
689
+ if (((_e = target === null || target === void 0 ? void 0 : target.elements) === null || _e === void 0 ? void 0 : _e.length) === 1 && ((_g = (_f = target.elements[0]) === null || _f === void 0 ? void 0 : _f.operations) === null || _g === void 0 ? void 0 : _g.locked) !== true) {
690
+ clear();
691
+ updateSelectedElementList([target.elements[0]], { triggerEvent: true });
692
+ viewer.drawFrame();
693
+ return;
694
+ }
695
+ else if (!((_h = target === null || target === void 0 ? void 0 : target.elements) === null || _h === void 0 ? void 0 : _h.length)) {
696
+ clear();
697
+ }
698
+ },
419
699
  beforeDrawFrame({ snapshot }) {
700
+ var _a;
701
+ const { activeColor, activeAreaColor, lockedColor, referenceColor } = innerConfig;
702
+ const style = { activeColor, activeAreaColor, lockedColor, referenceColor };
420
703
  const { activeStore, sharedStore } = snapshot;
421
704
  const { scale, offsetLeft, offsetTop, offsetRight, offsetBottom, width, height, contextHeight, contextWidth, devicePixelRatio } = activeStore;
705
+ if (rotateControllerPattern.fill !== activeColor) {
706
+ rotateControllerPattern = createRotateControllerPattern({
707
+ fill: innerConfig.activeColor,
708
+ devicePixelRatio
709
+ });
710
+ }
422
711
  const sharer = opts.sharer;
423
712
  const viewScaleInfo = { scale, offsetLeft, offsetTop, offsetRight, offsetBottom };
424
713
  const viewSizeInfo = { width, height, contextHeight, contextWidth, devicePixelRatio };
@@ -431,32 +720,93 @@ export const MiddlewareSelector = (opts) => {
431
720
  const areaEnd = sharedStore[keyAreaEnd];
432
721
  const groupQueue = sharedStore[keyGroupQueue];
433
722
  const groupQueueVertexesList = sharedStore[keyGroupQueueVertexesList];
434
- const drawBaseOpts = { calculator, viewScaleInfo, viewSizeInfo };
435
- const selectedElementController = elem
436
- ? calcElementSizeController(elem, {
437
- groupQueue,
438
- controllerSize: 10,
439
- viewScaleInfo
440
- })
441
- : null;
723
+ const isMoving = sharedStore[keyIsMoving];
724
+ const enableSnapToGrid = sharedStore[keyEnableSnapToGrid];
725
+ const drawBaseOpts = { calculator, viewScaleInfo, viewSizeInfo, style };
726
+ let selectedElementController = sharedStore[keySelectedElementController];
727
+ if (selectedElementController && selectedElements.length === 1 && elem) {
728
+ if (!isSameElementSize(elem, selectedElementController.originalElementSize)) {
729
+ selectedElementController = calcElementSizeController(elem, {
730
+ groupQueue: groupQueue || [],
731
+ controllerSize,
732
+ viewScaleInfo,
733
+ rotateControllerPosition,
734
+ rotateControllerSize
735
+ });
736
+ sharer.setSharedStorage(keySelectedElementController, selectedElementController);
737
+ }
738
+ }
739
+ const isHoverLocked = !!((_a = hoverElement === null || hoverElement === void 0 ? void 0 : hoverElement.operations) === null || _a === void 0 ? void 0 : _a.locked);
442
740
  if ((groupQueue === null || groupQueue === void 0 ? void 0 : groupQueue.length) > 0) {
443
- drawGroupQueueVertexesWrappers(helperContext, groupQueueVertexesList, drawBaseOpts);
741
+ drawGroupQueueVertexesWrappers(overlayContext, groupQueueVertexesList, drawBaseOpts);
444
742
  if (hoverElement && actionType !== 'drag') {
445
- drawHoverVertexesWrapper(helperContext, hoverElementVertexes, drawBaseOpts);
743
+ if (isHoverLocked) {
744
+ drawLockedVertexesWrapper(overlayContext, hoverElementVertexes, Object.assign(Object.assign({}, drawBaseOpts), { controller: selectedElementController, style }));
745
+ }
746
+ else {
747
+ drawHoverVertexesWrapper(overlayContext, hoverElementVertexes, drawBaseOpts);
748
+ }
446
749
  }
447
750
  if (elem && ['select', 'drag', 'resize'].includes(actionType)) {
448
- drawSelectedElementControllersVertexes(helperContext, selectedElementController, Object.assign({}, drawBaseOpts));
751
+ drawSelectedElementControllersVertexes(overlayContext, selectedElementController, Object.assign(Object.assign({}, drawBaseOpts), { element: elem, calculator, hideControllers: !!isMoving && actionType === 'drag', rotateControllerPattern: rotateControllerPattern.context2d, style }));
752
+ if (actionType === 'drag') {
753
+ if (enableSnapToGrid === true) {
754
+ const referenceInfo = calcReferenceInfo(elem.uuid, {
755
+ calculator,
756
+ data: activeStore.data,
757
+ groupQueue,
758
+ viewScaleInfo,
759
+ viewSizeInfo
760
+ });
761
+ if (referenceInfo) {
762
+ const { offsetX, offsetY, xLines, yLines } = referenceInfo;
763
+ if (offsetX === 0 || offsetY === 0) {
764
+ drawReferenceLines(overlayContext, {
765
+ xLines,
766
+ yLines,
767
+ style
768
+ });
769
+ }
770
+ }
771
+ }
772
+ }
449
773
  }
450
774
  }
451
775
  else {
452
776
  if (hoverElement && actionType !== 'drag') {
453
- drawHoverVertexesWrapper(helperContext, hoverElementVertexes, drawBaseOpts);
777
+ if (isHoverLocked) {
778
+ drawLockedVertexesWrapper(overlayContext, hoverElementVertexes, Object.assign(Object.assign({}, drawBaseOpts), { controller: selectedElementController, style }));
779
+ }
780
+ else {
781
+ drawHoverVertexesWrapper(overlayContext, hoverElementVertexes, drawBaseOpts);
782
+ }
454
783
  }
455
784
  if (elem && ['select', 'drag', 'resize'].includes(actionType)) {
456
- drawSelectedElementControllersVertexes(helperContext, selectedElementController, Object.assign({}, drawBaseOpts));
785
+ drawSelectedElementControllersVertexes(overlayContext, selectedElementController, Object.assign(Object.assign({}, drawBaseOpts), { element: elem, calculator, hideControllers: !!isMoving && actionType === 'drag', rotateControllerPattern: rotateControllerPattern.context2d, style }));
786
+ if (actionType === 'drag') {
787
+ if (enableSnapToGrid === true) {
788
+ const referenceInfo = calcReferenceInfo(elem.uuid, {
789
+ calculator,
790
+ data: activeStore.data,
791
+ groupQueue,
792
+ viewScaleInfo,
793
+ viewSizeInfo
794
+ });
795
+ if (referenceInfo) {
796
+ const { offsetX, offsetY, xLines, yLines } = referenceInfo;
797
+ if (offsetX === 0 || offsetY === 0) {
798
+ drawReferenceLines(overlayContext, {
799
+ xLines,
800
+ yLines,
801
+ style
802
+ });
803
+ }
804
+ }
805
+ }
806
+ }
457
807
  }
458
808
  else if (actionType === 'area' && areaStart && areaEnd) {
459
- drawArea(helperContext, { start: areaStart, end: areaEnd });
809
+ drawArea(overlayContext, { start: areaStart, end: areaEnd, style });
460
810
  }
461
811
  else if (['drag-list', 'drag-list-end'].includes(actionType)) {
462
812
  const listAreaSize = calcSelectedElementsArea(getActiveElements(), {
@@ -465,7 +815,7 @@ export const MiddlewareSelector = (opts) => {
465
815
  calculator
466
816
  });
467
817
  if (listAreaSize) {
468
- drawListArea(helperContext, { areaSize: listAreaSize });
818
+ drawListArea(overlayContext, { areaSize: listAreaSize, style });
469
819
  }
470
820
  }
471
821
  }