@idraw/core 0.4.0-beta.1 → 0.4.0-beta.11

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.
@@ -1,5 +1,5 @@
1
1
  import { rotateElementVertexes, calcViewVertexes } from '@idraw/util';
2
- import { resizeControllerBorderWidth, areaBorderWidth, wrapperColor, selectWrapperBorderWidth } from './config';
2
+ import { resizeControllerBorderWidth, areaBorderWidth, wrapperColor, selectWrapperBorderWidth, lockColor } from './config';
3
3
  function drawVertexes(ctx, vertexes, opts) {
4
4
  const { borderColor, borderWidth, background, lineDash } = opts;
5
5
  ctx.setLineDash([]);
@@ -24,6 +24,44 @@ export function drawHoverVertexesWrapper(ctx, vertexes, opts) {
24
24
  const wrapperOpts = { borderColor: wrapperColor, borderWidth: 1, background: 'transparent', lineDash: [] };
25
25
  drawVertexes(ctx, calcViewVertexes(vertexes, opts), wrapperOpts);
26
26
  }
27
+ function drawCrossVertexes(ctx, vertexes, opts) {
28
+ const { borderColor, borderWidth, background, lineDash } = opts;
29
+ ctx.setLineDash([]);
30
+ ctx.lineWidth = borderWidth;
31
+ ctx.strokeStyle = borderColor;
32
+ ctx.fillStyle = background;
33
+ ctx.setLineDash(lineDash);
34
+ ctx.beginPath();
35
+ ctx.moveTo(vertexes[0].x, vertexes[0].y);
36
+ ctx.lineTo(vertexes[2].x, vertexes[2].y);
37
+ ctx.closePath();
38
+ ctx.stroke();
39
+ ctx.beginPath();
40
+ ctx.moveTo(vertexes[1].x, vertexes[1].y);
41
+ ctx.lineTo(vertexes[3].x, vertexes[3].y);
42
+ ctx.closePath();
43
+ ctx.stroke();
44
+ }
45
+ export function drawLockVertexesWrapper(ctx, vertexes, opts) {
46
+ if (!vertexes) {
47
+ return;
48
+ }
49
+ const wrapperOpts = { borderColor: lockColor, borderWidth: 1, background: 'transparent', lineDash: [] };
50
+ drawVertexes(ctx, calcViewVertexes(vertexes, opts), wrapperOpts);
51
+ const { controller } = opts;
52
+ if (controller) {
53
+ const { topLeft, topRight, bottomLeft, bottomRight, topMiddle, bottomMiddle, leftMiddle, rightMiddle } = controller;
54
+ const ctrlOpts = Object.assign(Object.assign({}, wrapperOpts), { borderWidth: 1, background: lockColor });
55
+ drawCrossVertexes(ctx, calcViewVertexes(topMiddle.vertexes, opts), ctrlOpts);
56
+ drawCrossVertexes(ctx, calcViewVertexes(bottomMiddle.vertexes, opts), ctrlOpts);
57
+ drawCrossVertexes(ctx, calcViewVertexes(leftMiddle.vertexes, opts), ctrlOpts);
58
+ drawCrossVertexes(ctx, calcViewVertexes(rightMiddle.vertexes, opts), ctrlOpts);
59
+ drawCrossVertexes(ctx, calcViewVertexes(topLeft.vertexes, opts), ctrlOpts);
60
+ drawCrossVertexes(ctx, calcViewVertexes(topRight.vertexes, opts), ctrlOpts);
61
+ drawCrossVertexes(ctx, calcViewVertexes(bottomLeft.vertexes, opts), ctrlOpts);
62
+ drawCrossVertexes(ctx, calcViewVertexes(bottomRight.vertexes, opts), ctrlOpts);
63
+ }
64
+ }
27
65
  export function drawSelectedElementControllersVertexes(ctx, controller, opts) {
28
66
  if (!controller) {
29
67
  return;
@@ -1,4 +1,5 @@
1
1
  import type { CoreEvent } from '@idraw/types';
2
2
  import type { BoardMiddleware, DeepSelectorSharedStorage } from './types';
3
3
  export declare const middlewareEventSelect: string;
4
+ export declare const middlewareEventSelectClear: string;
4
5
  export declare const MiddlewareSelector: BoardMiddleware<DeepSelectorSharedStorage, CoreEvent>;
@@ -1,40 +1,15 @@
1
- import { calcElementsViewInfo, calcElementVertexesInGroup, calcElementQueueVertexesQueueInGroup, calcElementSizeController, rotatePointInGroup, getGroupQueueFromList, findElementsFromList, findElementsFromListByPositions } from '@idraw/util';
2
- import { drawHoverVertexesWrapper, drawArea, drawListArea, drawGroupQueueVertexesWrappers, drawSelectedElementControllersVertexes } from './draw-wrapper';
1
+ import { calcElementsViewInfo, calcElementVertexesInGroup, calcElementQueueVertexesQueueInGroup, calcElementSizeController, rotatePointInGroup, getGroupQueueFromList, findElementsFromList, findElementsFromListByPositions, deepResizeGroupElement } from '@idraw/util';
2
+ import { drawHoverVertexesWrapper, drawLockVertexesWrapper, drawArea, drawListArea, drawGroupQueueVertexesWrappers, drawSelectedElementControllersVertexes } from './draw-wrapper';
3
3
  import { getPointTarget, resizeElement, getSelectedListArea, calcSelectedElementsArea, isElementInGroup, isPointInViewActiveGroup, calcMoveInGroup } from './util';
4
- import { key, keyActionType, keyResizeType, keyAreaStart, keyAreaEnd, keyGroupQueue, keyGroupQueueVertexesList, keyHoverElement, keyHoverElementVertexes, keySelectedElementList, keySelectedElementListVertexes, keySelectedElementController } from './config';
4
+ import { keyActionType, keyResizeType, keyAreaStart, keyAreaEnd, keyGroupQueue, keyGroupQueueVertexesList, keyHoverElement, keyHoverElementVertexes, keySelectedElementList, keySelectedElementListVertexes, keySelectedElementController } from './config';
5
5
  import { middlewareEventTextEdit } from '../text-editor';
6
6
  export const middlewareEventSelect = '@middleware/select';
7
+ export const middlewareEventSelectClear = '@middleware/select-clear';
7
8
  export const MiddlewareSelector = (opts) => {
8
- const { viewer, sharer, viewContent, calculator, eventHub } = opts;
9
- const { helperContext } = viewContent;
9
+ const { viewer, sharer, boardContent, calculator, eventHub } = opts;
10
+ const { helperContext } = boardContent;
10
11
  let prevPoint = null;
11
12
  let inBusyMode = null;
12
- eventHub.on(middlewareEventSelect, ({ uuids, positions }) => {
13
- let elements = [];
14
- const actionType = sharer.getSharedStorage(keyActionType);
15
- const data = sharer.getActiveStorage('data');
16
- if (positions && Array.isArray(positions)) {
17
- elements = findElementsFromListByPositions(positions, (data === null || data === void 0 ? void 0 : data.elements) || []);
18
- }
19
- else {
20
- elements = findElementsFromList(uuids, (data === null || data === void 0 ? void 0 : data.elements) || []);
21
- }
22
- let needRefresh = false;
23
- if (!actionType && elements.length === 1) {
24
- sharer.setSharedStorage(keyActionType, 'select');
25
- needRefresh = true;
26
- }
27
- else if (actionType === 'select' && elements.length === 1) {
28
- needRefresh = true;
29
- }
30
- if (needRefresh) {
31
- const elem = elements[0];
32
- const groupQueue = getGroupQueueFromList(elem.uuid, (data === null || data === void 0 ? void 0 : data.elements) || []);
33
- sharer.setSharedStorage(keyGroupQueue, groupQueue);
34
- updateSelectedElementList(elements);
35
- viewer.drawFrame();
36
- }
37
- });
38
13
  sharer.setSharedStorage(keyActionType, null);
39
14
  const getActiveElements = () => {
40
15
  return sharer.getSharedStorage(keySelectedElementList);
@@ -114,15 +89,53 @@ export const MiddlewareSelector = (opts) => {
114
89
  sharer.setSharedStorage(keySelectedElementController, null);
115
90
  };
116
91
  clear();
92
+ const selectCallback = ({ uuids, positions }) => {
93
+ let elements = [];
94
+ const actionType = sharer.getSharedStorage(keyActionType);
95
+ const data = sharer.getActiveStorage('data');
96
+ if (positions && Array.isArray(positions)) {
97
+ elements = findElementsFromListByPositions(positions, (data === null || data === void 0 ? void 0 : data.elements) || []);
98
+ }
99
+ else {
100
+ elements = findElementsFromList(uuids, (data === null || data === void 0 ? void 0 : data.elements) || []);
101
+ }
102
+ let needRefresh = false;
103
+ if (!actionType && elements.length === 1) {
104
+ sharer.setSharedStorage(keyActionType, 'select');
105
+ needRefresh = true;
106
+ }
107
+ else if (actionType === 'select' && elements.length === 1) {
108
+ needRefresh = true;
109
+ }
110
+ if (needRefresh) {
111
+ const elem = elements[0];
112
+ const groupQueue = getGroupQueueFromList(elem.uuid, (data === null || data === void 0 ? void 0 : data.elements) || []);
113
+ sharer.setSharedStorage(keyGroupQueue, groupQueue);
114
+ updateSelectedElementList(elements);
115
+ viewer.drawFrame();
116
+ }
117
+ };
118
+ const selectClearCallback = () => {
119
+ clear();
120
+ viewer.drawFrame();
121
+ };
117
122
  return {
118
- mode: key,
123
+ name: '@middleware/selector',
124
+ use() {
125
+ eventHub.on(middlewareEventSelect, selectCallback);
126
+ eventHub.on(middlewareEventSelectClear, selectClearCallback);
127
+ },
128
+ disuse() {
129
+ eventHub.off(middlewareEventSelect, selectCallback);
130
+ eventHub.off(middlewareEventSelectClear, selectClearCallback);
131
+ },
119
132
  hover: (e) => {
120
- var _a, _b;
133
+ var _a, _b, _c, _d, _e;
121
134
  const resizeType = sharer.getSharedStorage(keyResizeType);
122
135
  const actionType = sharer.getSharedStorage(keyActionType);
123
136
  const groupQueue = sharer.getSharedStorage(keyGroupQueue);
124
137
  const triggerCursor = (target) => {
125
- let cursor = target.type;
138
+ const cursor = target.type;
126
139
  if (inBusyMode === null) {
127
140
  eventHub.trigger('cursor', {
128
141
  type: cursor,
@@ -176,8 +189,22 @@ export const MiddlewareSelector = (opts) => {
176
189
  calculator
177
190
  }) }));
178
191
  triggerCursor(target);
179
- if (target.type === 'over-element' && ((_b = target === null || target === void 0 ? void 0 : target.elements) === null || _b === void 0 ? void 0 : _b.length) === 1) {
180
- sharer.setSharedStorage(keyHoverElement, target.elements[0]);
192
+ if (target.type === null) {
193
+ return;
194
+ }
195
+ if (target.type === 'over-element' &&
196
+ sharer.getSharedStorage(keyActionType) === 'select' &&
197
+ target.elements.length === 1 &&
198
+ target.elements[0].uuid === ((_c = (_b = getActiveElements()) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.uuid)) {
199
+ return;
200
+ }
201
+ if (target.type === 'over-element' &&
202
+ sharer.getSharedStorage(keyActionType) === null &&
203
+ target.elements.length === 1 &&
204
+ target.elements[0].uuid === ((_d = sharer.getSharedStorage(keyHoverElement)) === null || _d === void 0 ? void 0 : _d.uuid)) {
205
+ return;
206
+ }
207
+ if (target.type === 'over-element' && ((_e = target === null || target === void 0 ? void 0 : target.elements) === null || _e === void 0 ? void 0 : _e.length) === 1) {
181
208
  updateHoverElement(target.elements[0]);
182
209
  viewer.drawFrame();
183
210
  return;
@@ -189,9 +216,8 @@ export const MiddlewareSelector = (opts) => {
189
216
  }
190
217
  },
191
218
  pointStart: (e) => {
192
- var _a, _b, _c, _d;
219
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
193
220
  prevPoint = e.point;
194
- updateHoverElement(null);
195
221
  const groupQueue = sharer.getSharedStorage(keyGroupQueue);
196
222
  if ((groupQueue === null || groupQueue === void 0 ? void 0 : groupQueue.length) > 0) {
197
223
  if (isPointInViewActiveGroup(e.point, {
@@ -201,12 +227,17 @@ export const MiddlewareSelector = (opts) => {
201
227
  groupQueue
202
228
  })) {
203
229
  const target = getPointTarget(e.point, pointTargetBaseOptions());
204
- updateHoverElement(null);
205
- if (target.type === 'over-element' && ((_a = target === null || target === void 0 ? void 0 : target.elements) === null || _a === void 0 ? void 0 : _a.length) === 1) {
230
+ 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) {
231
+ return;
232
+ }
233
+ else {
234
+ updateHoverElement(null);
235
+ }
236
+ if (target.type === 'over-element' && ((_d = target === null || target === void 0 ? void 0 : target.elements) === null || _d === void 0 ? void 0 : _d.length) === 1) {
206
237
  updateSelectedElementList([target.elements[0]], { triggerEvent: true });
207
238
  sharer.setSharedStorage(keyActionType, 'drag');
208
239
  }
209
- else if ((_b = target.type) === null || _b === void 0 ? void 0 : _b.startsWith('resize-')) {
240
+ else if ((_e = target.type) === null || _e === void 0 ? void 0 : _e.startsWith('resize-')) {
210
241
  sharer.setSharedStorage(keyResizeType, target.type);
211
242
  sharer.setSharedStorage(keyActionType, 'resize');
212
243
  }
@@ -226,14 +257,20 @@ export const MiddlewareSelector = (opts) => {
226
257
  calculator
227
258
  });
228
259
  const target = getPointTarget(e.point, Object.assign(Object.assign({}, pointTargetBaseOptions()), { areaSize: listAreaSize, groupQueue: [] }));
260
+ 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) {
261
+ return;
262
+ }
263
+ else {
264
+ updateHoverElement(null);
265
+ }
229
266
  if (target.type === 'list-area') {
230
267
  sharer.setSharedStorage(keyActionType, 'drag-list');
231
268
  }
232
- 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) {
269
+ 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) {
233
270
  updateSelectedElementList([target.elements[0]], { triggerEvent: true });
234
271
  sharer.setSharedStorage(keyActionType, 'drag');
235
272
  }
236
- else if ((_d = target.type) === null || _d === void 0 ? void 0 : _d.startsWith('resize-')) {
273
+ else if ((_k = target.type) === null || _k === void 0 ? void 0 : _k.startsWith('resize-')) {
237
274
  sharer.setSharedStorage(keyResizeType, target.type);
238
275
  sharer.setSharedStorage(keyActionType, 'resize');
239
276
  }
@@ -246,6 +283,7 @@ export const MiddlewareSelector = (opts) => {
246
283
  viewer.drawFrame();
247
284
  },
248
285
  pointMove: (e) => {
286
+ var _a, _b, _c;
249
287
  const data = sharer.getActiveStorage('data');
250
288
  const elems = getActiveElements();
251
289
  const scale = sharer.getActiveStorage('scale') || 1;
@@ -256,7 +294,7 @@ export const MiddlewareSelector = (opts) => {
256
294
  const groupQueue = sharer.getSharedStorage(keyGroupQueue);
257
295
  if (actionType === 'drag') {
258
296
  inBusyMode = 'drag';
259
- if (data && (elems === null || elems === void 0 ? void 0 : elems.length) === 1 && start && end) {
297
+ 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) {
260
298
  const { moveX, moveY } = calcMoveInGroup(start, end, groupQueue);
261
299
  elems[0].x += moveX / scale;
262
300
  elems[0].y += moveY / scale;
@@ -270,7 +308,8 @@ export const MiddlewareSelector = (opts) => {
270
308
  const moveX = (end.x - start.x) / scale;
271
309
  const moveY = (end.y - start.y) / scale;
272
310
  elems.forEach((elem) => {
273
- if (elem) {
311
+ var _a;
312
+ if (elem && ((_a = elem === null || elem === void 0 ? void 0 : elem.operations) === null || _a === void 0 ? void 0 : _a.lock) !== true) {
274
313
  elem.x += moveX;
275
314
  elem.y += moveY;
276
315
  }
@@ -302,8 +341,16 @@ export const MiddlewareSelector = (opts) => {
302
341
  const resizedElemSize = resizeElement(elems[0], { scale, start: resizeStart, end: resizeEnd, resizeType, sharer });
303
342
  elems[0].x = resizedElemSize.x;
304
343
  elems[0].y = resizedElemSize.y;
305
- elems[0].w = resizedElemSize.w;
306
- elems[0].h = resizedElemSize.h;
344
+ if (elems[0].type === 'group' && ((_c = elems[0].operations) === null || _c === void 0 ? void 0 : _c.deepResize) === true) {
345
+ deepResizeGroupElement(elems[0], {
346
+ w: resizedElemSize.w,
347
+ h: resizedElemSize.h
348
+ });
349
+ }
350
+ else {
351
+ elems[0].w = resizedElemSize.w;
352
+ elems[0].h = resizedElemSize.h;
353
+ }
307
354
  updateSelectedElementList([elems[0]]);
308
355
  viewer.drawFrame();
309
356
  }
@@ -380,7 +427,11 @@ export const MiddlewareSelector = (opts) => {
380
427
  sharer.setActiveStorage('contextWidth', viewInfo.contextSize.contextWidth);
381
428
  }
382
429
  if (data && ['drag', 'drag-list', 'drag-list-end', 'resize'].includes(actionType)) {
383
- eventHub.trigger('change', { data });
430
+ let type = 'drag-element';
431
+ if (type === 'resize') {
432
+ type = 'resize-element';
433
+ }
434
+ eventHub.trigger('change', { data, type });
384
435
  }
385
436
  viewer.drawFrame();
386
437
  };
@@ -392,9 +443,14 @@ export const MiddlewareSelector = (opts) => {
392
443
  viewer.drawFrame();
393
444
  },
394
445
  doubleClick(e) {
395
- var _a, _b;
446
+ var _a, _b, _c, _d;
396
447
  const target = getPointTarget(e.point, pointTargetBaseOptions());
397
- if (target.elements.length === 1 && ((_a = target.elements[0]) === null || _a === void 0 ? void 0 : _a.type) === 'group') {
448
+ sharer.setSharedStorage(keySelectedElementController, null);
449
+ sharer.setSharedStorage(keySelectedElementList, []);
450
+ 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) {
451
+ return;
452
+ }
453
+ if (target.elements.length === 1 && ((_c = target.elements[0]) === null || _c === void 0 ? void 0 : _c.type) === 'group') {
398
454
  const pushResult = pushGroupQueue(target.elements[0]);
399
455
  if (pushResult === true) {
400
456
  sharer.setSharedStorage(keyActionType, null);
@@ -402,7 +458,7 @@ export const MiddlewareSelector = (opts) => {
402
458
  return;
403
459
  }
404
460
  }
405
- else if (target.elements.length === 1 && ((_b = target.elements[0]) === null || _b === void 0 ? void 0 : _b.type) === 'text') {
461
+ else if (target.elements.length === 1 && ((_d = target.elements[0]) === null || _d === void 0 ? void 0 : _d.type) === 'text') {
406
462
  eventHub.trigger(middlewareEventTextEdit, {
407
463
  element: target.elements[0],
408
464
  groupQueue: sharer.getSharedStorage(keyGroupQueue) || [],
@@ -412,6 +468,7 @@ export const MiddlewareSelector = (opts) => {
412
468
  sharer.setSharedStorage(keyActionType, null);
413
469
  },
414
470
  beforeDrawFrame({ snapshot }) {
471
+ var _a;
415
472
  const { activeStore, sharedStore } = snapshot;
416
473
  const { scale, offsetLeft, offsetTop, offsetRight, offsetBottom, width, height, contextHeight, contextWidth, devicePixelRatio } = activeStore;
417
474
  const sharer = opts.sharer;
@@ -434,20 +491,39 @@ export const MiddlewareSelector = (opts) => {
434
491
  viewScaleInfo
435
492
  })
436
493
  : null;
494
+ const isLock = !!((_a = hoverElement === null || hoverElement === void 0 ? void 0 : hoverElement.operations) === null || _a === void 0 ? void 0 : _a.lock);
437
495
  if ((groupQueue === null || groupQueue === void 0 ? void 0 : groupQueue.length) > 0) {
438
496
  drawGroupQueueVertexesWrappers(helperContext, groupQueueVertexesList, drawBaseOpts);
439
497
  if (hoverElement && actionType !== 'drag') {
440
- drawHoverVertexesWrapper(helperContext, hoverElementVertexes, drawBaseOpts);
498
+ if (isLock) {
499
+ drawLockVertexesWrapper(helperContext, hoverElementVertexes, Object.assign(Object.assign({}, drawBaseOpts), { controller: calcElementSizeController(hoverElement, {
500
+ groupQueue,
501
+ controllerSize: 10,
502
+ viewScaleInfo
503
+ }) }));
504
+ }
505
+ else {
506
+ drawHoverVertexesWrapper(helperContext, hoverElementVertexes, drawBaseOpts);
507
+ }
441
508
  }
442
- if (elem && ['select', 'drag', 'resize'].includes(actionType)) {
509
+ if (!isLock && elem && ['select', 'drag', 'resize'].includes(actionType)) {
443
510
  drawSelectedElementControllersVertexes(helperContext, selectedElementController, Object.assign({}, drawBaseOpts));
444
511
  }
445
512
  }
446
513
  else {
447
514
  if (hoverElement && actionType !== 'drag') {
448
- drawHoverVertexesWrapper(helperContext, hoverElementVertexes, drawBaseOpts);
515
+ if (isLock) {
516
+ drawLockVertexesWrapper(helperContext, hoverElementVertexes, Object.assign(Object.assign({}, drawBaseOpts), { controller: calcElementSizeController(hoverElement, {
517
+ groupQueue,
518
+ controllerSize: 10,
519
+ viewScaleInfo
520
+ }) }));
521
+ }
522
+ else {
523
+ drawHoverVertexesWrapper(helperContext, hoverElementVertexes, drawBaseOpts);
524
+ }
449
525
  }
450
- if (elem && ['select', 'drag', 'resize'].includes(actionType)) {
526
+ if (!isLock && elem && ['select', 'drag', 'resize'].includes(actionType)) {
451
527
  drawSelectedElementControllersVertexes(helperContext, selectedElementController, Object.assign({}, drawBaseOpts));
452
528
  }
453
529
  else if (actionType === 'area' && areaStart && areaEnd) {
@@ -672,6 +672,7 @@ export function resizeElement(elem, opts) {
672
672
  return { x, y, w, h, angle: elem.angle };
673
673
  }
674
674
  export function getSelectedListArea(data, opts) {
675
+ var _a;
675
676
  const indexes = [];
676
677
  const uuids = [];
677
678
  const elements = [];
@@ -683,7 +684,11 @@ export function getSelectedListArea(data, opts) {
683
684
  const endX = Math.max(start.x, end.x);
684
685
  const startY = Math.min(start.y, end.y);
685
686
  const endY = Math.max(start.y, end.y);
686
- data.elements.forEach((elem, idx) => {
687
+ for (let idx = 0; idx < data.elements.length; idx++) {
688
+ const elem = data.elements[idx];
689
+ if (((_a = elem === null || elem === void 0 ? void 0 : elem.operations) === null || _a === void 0 ? void 0 : _a.lock) === true) {
690
+ continue;
691
+ }
687
692
  const elemSize = calculator.elementSize(elem, viewScaleInfo, viewSizeInfo);
688
693
  const center = calcElementCenter(elemSize);
689
694
  if (center.x >= startX && center.x <= endX && center.y >= startY && center.y <= endY) {
@@ -702,7 +707,7 @@ export function getSelectedListArea(data, opts) {
702
707
  }
703
708
  }
704
709
  }
705
- });
710
+ }
706
711
  return { indexes, uuids, elements };
707
712
  }
708
713
  export function calcSelectedElementsArea(elements, opts) {
@@ -2,9 +2,8 @@ import { limitAngle, getDefaultElementDetailConfig } from '@idraw/util';
2
2
  export const middlewareEventTextEdit = '@middleware/text-edit';
3
3
  const defaultElementDetail = getDefaultElementDetailConfig();
4
4
  export const MiddlewareTextEditor = (opts) => {
5
- const key = 'SELECT';
6
- const { eventHub, viewContent, viewer } = opts;
7
- const canvas = viewContent.boardContext.canvas;
5
+ const { eventHub, boardContent, viewer } = opts;
6
+ const canvas = boardContent.boardContext.canvas;
8
7
  const textarea = document.createElement('textarea');
9
8
  const canvasWrapper = document.createElement('div');
10
9
  const container = opts.container || document.body;
@@ -86,10 +85,10 @@ export const MiddlewareTextEditor = (opts) => {
86
85
  elemH = element.h * scale;
87
86
  }
88
87
  textarea.style.position = 'absolute';
89
- textarea.style.left = `${elemX}px`;
90
- textarea.style.top = `${elemY}px`;
91
- textarea.style.width = `${elemW}px`;
92
- textarea.style.height = `${elemH}px`;
88
+ textarea.style.left = `${elemX - 1}px`;
89
+ textarea.style.top = `${elemY - 1}px`;
90
+ textarea.style.width = `${elemW + 2}px`;
91
+ textarea.style.height = `${elemH + 2}px`;
93
92
  textarea.style.transform = `rotate(${limitAngle(element.angle || 0)}deg)`;
94
93
  textarea.style.boxSizing = 'border-box';
95
94
  textarea.style.border = '1px solid #1973ba';
@@ -102,6 +101,9 @@ export const MiddlewareTextEditor = (opts) => {
102
101
  textarea.style.lineHeight = `${detail.lineHeight * scale}px`;
103
102
  textarea.style.fontFamily = detail.fontFamily;
104
103
  textarea.style.fontWeight = `${detail.fontWeight}`;
104
+ textarea.style.padding = '0';
105
+ textarea.style.margin = '0';
106
+ textarea.style.outline = 'none';
105
107
  textarea.value = detail.text || '';
106
108
  parent.appendChild(textarea);
107
109
  };
@@ -129,15 +131,20 @@ export const MiddlewareTextEditor = (opts) => {
129
131
  textarea.addEventListener('blur', () => {
130
132
  hideTextArea();
131
133
  });
132
- eventHub.on(middlewareEventTextEdit, (e) => {
134
+ const textEditCallback = (e) => {
133
135
  var _a;
134
136
  if ((e === null || e === void 0 ? void 0 : e.element) && ((_a = e === null || e === void 0 ? void 0 : e.element) === null || _a === void 0 ? void 0 : _a.type) === 'text') {
135
137
  activeElem = e.element;
136
138
  }
137
139
  showTextArea(e);
138
- });
140
+ };
139
141
  return {
140
- mode: key,
141
- isDefault: true
142
+ name: '@middleware/text-editor',
143
+ use() {
144
+ eventHub.on(middlewareEventTextEdit, textEditCallback);
145
+ },
146
+ disuse() {
147
+ eventHub.off(middlewareEventTextEdit, textEditCallback);
148
+ }
142
149
  };
143
150
  };