@idraw/core 0.4.0-beta.3 → 0.4.0-beta.31

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 (67) hide show
  1. package/dist/esm/config.d.ts +1 -0
  2. package/dist/esm/config.js +1 -0
  3. package/dist/esm/index.d.ts +17 -7
  4. package/dist/esm/index.js +31 -10
  5. package/dist/esm/lib/cursor-image.d.ts +1 -0
  6. package/dist/esm/lib/cursor-image.js +1 -0
  7. package/dist/esm/lib/cursor.d.ts +3 -12
  8. package/dist/esm/lib/cursor.js +136 -112
  9. package/dist/esm/middleware/dragger/index.d.ts +2 -2
  10. package/dist/esm/middleware/dragger/index.js +1 -0
  11. package/dist/esm/middleware/info/config.d.ts +4 -0
  12. package/dist/esm/middleware/info/config.js +8 -0
  13. package/dist/esm/middleware/info/draw-info.d.ts +29 -0
  14. package/dist/esm/middleware/info/draw-info.js +113 -0
  15. package/dist/esm/middleware/info/index.d.ts +3 -0
  16. package/dist/esm/middleware/info/index.js +112 -0
  17. package/dist/esm/middleware/info/types.d.ts +3 -0
  18. package/dist/esm/middleware/info/types.js +1 -0
  19. package/dist/esm/middleware/layout-selector/config.d.ts +9 -0
  20. package/dist/esm/middleware/layout-selector/config.js +9 -0
  21. package/dist/esm/middleware/layout-selector/index.d.ts +5 -0
  22. package/dist/esm/middleware/layout-selector/index.js +332 -0
  23. package/dist/esm/middleware/layout-selector/types.d.ts +15 -0
  24. package/dist/esm/middleware/layout-selector/types.js +2 -0
  25. package/dist/esm/middleware/layout-selector/util.d.ts +8 -0
  26. package/dist/esm/middleware/layout-selector/util.js +108 -0
  27. package/dist/esm/middleware/ruler/config.d.ts +7 -0
  28. package/dist/esm/middleware/ruler/config.js +21 -0
  29. package/dist/esm/middleware/ruler/index.d.ts +3 -2
  30. package/dist/esm/middleware/ruler/index.js +27 -11
  31. package/dist/esm/middleware/ruler/types.d.ts +3 -0
  32. package/dist/esm/middleware/ruler/types.js +1 -0
  33. package/dist/esm/middleware/ruler/util.d.ts +20 -4
  34. package/dist/esm/middleware/ruler/util.js +92 -21
  35. package/dist/esm/middleware/scaler/index.d.ts +2 -2
  36. package/dist/esm/middleware/scaler/index.js +1 -0
  37. package/dist/esm/middleware/scroller/config.d.ts +4 -0
  38. package/dist/esm/middleware/scroller/config.js +10 -0
  39. package/dist/esm/middleware/scroller/index.d.ts +3 -2
  40. package/dist/esm/middleware/scroller/index.js +44 -6
  41. package/dist/esm/middleware/scroller/types.d.ts +11 -0
  42. package/dist/esm/middleware/scroller/types.js +1 -0
  43. package/dist/esm/middleware/scroller/util.d.ts +3 -2
  44. package/dist/esm/middleware/scroller/util.js +32 -44
  45. package/dist/esm/middleware/selector/config.d.ts +11 -1
  46. package/dist/esm/middleware/selector/config.js +19 -1
  47. package/dist/esm/middleware/selector/draw-auxiliary.d.ts +1 -0
  48. package/dist/esm/middleware/selector/draw-auxiliary.js +12 -0
  49. package/dist/esm/middleware/selector/draw-base.d.ts +30 -0
  50. package/dist/esm/middleware/selector/draw-base.js +100 -0
  51. package/dist/esm/middleware/selector/draw-reference.d.ts +7 -0
  52. package/dist/esm/middleware/selector/draw-reference.js +31 -0
  53. package/dist/esm/middleware/selector/draw-wrapper.d.ts +16 -2
  54. package/dist/esm/middleware/selector/draw-wrapper.js +52 -35
  55. package/dist/esm/middleware/selector/index.d.ts +7 -4
  56. package/dist/esm/middleware/selector/index.js +287 -47
  57. package/dist/esm/middleware/selector/reference.d.ts +13 -0
  58. package/dist/esm/middleware/selector/reference.js +267 -0
  59. package/dist/esm/middleware/selector/types.d.ts +9 -4
  60. package/dist/esm/middleware/selector/types.js +2 -1
  61. package/dist/esm/middleware/selector/util.d.ts +11 -2
  62. package/dist/esm/middleware/selector/util.js +36 -14
  63. package/dist/esm/middleware/text-editor/index.d.ts +20 -2
  64. package/dist/esm/middleware/text-editor/index.js +92 -16
  65. package/dist/index.global.js +3827 -1006
  66. package/dist/index.global.min.js +1 -1
  67. package/package.json +5 -5
@@ -1,15 +1,24 @@
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';
1
+ import { is, calcElementsViewInfo, calcElementVertexesInGroup, calcElementQueueVertexesQueueInGroup, calcElementSizeController, calcElementCenterFromVertexes, rotatePointInGroup, getGroupQueueFromList, findElementsFromList, findElementsFromListByPositions, getElementPositionFromList, deepResizeGroupElement } from '@idraw/util';
2
+ import { drawHoverVertexesWrapper, drawLockVertexesWrapper, drawArea, drawListArea, drawGroupQueueVertexesWrappers, drawSelectedElementControllersVertexes } from './draw-wrapper';
3
+ import { drawReferenceLines } from './draw-reference';
4
+ import { getPointTarget, resizeElement, rotateElement, getSelectedListArea, calcSelectedElementsArea, isElementInGroup, isPointInViewActiveGroup, calcMoveInGroup } from './util';
5
+ import { middlewareEventSelect, middlewareEventSelectClear, middlewareEventSelectInGroup, middlewareEventSnapToGrid, keyActionType, keyResizeType, keyAreaStart, keyAreaEnd, keyGroupQueue, keyGroupQueueVertexesList, keyHoverElement, keyHoverElementVertexes, keySelectedElementList, keySelectedElementListVertexes, keySelectedElementController, keySelectedElementPosition, keyIsMoving, keyEnableSelectInGroup, keyEnableSnapToGrid, controllerSize, defaultStyle } from './config';
6
+ import { calcReferenceInfo } from './reference';
5
7
  import { middlewareEventTextEdit } from '../text-editor';
6
- export const middlewareEventSelect = '@middleware/select';
7
- export const MiddlewareSelector = (opts) => {
8
+ import { eventChange } from '../../config';
9
+ import { keyLayoutIsSelected } from '../layout-selector';
10
+ export { keySelectedElementList, keyHoverElement, keyActionType, keyResizeType, keyGroupQueue };
11
+ export { middlewareEventSelect, middlewareEventSelectClear, middlewareEventSelectInGroup, middlewareEventSnapToGrid };
12
+ export const MiddlewareSelector = (opts, config) => {
13
+ const innerConfig = Object.assign(Object.assign({}, defaultStyle), config);
14
+ const { activeColor, activeAreaColor, lockedColor, referenceColor } = innerConfig;
15
+ const style = { activeColor, activeAreaColor, lockedColor, referenceColor };
8
16
  const { viewer, sharer, boardContent, calculator, eventHub } = opts;
9
- const { helperContext } = boardContent;
17
+ const { overlayContext } = boardContent;
10
18
  let prevPoint = null;
11
19
  let inBusyMode = null;
12
20
  sharer.setSharedStorage(keyActionType, null);
21
+ sharer.setSharedStorage(keyEnableSnapToGrid, true);
13
22
  const getActiveElements = () => {
14
23
  return sharer.getSharedStorage(keySelectedElementList);
15
24
  };
@@ -45,17 +54,20 @@ export const MiddlewareSelector = (opts) => {
45
54
  sharer.setSharedStorage(keyHoverElementVertexes, vertexes);
46
55
  };
47
56
  const updateSelectedElementList = (list, opts) => {
57
+ var _a;
48
58
  sharer.setSharedStorage(keySelectedElementList, list);
49
59
  if (list.length === 1) {
50
60
  const controller = calcElementSizeController(list[0], {
51
61
  groupQueue: sharer.getSharedStorage(keyGroupQueue),
52
- controllerSize: 10,
62
+ controllerSize,
53
63
  viewScaleInfo: sharer.getActiveViewScaleInfo()
54
64
  });
55
65
  sharer.setSharedStorage(keySelectedElementController, controller);
66
+ sharer.setSharedStorage(keySelectedElementPosition, getElementPositionFromList(list[0].uuid, ((_a = sharer.getActiveStorage('data')) === null || _a === void 0 ? void 0 : _a.elements) || []));
56
67
  }
57
68
  else {
58
69
  sharer.setSharedStorage(keySelectedElementController, null);
70
+ sharer.setSharedStorage(keySelectedElementPosition, []);
59
71
  }
60
72
  if ((opts === null || opts === void 0 ? void 0 : opts.triggerEvent) === true) {
61
73
  eventHub.trigger(middlewareEventSelect, { uuids: list.map((elem) => elem.uuid) });
@@ -63,7 +75,7 @@ export const MiddlewareSelector = (opts) => {
63
75
  };
64
76
  const pointTargetBaseOptions = () => {
65
77
  return {
66
- ctx: helperContext,
78
+ ctx: overlayContext,
67
79
  calculator,
68
80
  data: sharer.getActiveStorage('data'),
69
81
  selectedElements: getActiveElements(),
@@ -71,7 +83,8 @@ export const MiddlewareSelector = (opts) => {
71
83
  viewSizeInfo: sharer.getActiveViewSizeInfo(),
72
84
  groupQueue: sharer.getSharedStorage(keyGroupQueue),
73
85
  areaSize: null,
74
- selectedElementController: sharer.getSharedStorage(keySelectedElementController)
86
+ selectedElementController: sharer.getSharedStorage(keySelectedElementController),
87
+ selectedElementPosition: sharer.getSharedStorage(keySelectedElementPosition)
75
88
  };
76
89
  };
77
90
  const clear = () => {
@@ -86,6 +99,9 @@ export const MiddlewareSelector = (opts) => {
86
99
  sharer.setSharedStorage(keySelectedElementList, []);
87
100
  sharer.setSharedStorage(keySelectedElementListVertexes, null);
88
101
  sharer.setSharedStorage(keySelectedElementController, null);
102
+ sharer.setSharedStorage(keySelectedElementPosition, []);
103
+ sharer.setSharedStorage(keyIsMoving, null);
104
+ sharer.setSharedStorage(keyEnableSelectInGroup, null);
89
105
  };
90
106
  clear();
91
107
  const selectCallback = ({ uuids, positions }) => {
@@ -114,19 +130,40 @@ export const MiddlewareSelector = (opts) => {
114
130
  viewer.drawFrame();
115
131
  }
116
132
  };
133
+ const selectClearCallback = () => {
134
+ clear();
135
+ viewer.drawFrame();
136
+ };
137
+ const setSnapToSnapCallback = (e) => {
138
+ sharer.setSharedStorage(keyEnableSnapToGrid, !!e.enable);
139
+ };
140
+ const selectInGroupCallback = (e) => {
141
+ sharer.setSharedStorage(keyEnableSelectInGroup, !!e.enable);
142
+ };
117
143
  return {
144
+ name: '@middleware/selector',
118
145
  use() {
119
146
  eventHub.on(middlewareEventSelect, selectCallback);
147
+ eventHub.on(middlewareEventSelectClear, selectClearCallback);
148
+ eventHub.on(middlewareEventSelectInGroup, selectInGroupCallback);
149
+ eventHub.on(middlewareEventSnapToGrid, setSnapToSnapCallback);
120
150
  },
121
151
  disuse() {
122
152
  eventHub.off(middlewareEventSelect, selectCallback);
153
+ eventHub.off(middlewareEventSelectClear, selectClearCallback);
154
+ eventHub.off(middlewareEventSelectInGroup, selectInGroupCallback);
155
+ eventHub.off(middlewareEventSnapToGrid, setSnapToSnapCallback);
123
156
  },
124
157
  hover: (e) => {
125
- var _a, _b;
158
+ var _a, _b, _c, _d, _e;
159
+ const layoutIsSelected = sharer.getSharedStorage(keyLayoutIsSelected);
126
160
  const resizeType = sharer.getSharedStorage(keyResizeType);
127
161
  const actionType = sharer.getSharedStorage(keyActionType);
128
162
  const groupQueue = sharer.getSharedStorage(keyGroupQueue);
129
163
  const triggerCursor = (target) => {
164
+ if (layoutIsSelected === true) {
165
+ return;
166
+ }
130
167
  const cursor = target.type;
131
168
  if (inBusyMode === null) {
132
169
  eventHub.trigger('cursor', {
@@ -138,7 +175,7 @@ export const MiddlewareSelector = (opts) => {
138
175
  };
139
176
  if ((groupQueue === null || groupQueue === void 0 ? void 0 : groupQueue.length) > 0) {
140
177
  const isInActiveGroup = isPointInViewActiveGroup(e.point, {
141
- ctx: helperContext,
178
+ ctx: overlayContext,
142
179
  viewScaleInfo: sharer.getActiveViewScaleInfo(),
143
180
  viewSizeInfo: sharer.getActiveViewSizeInfo(),
144
181
  groupQueue: sharer.getSharedStorage(keyGroupQueue)
@@ -181,8 +218,27 @@ export const MiddlewareSelector = (opts) => {
181
218
  calculator
182
219
  }) }));
183
220
  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]);
221
+ if (target.type === null) {
222
+ if (sharer.getSharedStorage(keyHoverElement) || sharer.getSharedStorage(keyHoverElementVertexes)) {
223
+ sharer.setSharedStorage(keyHoverElement, null);
224
+ sharer.setSharedStorage(keyHoverElementVertexes, null);
225
+ viewer.drawFrame();
226
+ }
227
+ return;
228
+ }
229
+ if (target.type === 'over-element' &&
230
+ sharer.getSharedStorage(keyActionType) === 'select' &&
231
+ target.elements.length === 1 &&
232
+ target.elements[0].uuid === ((_c = (_b = getActiveElements()) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.uuid)) {
233
+ return;
234
+ }
235
+ if (target.type === 'over-element' &&
236
+ sharer.getSharedStorage(keyActionType) === null &&
237
+ target.elements.length === 1 &&
238
+ target.elements[0].uuid === ((_d = sharer.getSharedStorage(keyHoverElement)) === null || _d === void 0 ? void 0 : _d.uuid)) {
239
+ return;
240
+ }
241
+ 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
242
  updateHoverElement(target.elements[0]);
187
243
  viewer.drawFrame();
188
244
  return;
@@ -194,24 +250,28 @@ export const MiddlewareSelector = (opts) => {
194
250
  }
195
251
  },
196
252
  pointStart: (e) => {
197
- var _a, _b, _c, _d;
253
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
198
254
  prevPoint = e.point;
199
- updateHoverElement(null);
200
255
  const groupQueue = sharer.getSharedStorage(keyGroupQueue);
201
256
  if ((groupQueue === null || groupQueue === void 0 ? void 0 : groupQueue.length) > 0) {
202
257
  if (isPointInViewActiveGroup(e.point, {
203
- ctx: helperContext,
258
+ ctx: overlayContext,
204
259
  viewScaleInfo: sharer.getActiveViewScaleInfo(),
205
260
  viewSizeInfo: sharer.getActiveViewSizeInfo(),
206
261
  groupQueue
207
262
  })) {
208
263
  const target = getPointTarget(e.point, pointTargetBaseOptions());
209
- 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) {
264
+ 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.lock) === true) {
265
+ return;
266
+ }
267
+ else {
268
+ updateHoverElement(null);
269
+ }
270
+ if (target.type === 'over-element' && ((_d = target === null || target === void 0 ? void 0 : target.elements) === null || _d === void 0 ? void 0 : _d.length) === 1) {
211
271
  updateSelectedElementList([target.elements[0]], { triggerEvent: true });
212
272
  sharer.setSharedStorage(keyActionType, 'drag');
213
273
  }
214
- else if ((_b = target.type) === null || _b === void 0 ? void 0 : _b.startsWith('resize-')) {
274
+ else if ((_e = target.type) === null || _e === void 0 ? void 0 : _e.startsWith('resize-')) {
215
275
  sharer.setSharedStorage(keyResizeType, target.type);
216
276
  sharer.setSharedStorage(keyActionType, 'resize');
217
277
  }
@@ -231,14 +291,20 @@ export const MiddlewareSelector = (opts) => {
231
291
  calculator
232
292
  });
233
293
  const target = getPointTarget(e.point, Object.assign(Object.assign({}, pointTargetBaseOptions()), { areaSize: listAreaSize, groupQueue: [] }));
294
+ if (((_f = target === null || target === void 0 ? void 0 : target.elements) === null || _f === void 0 ? void 0 : _f.length) === 1 && ((_h = (_g = target.elements[0]) === null || _g === void 0 ? void 0 : _g.operations) === null || _h === void 0 ? void 0 : _h.lock) === true) {
295
+ return;
296
+ }
297
+ else {
298
+ updateHoverElement(null);
299
+ }
234
300
  if (target.type === 'list-area') {
235
301
  sharer.setSharedStorage(keyActionType, 'drag-list');
236
302
  }
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) {
303
+ else if (target.type === 'over-element' && ((_j = target === null || target === void 0 ? void 0 : target.elements) === null || _j === void 0 ? void 0 : _j.length) === 1) {
238
304
  updateSelectedElementList([target.elements[0]], { triggerEvent: true });
239
305
  sharer.setSharedStorage(keyActionType, 'drag');
240
306
  }
241
- else if ((_d = target.type) === null || _d === void 0 ? void 0 : _d.startsWith('resize-')) {
307
+ else if ((_k = target.type) === null || _k === void 0 ? void 0 : _k.startsWith('resize-')) {
242
308
  sharer.setSharedStorage(keyResizeType, target.type);
243
309
  sharer.setSharedStorage(keyActionType, 'resize');
244
310
  }
@@ -251,21 +317,61 @@ export const MiddlewareSelector = (opts) => {
251
317
  viewer.drawFrame();
252
318
  },
253
319
  pointMove: (e) => {
320
+ var _a, _b, _c;
321
+ sharer.setSharedStorage(keyIsMoving, true);
254
322
  const data = sharer.getActiveStorage('data');
255
323
  const elems = getActiveElements();
256
324
  const scale = sharer.getActiveStorage('scale') || 1;
325
+ const viewScaleInfo = sharer.getActiveViewScaleInfo();
326
+ const viewSizeInfo = sharer.getActiveViewSizeInfo();
257
327
  const start = prevPoint;
258
328
  const end = e.point;
259
329
  const resizeType = sharer.getSharedStorage(keyResizeType);
260
330
  const actionType = sharer.getSharedStorage(keyActionType);
261
331
  const groupQueue = sharer.getSharedStorage(keyGroupQueue);
332
+ const enableSnapToGrid = sharer.getSharedStorage(keyEnableSnapToGrid);
262
333
  if (actionType === 'drag') {
263
334
  inBusyMode = 'drag';
264
- if (data && (elems === null || elems === void 0 ? void 0 : elems.length) === 1 && start && end) {
335
+ if (data && (elems === null || elems === void 0 ? void 0 : elems.length) === 1 && start && end && ((_b = (_a = elems[0]) === null || _a === void 0 ? void 0 : _a.operations) === null || _b === void 0 ? void 0 : _b.lock) !== true) {
265
336
  const { moveX, moveY } = calcMoveInGroup(start, end, groupQueue);
266
- elems[0].x += moveX / scale;
267
- elems[0].y += moveY / scale;
337
+ let totalMoveX = calculator.toGridNum(moveX / scale);
338
+ let totalMoveY = calculator.toGridNum(moveY / scale);
339
+ if (enableSnapToGrid === true) {
340
+ const referenceInfo = calcReferenceInfo(elems[0].uuid, {
341
+ calculator,
342
+ data,
343
+ groupQueue,
344
+ viewScaleInfo,
345
+ viewSizeInfo
346
+ });
347
+ try {
348
+ if (referenceInfo) {
349
+ if (is.x(referenceInfo.offsetX) && referenceInfo.offsetX !== null) {
350
+ totalMoveX = calculator.toGridNum(totalMoveX + referenceInfo.offsetX);
351
+ }
352
+ if (is.y(referenceInfo.offsetY) && referenceInfo.offsetY !== null) {
353
+ totalMoveY = calculator.toGridNum(totalMoveY + referenceInfo.offsetY);
354
+ }
355
+ }
356
+ }
357
+ catch (err) {
358
+ console.error(err);
359
+ }
360
+ }
361
+ elems[0].x = calculator.toGridNum(elems[0].x + totalMoveX);
362
+ elems[0].y = calculator.toGridNum(elems[0].y + totalMoveY);
268
363
  updateSelectedElementList([elems[0]]);
364
+ calculator.modifyViewVisibleInfoMap(data, {
365
+ modifyOptions: {
366
+ type: 'updateElement',
367
+ content: {
368
+ element: elems[0],
369
+ position: sharer.getSharedStorage(keySelectedElementPosition) || []
370
+ }
371
+ },
372
+ viewSizeInfo,
373
+ viewScaleInfo
374
+ });
269
375
  }
270
376
  viewer.drawFrame();
271
377
  }
@@ -275,9 +381,21 @@ export const MiddlewareSelector = (opts) => {
275
381
  const moveX = (end.x - start.x) / scale;
276
382
  const moveY = (end.y - start.y) / scale;
277
383
  elems.forEach((elem) => {
278
- if (elem) {
279
- elem.x += moveX;
280
- elem.y += moveY;
384
+ var _a;
385
+ if (elem && ((_a = elem === null || elem === void 0 ? void 0 : elem.operations) === null || _a === void 0 ? void 0 : _a.lock) !== true) {
386
+ elem.x = calculator.toGridNum(elem.x + moveX);
387
+ elem.y = calculator.toGridNum(elem.y + moveY);
388
+ calculator.modifyViewVisibleInfoMap(data, {
389
+ modifyOptions: {
390
+ type: 'updateElement',
391
+ content: {
392
+ element: elem,
393
+ position: getElementPositionFromList(elem.uuid, data.elements) || []
394
+ }
395
+ },
396
+ viewSizeInfo,
397
+ viewScaleInfo
398
+ });
281
399
  }
282
400
  });
283
401
  sharer.setActiveStorage('data', data);
@@ -304,12 +422,54 @@ export const MiddlewareSelector = (opts) => {
304
422
  resizeStart = rotatePointInGroup(start, pointGroupQueue);
305
423
  resizeEnd = rotatePointInGroup(end, pointGroupQueue);
306
424
  }
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;
425
+ if (resizeType === 'resize-rotate') {
426
+ const controller = sharer.getSharedStorage(keySelectedElementController);
427
+ const viewVertexes = [
428
+ controller.topLeft.center,
429
+ controller.topRight.center,
430
+ controller.bottomLeft.center,
431
+ controller.bottomRight.center
432
+ ];
433
+ const viewCenter = calcElementCenterFromVertexes(viewVertexes);
434
+ const resizedElemSize = rotateElement(elems[0], {
435
+ center: viewCenter,
436
+ viewScaleInfo,
437
+ viewSizeInfo,
438
+ start,
439
+ end,
440
+ resizeType,
441
+ sharer
442
+ });
443
+ elems[0].angle = calculator.toGridNum(resizedElemSize.angle || 0);
444
+ }
445
+ else {
446
+ const resizedElemSize = resizeElement(elems[0], { scale, start: resizeStart, end: resizeEnd, resizeType, sharer });
447
+ const calcOpts = { ignore: !!elems[0].angle };
448
+ elems[0].x = calculator.toGridNum(resizedElemSize.x, calcOpts);
449
+ elems[0].y = calculator.toGridNum(resizedElemSize.y, calcOpts);
450
+ if (elems[0].type === 'group' && ((_c = elems[0].operations) === null || _c === void 0 ? void 0 : _c.deepResize) === true) {
451
+ deepResizeGroupElement(elems[0], {
452
+ w: calculator.toGridNum(resizedElemSize.w, calcOpts),
453
+ h: calculator.toGridNum(resizedElemSize.h, calcOpts)
454
+ });
455
+ }
456
+ else {
457
+ elems[0].w = calculator.toGridNum(resizedElemSize.w, calcOpts);
458
+ elems[0].h = calculator.toGridNum(resizedElemSize.h, calcOpts);
459
+ }
460
+ }
312
461
  updateSelectedElementList([elems[0]]);
462
+ calculator.modifyViewVisibleInfoMap(data, {
463
+ modifyOptions: {
464
+ type: 'updateElement',
465
+ content: {
466
+ element: elems[0],
467
+ position: sharer.getSharedStorage(keySelectedElementPosition) || []
468
+ }
469
+ },
470
+ viewSizeInfo,
471
+ viewScaleInfo
472
+ });
313
473
  viewer.drawFrame();
314
474
  }
315
475
  }
@@ -322,7 +482,10 @@ export const MiddlewareSelector = (opts) => {
322
482
  },
323
483
  pointEnd(e) {
324
484
  inBusyMode = null;
485
+ sharer.setSharedStorage(keyIsMoving, false);
325
486
  const data = sharer.getActiveStorage('data');
487
+ const selectedElements = sharer.getSharedStorage(keySelectedElementList);
488
+ const hoverElement = sharer.getSharedStorage(keyHoverElement);
326
489
  const resizeType = sharer.getSharedStorage(keyResizeType);
327
490
  const actionType = sharer.getSharedStorage(keyActionType);
328
491
  const viewSizeInfo = sharer.getActiveViewSizeInfo();
@@ -385,7 +548,11 @@ export const MiddlewareSelector = (opts) => {
385
548
  sharer.setActiveStorage('contextWidth', viewInfo.contextSize.contextWidth);
386
549
  }
387
550
  if (data && ['drag', 'drag-list', 'drag-list-end', 'resize'].includes(actionType)) {
388
- eventHub.trigger('change', { data });
551
+ let type = 'dragElement';
552
+ if (type === 'resize') {
553
+ type = 'resizeElement';
554
+ }
555
+ eventHub.trigger(eventChange, { data, type, selectedElements, hoverElement });
389
556
  }
390
557
  viewer.drawFrame();
391
558
  };
@@ -397,9 +564,17 @@ export const MiddlewareSelector = (opts) => {
397
564
  viewer.drawFrame();
398
565
  },
399
566
  doubleClick(e) {
400
- var _a, _b;
567
+ var _a, _b, _c, _d, _e, _f, _g, _h;
568
+ if (sharer.getSharedStorage(keyEnableSelectInGroup) === false) {
569
+ return;
570
+ }
401
571
  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') {
572
+ sharer.setSharedStorage(keySelectedElementController, null);
573
+ sharer.setSharedStorage(keySelectedElementList, []);
574
+ 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.lock) === true) {
575
+ return;
576
+ }
577
+ if (target.elements.length === 1 && ((_c = target.elements[0]) === null || _c === void 0 ? void 0 : _c.type) === 'group') {
403
578
  const pushResult = pushGroupQueue(target.elements[0]);
404
579
  if (pushResult === true) {
405
580
  sharer.setSharedStorage(keyActionType, null);
@@ -407,16 +582,18 @@ export const MiddlewareSelector = (opts) => {
407
582
  return;
408
583
  }
409
584
  }
410
- else if (target.elements.length === 1 && ((_b = target.elements[0]) === null || _b === void 0 ? void 0 : _b.type) === 'text') {
585
+ else if (target.elements.length === 1 && ((_d = target.elements[0]) === null || _d === void 0 ? void 0 : _d.type) === 'text' && !((_f = (_e = target.elements[0]) === null || _e === void 0 ? void 0 : _e.operations) === null || _f === void 0 ? void 0 : _f.invisible)) {
411
586
  eventHub.trigger(middlewareEventTextEdit, {
412
587
  element: target.elements[0],
413
588
  groupQueue: sharer.getSharedStorage(keyGroupQueue) || [],
589
+ 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
590
  viewScaleInfo: sharer.getActiveViewScaleInfo()
415
591
  });
416
592
  }
417
593
  sharer.setSharedStorage(keyActionType, null);
418
594
  },
419
595
  beforeDrawFrame({ snapshot }) {
596
+ var _a;
420
597
  const { activeStore, sharedStore } = snapshot;
421
598
  const { scale, offsetLeft, offsetTop, offsetRight, offsetBottom, width, height, contextHeight, contextWidth, devicePixelRatio } = activeStore;
422
599
  const sharer = opts.sharer;
@@ -431,7 +608,9 @@ export const MiddlewareSelector = (opts) => {
431
608
  const areaEnd = sharedStore[keyAreaEnd];
432
609
  const groupQueue = sharedStore[keyGroupQueue];
433
610
  const groupQueueVertexesList = sharedStore[keyGroupQueueVertexesList];
434
- const drawBaseOpts = { calculator, viewScaleInfo, viewSizeInfo };
611
+ const isMoving = sharedStore[keyIsMoving];
612
+ const enableSnapToGrid = sharedStore[keyEnableSnapToGrid];
613
+ const drawBaseOpts = { calculator, viewScaleInfo, viewSizeInfo, style };
435
614
  const selectedElementController = elem
436
615
  ? calcElementSizeController(elem, {
437
616
  groupQueue,
@@ -439,24 +618,85 @@ export const MiddlewareSelector = (opts) => {
439
618
  viewScaleInfo
440
619
  })
441
620
  : null;
621
+ const isLock = !!((_a = hoverElement === null || hoverElement === void 0 ? void 0 : hoverElement.operations) === null || _a === void 0 ? void 0 : _a.lock);
442
622
  if ((groupQueue === null || groupQueue === void 0 ? void 0 : groupQueue.length) > 0) {
443
- drawGroupQueueVertexesWrappers(helperContext, groupQueueVertexesList, drawBaseOpts);
623
+ drawGroupQueueVertexesWrappers(overlayContext, groupQueueVertexesList, drawBaseOpts);
444
624
  if (hoverElement && actionType !== 'drag') {
445
- drawHoverVertexesWrapper(helperContext, hoverElementVertexes, drawBaseOpts);
625
+ if (isLock) {
626
+ drawLockVertexesWrapper(overlayContext, hoverElementVertexes, Object.assign(Object.assign({}, drawBaseOpts), { controller: calcElementSizeController(hoverElement, {
627
+ groupQueue,
628
+ controllerSize: 10,
629
+ viewScaleInfo
630
+ }), style }));
631
+ }
632
+ else {
633
+ drawHoverVertexesWrapper(overlayContext, hoverElementVertexes, drawBaseOpts);
634
+ }
446
635
  }
447
- if (elem && ['select', 'drag', 'resize'].includes(actionType)) {
448
- drawSelectedElementControllersVertexes(helperContext, selectedElementController, Object.assign({}, drawBaseOpts));
636
+ if (!isLock && elem && ['select', 'drag', 'resize'].includes(actionType)) {
637
+ drawSelectedElementControllersVertexes(overlayContext, selectedElementController, Object.assign(Object.assign({}, drawBaseOpts), { element: elem, calculator, hideControllers: !!isMoving && actionType === 'drag', style }));
638
+ if (actionType === 'drag') {
639
+ if (enableSnapToGrid === true) {
640
+ const referenceInfo = calcReferenceInfo(elem.uuid, {
641
+ calculator,
642
+ data: activeStore.data,
643
+ groupQueue,
644
+ viewScaleInfo,
645
+ viewSizeInfo
646
+ });
647
+ if (referenceInfo) {
648
+ const { offsetX, offsetY, xLines, yLines } = referenceInfo;
649
+ if (offsetX === 0 || offsetY === 0) {
650
+ drawReferenceLines(overlayContext, {
651
+ xLines,
652
+ yLines,
653
+ style
654
+ });
655
+ }
656
+ }
657
+ }
658
+ }
449
659
  }
450
660
  }
451
661
  else {
452
662
  if (hoverElement && actionType !== 'drag') {
453
- drawHoverVertexesWrapper(helperContext, hoverElementVertexes, drawBaseOpts);
663
+ if (isLock) {
664
+ drawLockVertexesWrapper(overlayContext, hoverElementVertexes, Object.assign(Object.assign({}, drawBaseOpts), { controller: calcElementSizeController(hoverElement, {
665
+ groupQueue,
666
+ controllerSize: 10,
667
+ viewScaleInfo
668
+ }), style }));
669
+ }
670
+ else {
671
+ drawHoverVertexesWrapper(overlayContext, hoverElementVertexes, drawBaseOpts);
672
+ }
454
673
  }
455
- if (elem && ['select', 'drag', 'resize'].includes(actionType)) {
456
- drawSelectedElementControllersVertexes(helperContext, selectedElementController, Object.assign({}, drawBaseOpts));
674
+ if (!isLock && elem && ['select', 'drag', 'resize'].includes(actionType)) {
675
+ drawSelectedElementControllersVertexes(overlayContext, selectedElementController, Object.assign(Object.assign({}, drawBaseOpts), { element: elem, calculator, hideControllers: !!isMoving && actionType === 'drag', style }));
676
+ if (actionType === 'drag') {
677
+ if (enableSnapToGrid === true) {
678
+ const referenceInfo = calcReferenceInfo(elem.uuid, {
679
+ calculator,
680
+ data: activeStore.data,
681
+ groupQueue,
682
+ viewScaleInfo,
683
+ viewSizeInfo
684
+ });
685
+ if (referenceInfo) {
686
+ const { offsetX, offsetY, xLines, yLines } = referenceInfo;
687
+ if (offsetX === 0 || offsetY === 0) {
688
+ drawReferenceLines(overlayContext, {
689
+ xLines,
690
+ yLines,
691
+ style
692
+ });
693
+ }
694
+ }
695
+ }
696
+ }
457
697
  }
458
698
  else if (actionType === 'area' && areaStart && areaEnd) {
459
- drawArea(helperContext, { start: areaStart, end: areaEnd });
699
+ drawArea(overlayContext, { start: areaStart, end: areaEnd, style });
460
700
  }
461
701
  else if (['drag-list', 'drag-list-end'].includes(actionType)) {
462
702
  const listAreaSize = calcSelectedElementsArea(getActiveElements(), {
@@ -465,7 +705,7 @@ export const MiddlewareSelector = (opts) => {
465
705
  calculator
466
706
  });
467
707
  if (listAreaSize) {
468
- drawListArea(helperContext, { areaSize: listAreaSize });
708
+ drawListArea(overlayContext, { areaSize: listAreaSize, style });
469
709
  }
470
710
  }
471
711
  }
@@ -0,0 +1,13 @@
1
+ import type { Data, Element, PointSize, ViewScaleInfo, ViewSizeInfo, ViewCalculator } from '@idraw/types';
2
+ export declare function calcReferenceInfo(uuid: string, opts: {
3
+ data: Data;
4
+ groupQueue: Element<'group'>[];
5
+ calculator: ViewCalculator;
6
+ viewScaleInfo: ViewScaleInfo;
7
+ viewSizeInfo: ViewSizeInfo;
8
+ }): {
9
+ offsetX: number | null;
10
+ offsetY: number | null;
11
+ yLines: PointSize[][];
12
+ xLines: PointSize[][];
13
+ } | null;