@idraw/core 0.4.0-beta.14 → 0.4.0-beta.16

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,11 +1,11 @@
1
- import type { Data, PointSize, CoreOptions, BoardMiddleware, ViewSizeInfo, CoreEvent, ViewScaleInfo, LoadItemMap } from '@idraw/types';
1
+ import type { Data, PointSize, CoreOptions, BoardMiddleware, ViewSizeInfo, CoreEventMap, ViewScaleInfo, LoadItemMap } from '@idraw/types';
2
2
  export { MiddlewareSelector, middlewareEventSelect, middlewareEventSelectClear } from './middleware/selector';
3
3
  export { MiddlewareScroller } from './middleware/scroller';
4
4
  export { MiddlewareScaler, middlewareEventScale } from './middleware/scaler';
5
5
  export { MiddlewareRuler, middlewareEventRuler } from './middleware/ruler';
6
- export { MiddlewareTextEditor, middlewareEventTextEdit } from './middleware/text-editor';
6
+ export { MiddlewareTextEditor, middlewareEventTextEdit, middlewareEventTextChange } from './middleware/text-editor';
7
7
  export { MiddlewareDragger } from './middleware/dragger';
8
- export declare class Core<E extends CoreEvent = CoreEvent> {
8
+ export declare class Core<E extends CoreEventMap = CoreEventMap> {
9
9
  #private;
10
10
  constructor(container: HTMLDivElement, opts: CoreOptions);
11
11
  isDestroyed(): boolean;
package/dist/esm/index.js CHANGED
@@ -17,7 +17,7 @@ export { MiddlewareSelector, middlewareEventSelect, middlewareEventSelectClear }
17
17
  export { MiddlewareScroller } from './middleware/scroller';
18
18
  export { MiddlewareScaler, middlewareEventScale } from './middleware/scaler';
19
19
  export { MiddlewareRuler, middlewareEventRuler } from './middleware/ruler';
20
- export { MiddlewareTextEditor, middlewareEventTextEdit } from './middleware/text-editor';
20
+ export { MiddlewareTextEditor, middlewareEventTextEdit, middlewareEventTextChange } from './middleware/text-editor';
21
21
  export { MiddlewareDragger } from './middleware/dragger';
22
22
  export class Core {
23
23
  constructor(container, opts) {
@@ -1,7 +1,7 @@
1
- import type { UtilEventEmitter, CoreEvent } from '@idraw/types';
1
+ import type { UtilEventEmitter, CoreEventMap } from '@idraw/types';
2
2
  export declare class Cursor {
3
3
  #private;
4
4
  constructor(container: HTMLDivElement, opts: {
5
- eventHub: UtilEventEmitter<CoreEvent>;
5
+ eventHub: UtilEventEmitter<CoreEventMap>;
6
6
  });
7
7
  }
@@ -1,7 +1,7 @@
1
- import type { BoardMiddleware, CoreEvent, Point } from '@idraw/types';
1
+ import type { BoardMiddleware, CoreEventMap, Point } from '@idraw/types';
2
2
  declare const keyPrevPoint: unique symbol;
3
3
  type DraggerSharedStorage = {
4
4
  [keyPrevPoint]: Point | null;
5
5
  };
6
- export declare const MiddlewareDragger: BoardMiddleware<DraggerSharedStorage, CoreEvent>;
6
+ export declare const MiddlewareDragger: BoardMiddleware<DraggerSharedStorage, CoreEventMap>;
7
7
  export {};
@@ -1,3 +1,3 @@
1
- import type { BoardMiddleware, CoreEvent } from '@idraw/types';
1
+ import type { BoardMiddleware, CoreEventMap } from '@idraw/types';
2
2
  export declare const middlewareEventRuler = "@middleware/show-ruler";
3
- export declare const MiddlewareRuler: BoardMiddleware<Record<string, any>, CoreEvent>;
3
+ export declare const MiddlewareRuler: BoardMiddleware<Record<string, any>, CoreEventMap>;
@@ -1,3 +1,3 @@
1
- import type { BoardMiddleware, CoreEvent } from '@idraw/types';
1
+ import type { BoardMiddleware, CoreEventMap } from '@idraw/types';
2
2
  export declare const middlewareEventScale = "@middleware/scale";
3
- export declare const MiddlewareScaler: BoardMiddleware<Record<string, any>, CoreEvent>;
3
+ export declare const MiddlewareScaler: BoardMiddleware<Record<string, any>, CoreEventMap>;
@@ -0,0 +1,5 @@
1
+ import type { Element, ElementSize, ViewRectInfo, ViewScaleInfo } from '@idraw/types';
2
+ export declare function getElementViewRectInfo(elem: ElementSize, opts: {
3
+ groupQueue: Element<'group'>[];
4
+ viewScaleInfo: ViewScaleInfo;
5
+ }): ViewRectInfo;
@@ -0,0 +1,10 @@
1
+ import { calcElementViewRectInfo } from '@idraw/util';
2
+ export function getElementViewRectInfo(elem, opts) {
3
+ const { groupQueue, viewScaleInfo } = opts;
4
+ const viewRectInfo = calcElementViewRectInfo(elem, {
5
+ groupQueue,
6
+ viewScaleInfo,
7
+ range: true
8
+ });
9
+ return viewRectInfo;
10
+ }
@@ -10,6 +10,7 @@ export declare const keySelectedElementListVertexes: unique symbol;
10
10
  export declare const keySelectedElementController: unique symbol;
11
11
  export declare const keyGroupQueue: unique symbol;
12
12
  export declare const keyGroupQueueVertexesList: unique symbol;
13
+ export declare const keyIsMoving: unique symbol;
13
14
  export declare const keyDebugElemCenter: unique symbol;
14
15
  export declare const keyDebugStartVertical: unique symbol;
15
16
  export declare const keyDebugEndVertical: unique symbol;
@@ -22,3 +23,4 @@ export declare const areaBorderWidth = 1;
22
23
  export declare const wrapperColor = "#1973ba";
23
24
  export declare const lockColor = "#5b5959b5";
24
25
  export declare const controllerSize = 10;
26
+ export declare const auxiliaryColor = "#f7276e";
@@ -10,6 +10,7 @@ export const keySelectedElementListVertexes = Symbol(`${key}_selectedElementList
10
10
  export const keySelectedElementController = Symbol(`${key}_selectedElementController`);
11
11
  export const keyGroupQueue = Symbol(`${key}_groupQueue`);
12
12
  export const keyGroupQueueVertexesList = Symbol(`${key}_groupQueueVertexesList`);
13
+ export const keyIsMoving = Symbol(`${key}_isMoving`);
13
14
  export const keyDebugElemCenter = Symbol(`${key}_debug_elemCenter`);
14
15
  export const keyDebugStartVertical = Symbol(`${key}_debug_startVertical`);
15
16
  export const keyDebugEndVertical = Symbol(`${key}_debug_endVertical`);
@@ -22,3 +23,4 @@ export const areaBorderWidth = 1;
22
23
  export const wrapperColor = '#1973ba';
23
24
  export const lockColor = '#5b5959b5';
24
25
  export const controllerSize = 10;
26
+ export const auxiliaryColor = '#f7276e';
@@ -0,0 +1,7 @@
1
+ import type { ViewContext2D, ViewRectVertexes, Element, ViewScaleInfo } from '@idraw/types';
2
+ export declare function drawAuxiliaryLines(ctx: ViewContext2D, opts: {
3
+ vertexes: ViewRectVertexes;
4
+ element: Element | null;
5
+ groupQueue: Element<'group'>[];
6
+ viewScaleInfo: ViewScaleInfo;
7
+ }): void;
@@ -0,0 +1,31 @@
1
+ import { getElementViewRectInfo } from './auxiliary';
2
+ import { auxiliaryColor } from './config';
3
+ import { drawLine, drawCrossByCenter } from './draw-base';
4
+ export function drawAuxiliaryLines(ctx, opts) {
5
+ const { element, groupQueue, viewScaleInfo } = opts;
6
+ if (!element) {
7
+ return;
8
+ }
9
+ const viewRectInfo = getElementViewRectInfo(element, {
10
+ groupQueue,
11
+ viewScaleInfo
12
+ });
13
+ const lineOpts = {
14
+ borderColor: auxiliaryColor,
15
+ borderWidth: 1,
16
+ lineDash: []
17
+ };
18
+ drawLine(ctx, viewRectInfo.topLeft, viewRectInfo.topRight, lineOpts);
19
+ drawLine(ctx, viewRectInfo.topRight, viewRectInfo.bottomRight, lineOpts);
20
+ drawLine(ctx, viewRectInfo.bottomRight, viewRectInfo.bottomLeft, lineOpts);
21
+ drawLine(ctx, viewRectInfo.bottomLeft, viewRectInfo.topLeft, lineOpts);
22
+ const crossOpts = Object.assign(Object.assign({}, lineOpts), { size: 6 });
23
+ drawCrossByCenter(ctx, viewRectInfo.topLeft, crossOpts);
24
+ drawCrossByCenter(ctx, viewRectInfo.topRight, crossOpts);
25
+ drawCrossByCenter(ctx, viewRectInfo.bottomLeft, crossOpts);
26
+ drawCrossByCenter(ctx, viewRectInfo.bottomRight, crossOpts);
27
+ drawCrossByCenter(ctx, viewRectInfo.top, crossOpts);
28
+ drawCrossByCenter(ctx, viewRectInfo.right, crossOpts);
29
+ drawCrossByCenter(ctx, viewRectInfo.bottom, crossOpts);
30
+ drawCrossByCenter(ctx, viewRectInfo.left, crossOpts);
31
+ }
@@ -0,0 +1,30 @@
1
+ import type { PointSize, ViewContext2D, ViewRectVertexes } from '@idraw/types';
2
+ export declare function drawVertexes(ctx: ViewContext2D, vertexes: ViewRectVertexes, opts: {
3
+ borderColor: string;
4
+ borderWidth: number;
5
+ background: string;
6
+ lineDash: number[];
7
+ }): void;
8
+ export declare function drawLine(ctx: ViewContext2D, start: PointSize, end: PointSize, opts: {
9
+ borderColor: string;
10
+ borderWidth: number;
11
+ lineDash: number[];
12
+ }): void;
13
+ export declare function drawCircleController(ctx: ViewContext2D, circleCenter: PointSize, opts: {
14
+ borderColor: string;
15
+ borderWidth: number;
16
+ background: string;
17
+ lineDash: number[];
18
+ size: number;
19
+ }): void;
20
+ export declare function drawCrossVertexes(ctx: ViewContext2D, vertexes: ViewRectVertexes, opts: {
21
+ borderColor: string;
22
+ borderWidth: number;
23
+ lineDash: number[];
24
+ }): void;
25
+ export declare function drawCrossByCenter(ctx: ViewContext2D, center: PointSize, opts: {
26
+ size: number;
27
+ borderColor: string;
28
+ borderWidth: number;
29
+ lineDash: number[];
30
+ }): void;
@@ -0,0 +1,100 @@
1
+ export function drawVertexes(ctx, vertexes, opts) {
2
+ const { borderColor, borderWidth, background, lineDash } = opts;
3
+ ctx.setLineDash([]);
4
+ ctx.lineWidth = borderWidth;
5
+ ctx.strokeStyle = borderColor;
6
+ ctx.fillStyle = background;
7
+ ctx.setLineDash(lineDash);
8
+ ctx.beginPath();
9
+ ctx.moveTo(vertexes[0].x, vertexes[0].y);
10
+ ctx.lineTo(vertexes[1].x, vertexes[1].y);
11
+ ctx.lineTo(vertexes[2].x, vertexes[2].y);
12
+ ctx.lineTo(vertexes[3].x, vertexes[3].y);
13
+ ctx.lineTo(vertexes[0].x, vertexes[0].y);
14
+ ctx.closePath();
15
+ ctx.stroke();
16
+ ctx.fill();
17
+ }
18
+ export function drawLine(ctx, start, end, opts) {
19
+ const { borderColor, borderWidth, lineDash } = opts;
20
+ ctx.setLineDash([]);
21
+ ctx.lineWidth = borderWidth;
22
+ ctx.strokeStyle = borderColor;
23
+ ctx.setLineDash(lineDash);
24
+ ctx.beginPath();
25
+ ctx.moveTo(start.x, start.y);
26
+ ctx.lineTo(end.x, end.y);
27
+ ctx.closePath();
28
+ ctx.stroke();
29
+ }
30
+ export function drawCircleController(ctx, circleCenter, opts) {
31
+ const { size, borderColor, borderWidth, background } = opts;
32
+ const center = circleCenter;
33
+ const r = size / 2;
34
+ const a = r;
35
+ const b = r;
36
+ if (a >= 0 && b >= 0) {
37
+ if (typeof borderWidth === 'number' && borderWidth > 0) {
38
+ const ba = borderWidth / 2 + a;
39
+ const bb = borderWidth / 2 + b;
40
+ ctx.beginPath();
41
+ ctx.strokeStyle = borderColor;
42
+ ctx.lineWidth = borderWidth;
43
+ ctx.circle(center.x, center.y, ba, bb, 0, 0, 2 * Math.PI);
44
+ ctx.closePath();
45
+ ctx.stroke();
46
+ }
47
+ ctx.beginPath();
48
+ ctx.fillStyle = background;
49
+ ctx.circle(center.x, center.y, a, b, 0, 0, 2 * Math.PI);
50
+ ctx.closePath();
51
+ ctx.fill();
52
+ }
53
+ }
54
+ export function drawCrossVertexes(ctx, vertexes, opts) {
55
+ const { borderColor, borderWidth, lineDash } = opts;
56
+ ctx.setLineDash([]);
57
+ ctx.lineWidth = borderWidth;
58
+ ctx.strokeStyle = borderColor;
59
+ ctx.setLineDash(lineDash);
60
+ ctx.beginPath();
61
+ ctx.moveTo(vertexes[0].x, vertexes[0].y);
62
+ ctx.lineTo(vertexes[2].x, vertexes[2].y);
63
+ ctx.closePath();
64
+ ctx.stroke();
65
+ ctx.beginPath();
66
+ ctx.moveTo(vertexes[1].x, vertexes[1].y);
67
+ ctx.lineTo(vertexes[3].x, vertexes[3].y);
68
+ ctx.closePath();
69
+ ctx.stroke();
70
+ }
71
+ export function drawCrossByCenter(ctx, center, opts) {
72
+ const { size, borderColor, borderWidth, lineDash } = opts;
73
+ const minX = center.x - size / 2;
74
+ const maxX = center.x + size / 2;
75
+ const minY = center.y - size / 2;
76
+ const maxY = center.y + size / 2;
77
+ const vertexes = [
78
+ {
79
+ x: minX,
80
+ y: minY
81
+ },
82
+ {
83
+ x: maxX,
84
+ y: minY
85
+ },
86
+ {
87
+ x: maxX,
88
+ y: maxY
89
+ },
90
+ {
91
+ x: minX,
92
+ y: maxY
93
+ }
94
+ ];
95
+ drawCrossVertexes(ctx, vertexes, {
96
+ borderColor,
97
+ borderWidth,
98
+ lineDash
99
+ });
100
+ }
@@ -10,8 +10,11 @@ export declare function drawLockVertexesWrapper(ctx: ViewContext2D, vertexes: Vi
10
10
  controller?: ElementSizeController | null;
11
11
  }): void;
12
12
  export declare function drawSelectedElementControllersVertexes(ctx: ViewContext2D, controller: ElementSizeController | null, opts: {
13
+ hideControllers: boolean;
13
14
  viewScaleInfo: ViewScaleInfo;
14
15
  viewSizeInfo: ViewSizeInfo;
16
+ element: Element | null;
17
+ groupQueue: Element<'group'>[];
15
18
  }): void;
16
19
  export declare function drawElementListShadows(ctx: ViewContext2D, elements: Element<ElementType>[], opts?: Omit<RendererDrawElementOptions, 'loader'>): void;
17
20
  export declare function drawArea(ctx: ViewContext2D, opts: {
@@ -1,58 +1,6 @@
1
1
  import { rotateElementVertexes, calcViewPointSize, calcViewVertexes } from '@idraw/util';
2
2
  import { resizeControllerBorderWidth, areaBorderWidth, wrapperColor, selectWrapperBorderWidth, lockColor, controllerSize } from './config';
3
- function drawVertexes(ctx, vertexes, opts) {
4
- const { borderColor, borderWidth, background, lineDash } = opts;
5
- ctx.setLineDash([]);
6
- ctx.lineWidth = borderWidth;
7
- ctx.strokeStyle = borderColor;
8
- ctx.fillStyle = background;
9
- ctx.setLineDash(lineDash);
10
- ctx.beginPath();
11
- ctx.moveTo(vertexes[0].x, vertexes[0].y);
12
- ctx.lineTo(vertexes[1].x, vertexes[1].y);
13
- ctx.lineTo(vertexes[2].x, vertexes[2].y);
14
- ctx.lineTo(vertexes[3].x, vertexes[3].y);
15
- ctx.lineTo(vertexes[0].x, vertexes[0].y);
16
- ctx.closePath();
17
- ctx.stroke();
18
- ctx.fill();
19
- }
20
- function drawLine(ctx, start, end, opts) {
21
- const { borderColor, borderWidth, lineDash } = opts;
22
- ctx.setLineDash([]);
23
- ctx.lineWidth = borderWidth;
24
- ctx.strokeStyle = borderColor;
25
- ctx.setLineDash(lineDash);
26
- ctx.beginPath();
27
- ctx.moveTo(start.x, start.y);
28
- ctx.lineTo(end.x, end.y);
29
- ctx.closePath();
30
- ctx.stroke();
31
- }
32
- function drawCircleController(ctx, circleCenter, opts) {
33
- const { size, borderColor, borderWidth, background } = opts;
34
- const center = circleCenter;
35
- const r = size / 2;
36
- const a = r;
37
- const b = r;
38
- if (a >= 0 && b >= 0) {
39
- if (typeof borderWidth === 'number' && borderWidth > 0) {
40
- const ba = borderWidth / 2 + a;
41
- const bb = borderWidth / 2 + b;
42
- ctx.beginPath();
43
- ctx.strokeStyle = borderColor;
44
- ctx.lineWidth = borderWidth;
45
- ctx.circle(center.x, center.y, ba, bb, 0, 0, 2 * Math.PI);
46
- ctx.closePath();
47
- ctx.stroke();
48
- }
49
- ctx.beginPath();
50
- ctx.fillStyle = background;
51
- ctx.circle(center.x, center.y, a, b, 0, 0, 2 * Math.PI);
52
- ctx.closePath();
53
- ctx.fill();
54
- }
55
- }
3
+ import { drawVertexes, drawLine, drawCircleController, drawCrossVertexes } from './draw-base';
56
4
  export function drawHoverVertexesWrapper(ctx, vertexes, opts) {
57
5
  if (!vertexes) {
58
6
  return;
@@ -60,24 +8,6 @@ export function drawHoverVertexesWrapper(ctx, vertexes, opts) {
60
8
  const wrapperOpts = { borderColor: wrapperColor, borderWidth: 1, background: 'transparent', lineDash: [] };
61
9
  drawVertexes(ctx, calcViewVertexes(vertexes, opts), wrapperOpts);
62
10
  }
63
- function drawCrossVertexes(ctx, vertexes, opts) {
64
- const { borderColor, borderWidth, background, lineDash } = opts;
65
- ctx.setLineDash([]);
66
- ctx.lineWidth = borderWidth;
67
- ctx.strokeStyle = borderColor;
68
- ctx.fillStyle = background;
69
- ctx.setLineDash(lineDash);
70
- ctx.beginPath();
71
- ctx.moveTo(vertexes[0].x, vertexes[0].y);
72
- ctx.lineTo(vertexes[2].x, vertexes[2].y);
73
- ctx.closePath();
74
- ctx.stroke();
75
- ctx.beginPath();
76
- ctx.moveTo(vertexes[1].x, vertexes[1].y);
77
- ctx.lineTo(vertexes[3].x, vertexes[3].y);
78
- ctx.closePath();
79
- ctx.stroke();
80
- }
81
11
  export function drawLockVertexesWrapper(ctx, vertexes, opts) {
82
12
  if (!vertexes) {
83
13
  return;
@@ -102,16 +32,19 @@ export function drawSelectedElementControllersVertexes(ctx, controller, opts) {
102
32
  if (!controller) {
103
33
  return;
104
34
  }
35
+ const { hideControllers } = opts;
105
36
  const { elementWrapper, topLeft, topRight, bottomLeft, bottomRight, top, rotate } = controller;
106
37
  const wrapperOpts = { borderColor: wrapperColor, borderWidth: selectWrapperBorderWidth, background: 'transparent', lineDash: [] };
107
38
  const ctrlOpts = Object.assign(Object.assign({}, wrapperOpts), { borderWidth: resizeControllerBorderWidth, background: '#FFFFFF' });
108
- drawLine(ctx, calcViewPointSize(top.center, opts), calcViewPointSize(rotate.center, opts), Object.assign(Object.assign({}, ctrlOpts), { borderWidth: 2 }));
109
39
  drawVertexes(ctx, calcViewVertexes(elementWrapper, opts), wrapperOpts);
110
- drawVertexes(ctx, calcViewVertexes(topLeft.vertexes, opts), ctrlOpts);
111
- drawVertexes(ctx, calcViewVertexes(topRight.vertexes, opts), ctrlOpts);
112
- drawVertexes(ctx, calcViewVertexes(bottomLeft.vertexes, opts), ctrlOpts);
113
- drawVertexes(ctx, calcViewVertexes(bottomRight.vertexes, opts), ctrlOpts);
114
- drawCircleController(ctx, calcViewPointSize(rotate.center, opts), Object.assign(Object.assign({}, ctrlOpts), { size: controllerSize, borderWidth: 2 }));
40
+ if (!hideControllers) {
41
+ drawLine(ctx, calcViewPointSize(top.center, opts), calcViewPointSize(rotate.center, opts), Object.assign(Object.assign({}, ctrlOpts), { borderWidth: 2 }));
42
+ drawVertexes(ctx, calcViewVertexes(topLeft.vertexes, opts), ctrlOpts);
43
+ drawVertexes(ctx, calcViewVertexes(topRight.vertexes, opts), ctrlOpts);
44
+ drawVertexes(ctx, calcViewVertexes(bottomLeft.vertexes, opts), ctrlOpts);
45
+ drawVertexes(ctx, calcViewVertexes(bottomRight.vertexes, opts), ctrlOpts);
46
+ drawCircleController(ctx, calcViewPointSize(rotate.center, opts), Object.assign(Object.assign({}, ctrlOpts), { size: controllerSize, borderWidth: 2 }));
47
+ }
115
48
  }
116
49
  export function drawElementListShadows(ctx, elements, opts) {
117
50
  elements.forEach((elem) => {
@@ -1,5 +1,5 @@
1
- import type { CoreEvent } from '@idraw/types';
1
+ import type { CoreEventMap } from '@idraw/types';
2
2
  import type { BoardMiddleware, DeepSelectorSharedStorage } from './types';
3
3
  export declare const middlewareEventSelect: string;
4
4
  export declare const middlewareEventSelectClear: string;
5
- export declare const MiddlewareSelector: BoardMiddleware<DeepSelectorSharedStorage, CoreEvent>;
5
+ export declare const MiddlewareSelector: BoardMiddleware<DeepSelectorSharedStorage, CoreEventMap>;
@@ -1,7 +1,7 @@
1
- import { calcElementsViewInfo, calcElementVertexesInGroup, calcElementQueueVertexesQueueInGroup, calcElementSizeController, calcElementCenterFromVertexes, rotatePointInGroup, getGroupQueueFromList, findElementsFromList, findElementsFromListByPositions, deepResizeGroupElement } from '@idraw/util';
1
+ import { calcElementsViewInfo, calcElementVertexesInGroup, calcElementQueueVertexesQueueInGroup, calcElementSizeController, calcElementCenterFromVertexes, rotatePointInGroup, getGroupQueueFromList, findElementsFromList, findElementsFromListByPositions, getElementPositionFromList, deepResizeGroupElement } from '@idraw/util';
2
2
  import { drawHoverVertexesWrapper, drawLockVertexesWrapper, drawArea, drawListArea, drawGroupQueueVertexesWrappers, drawSelectedElementControllersVertexes } from './draw-wrapper';
3
3
  import { getPointTarget, resizeElement, rotateElement, getSelectedListArea, calcSelectedElementsArea, isElementInGroup, isPointInViewActiveGroup, calcMoveInGroup } from './util';
4
- import { keyActionType, keyResizeType, keyAreaStart, keyAreaEnd, keyGroupQueue, keyGroupQueueVertexesList, keyHoverElement, keyHoverElementVertexes, keySelectedElementList, keySelectedElementListVertexes, keySelectedElementController, controllerSize } from './config';
4
+ import { keyActionType, keyResizeType, keyAreaStart, keyAreaEnd, keyGroupQueue, keyGroupQueueVertexesList, keyHoverElement, keyHoverElementVertexes, keySelectedElementList, keySelectedElementListVertexes, keySelectedElementController, keyIsMoving, controllerSize } from './config';
5
5
  import { middlewareEventTextEdit } from '../text-editor';
6
6
  export const middlewareEventSelect = '@middleware/select';
7
7
  export const middlewareEventSelectClear = '@middleware/select-clear';
@@ -87,6 +87,7 @@ export const MiddlewareSelector = (opts) => {
87
87
  sharer.setSharedStorage(keySelectedElementList, []);
88
88
  sharer.setSharedStorage(keySelectedElementListVertexes, null);
89
89
  sharer.setSharedStorage(keySelectedElementController, null);
90
+ sharer.setSharedStorage(keyIsMoving, null);
90
91
  };
91
92
  clear();
92
93
  const selectCallback = ({ uuids, positions }) => {
@@ -284,6 +285,7 @@ export const MiddlewareSelector = (opts) => {
284
285
  },
285
286
  pointMove: (e) => {
286
287
  var _a, _b, _c;
288
+ sharer.setSharedStorage(keyIsMoving, true);
287
289
  const data = sharer.getActiveStorage('data');
288
290
  const elems = getActiveElements();
289
291
  const scale = sharer.getActiveStorage('scale') || 1;
@@ -388,6 +390,7 @@ export const MiddlewareSelector = (opts) => {
388
390
  },
389
391
  pointEnd(e) {
390
392
  inBusyMode = null;
393
+ sharer.setSharedStorage(keyIsMoving, false);
391
394
  const data = sharer.getActiveStorage('data');
392
395
  const resizeType = sharer.getSharedStorage(keyResizeType);
393
396
  const actionType = sharer.getSharedStorage(keyActionType);
@@ -467,7 +470,7 @@ export const MiddlewareSelector = (opts) => {
467
470
  viewer.drawFrame();
468
471
  },
469
472
  doubleClick(e) {
470
- var _a, _b, _c, _d;
473
+ var _a, _b, _c, _d, _e, _f;
471
474
  const target = getPointTarget(e.point, pointTargetBaseOptions());
472
475
  sharer.setSharedStorage(keySelectedElementController, null);
473
476
  sharer.setSharedStorage(keySelectedElementList, []);
@@ -486,6 +489,7 @@ export const MiddlewareSelector = (opts) => {
486
489
  eventHub.trigger(middlewareEventTextEdit, {
487
490
  element: target.elements[0],
488
491
  groupQueue: sharer.getSharedStorage(keyGroupQueue) || [],
492
+ position: getElementPositionFromList((_e = target.elements[0]) === null || _e === void 0 ? void 0 : _e.uuid, ((_f = sharer.getActiveStorage('data')) === null || _f === void 0 ? void 0 : _f.elements) || []),
489
493
  viewScaleInfo: sharer.getActiveViewScaleInfo()
490
494
  });
491
495
  }
@@ -507,6 +511,7 @@ export const MiddlewareSelector = (opts) => {
507
511
  const areaEnd = sharedStore[keyAreaEnd];
508
512
  const groupQueue = sharedStore[keyGroupQueue];
509
513
  const groupQueueVertexesList = sharedStore[keyGroupQueueVertexesList];
514
+ const isMoving = sharedStore[keyIsMoving];
510
515
  const drawBaseOpts = { calculator, viewScaleInfo, viewSizeInfo };
511
516
  const selectedElementController = elem
512
517
  ? calcElementSizeController(elem, {
@@ -531,7 +536,7 @@ export const MiddlewareSelector = (opts) => {
531
536
  }
532
537
  }
533
538
  if (!isLock && elem && ['select', 'drag', 'resize'].includes(actionType)) {
534
- drawSelectedElementControllersVertexes(helperContext, selectedElementController, Object.assign({}, drawBaseOpts));
539
+ drawSelectedElementControllersVertexes(helperContext, selectedElementController, Object.assign(Object.assign({}, drawBaseOpts), { element: elem, groupQueue, hideControllers: !!isMoving && actionType === 'drag' }));
535
540
  }
536
541
  }
537
542
  else {
@@ -548,7 +553,7 @@ export const MiddlewareSelector = (opts) => {
548
553
  }
549
554
  }
550
555
  if (!isLock && elem && ['select', 'drag', 'resize'].includes(actionType)) {
551
- drawSelectedElementControllersVertexes(helperContext, selectedElementController, Object.assign({}, drawBaseOpts));
556
+ drawSelectedElementControllersVertexes(helperContext, selectedElementController, Object.assign(Object.assign({}, drawBaseOpts), { element: elem, groupQueue, hideControllers: !!isMoving && actionType === 'drag' }));
552
557
  }
553
558
  else if (actionType === 'area' && areaStart && areaEnd) {
554
559
  drawArea(helperContext, { start: areaStart, end: areaEnd });
@@ -1,5 +1,5 @@
1
1
  import type { ElementSizeController } from '@idraw/types';
2
- import { keyActionType, keyResizeType, keyAreaStart, keyAreaEnd, keyGroupQueue, keyGroupQueueVertexesList, keyHoverElement, keyHoverElementVertexes, keySelectedElementList, keySelectedElementListVertexes, keySelectedElementController, keyDebugElemCenter, keyDebugEnd0, keyDebugEndHorizontal, keyDebugEndVertical, keyDebugStartHorizontal, keyDebugStartVertical } from './config';
2
+ import { keyActionType, keyResizeType, keyAreaStart, keyAreaEnd, keyGroupQueue, keyGroupQueueVertexesList, keyHoverElement, keyHoverElementVertexes, keySelectedElementList, keySelectedElementListVertexes, keySelectedElementController, keyIsMoving, keyDebugElemCenter, keyDebugEnd0, keyDebugEndHorizontal, keyDebugEndVertical, keyDebugStartHorizontal, keyDebugStartVertical } from './config';
3
3
  import { Data, ElementSize, ElementType, Element, ViewContext2D, Point, PointSize, ViewScaleInfo, ViewSizeInfo, ViewCalculator, PointWatcherEvent, BoardMiddleware, ViewRectVertexes } from '@idraw/types';
4
4
  export { Data, ElementType, Element, ElementSize, ViewContext2D, Point, PointSize, ViewScaleInfo, ViewSizeInfo, ViewCalculator, PointWatcherEvent, BoardMiddleware };
5
5
  export type ControllerStyle = ElementSize & {
@@ -31,6 +31,7 @@ export type DeepSelectorSharedStorage = {
31
31
  [keySelectedElementList]: Array<Element<ElementType>>;
32
32
  [keySelectedElementListVertexes]: ViewRectVertexes | null;
33
33
  [keySelectedElementController]: ElementSizeController | null;
34
+ [keyIsMoving]: boolean | null;
34
35
  [keyDebugElemCenter]: PointSize | null;
35
36
  [keyDebugEnd0]: PointSize | null;
36
37
  [keyDebugEndHorizontal]: PointSize | null;
@@ -1 +1 @@
1
- import { keyActionType, keyResizeType, keyAreaStart, keyAreaEnd, keyGroupQueue, keyGroupQueueVertexesList, keyHoverElement, keyHoverElementVertexes, keySelectedElementList, keySelectedElementListVertexes, keySelectedElementController, keyDebugElemCenter, keyDebugEnd0, keyDebugEndHorizontal, keyDebugEndVertical, keyDebugStartHorizontal, keyDebugStartVertical } from './config';
1
+ import { keyActionType, keyResizeType, keyAreaStart, keyAreaEnd, keyGroupQueue, keyGroupQueueVertexesList, keyHoverElement, keyHoverElementVertexes, keySelectedElementList, keySelectedElementListVertexes, keySelectedElementController, keyIsMoving, keyDebugElemCenter, keyDebugEnd0, keyDebugEndHorizontal, keyDebugEndVertical, keyDebugStartHorizontal, keyDebugStartVertical } from './config';
@@ -1,3 +1,21 @@
1
- import type { BoardMiddleware, CoreEvent } from '@idraw/types';
1
+ import type { BoardMiddleware, CoreEventMap, Element, ViewScaleInfo, ElementPosition } from '@idraw/types';
2
2
  export declare const middlewareEventTextEdit = "@middleware/text-edit";
3
- export declare const MiddlewareTextEditor: BoardMiddleware<Record<string, any>, CoreEvent>;
3
+ export declare const middlewareEventTextChange = "@middleware/text-change";
4
+ type TextEditEvent = {
5
+ element: Element<'text'>;
6
+ position: ElementPosition;
7
+ groupQueue: Element<'group'>[];
8
+ viewScaleInfo: ViewScaleInfo;
9
+ };
10
+ type TextChangeEvent = {
11
+ element: {
12
+ uuid: string;
13
+ detail: {
14
+ text: string;
15
+ };
16
+ };
17
+ position: ElementPosition;
18
+ };
19
+ type ExtendEventMap = Record<typeof middlewareEventTextEdit, TextEditEvent> & Record<typeof middlewareEventTextChange, TextChangeEvent>;
20
+ export declare const MiddlewareTextEditor: BoardMiddleware<ExtendEventMap, CoreEventMap & ExtendEventMap>;
21
+ export {};
@@ -1,14 +1,17 @@
1
1
  import { limitAngle, getDefaultElementDetailConfig } from '@idraw/util';
2
2
  export const middlewareEventTextEdit = '@middleware/text-edit';
3
+ export const middlewareEventTextChange = '@middleware/text-change';
3
4
  const defaultElementDetail = getDefaultElementDetailConfig();
4
5
  export const MiddlewareTextEditor = (opts) => {
5
6
  const { eventHub, boardContent, viewer } = opts;
6
7
  const canvas = boardContent.boardContext.canvas;
7
- const textarea = document.createElement('textarea');
8
+ const textarea = document.createElement('div');
9
+ textarea.setAttribute('contenteditable', 'true');
8
10
  const canvasWrapper = document.createElement('div');
9
11
  const container = opts.container || document.body;
10
12
  const mask = document.createElement('div');
11
13
  let activeElem = null;
14
+ let activePosition = [];
12
15
  canvasWrapper.appendChild(textarea);
13
16
  canvasWrapper.style.position = 'absolute';
14
17
  mask.appendChild(canvasWrapper);
@@ -27,6 +30,7 @@ export const MiddlewareTextEditor = (opts) => {
27
30
  const hideTextArea = () => {
28
31
  mask.style.display = 'none';
29
32
  activeElem = null;
33
+ activePosition = [];
30
34
  };
31
35
  const getCanvasRect = () => {
32
36
  const clientRect = canvas.getBoundingClientRect();
@@ -84,6 +88,23 @@ export const MiddlewareTextEditor = (opts) => {
84
88
  elemW = element.w * scale;
85
89
  elemH = element.h * scale;
86
90
  }
91
+ let justifyContent = 'center';
92
+ let alignItems = 'center';
93
+ if (detail.textAlign === 'left') {
94
+ justifyContent = 'start';
95
+ }
96
+ else if (detail.textAlign === 'right') {
97
+ justifyContent = 'end';
98
+ }
99
+ if (detail.verticalAlign === 'top') {
100
+ alignItems = 'start';
101
+ }
102
+ else if (detail.verticalAlign === 'bottom') {
103
+ alignItems = 'end';
104
+ }
105
+ textarea.style.display = 'inline-flex';
106
+ textarea.style.justifyContent = justifyContent;
107
+ textarea.style.alignItems = alignItems;
87
108
  textarea.style.position = 'absolute';
88
109
  textarea.style.left = `${elemX - 1}px`;
89
110
  textarea.style.top = `${elemY - 1}px`;
@@ -104,7 +125,7 @@ export const MiddlewareTextEditor = (opts) => {
104
125
  textarea.style.padding = '0';
105
126
  textarea.style.margin = '0';
106
127
  textarea.style.outline = 'none';
107
- textarea.value = detail.text || '';
128
+ textarea.innerText = detail.text || '';
108
129
  parent.appendChild(textarea);
109
130
  };
110
131
  const resetCanvasWrapper = () => {
@@ -122,19 +143,53 @@ export const MiddlewareTextEditor = (opts) => {
122
143
  textarea.addEventListener('click', (e) => {
123
144
  e.stopPropagation();
124
145
  });
125
- textarea.addEventListener('input', (e) => {
126
- if (activeElem) {
127
- activeElem.detail.text = e.target.value || '';
146
+ textarea.addEventListener('input', () => {
147
+ if (activeElem && activePosition) {
148
+ activeElem.detail.text = textarea.innerText || '';
149
+ eventHub.trigger(middlewareEventTextChange, {
150
+ element: {
151
+ uuid: activeElem.uuid,
152
+ detail: {
153
+ text: activeElem.detail.text
154
+ }
155
+ },
156
+ position: [...(activePosition || [])]
157
+ });
128
158
  viewer.drawFrame();
129
159
  }
130
160
  });
131
161
  textarea.addEventListener('blur', () => {
162
+ if (activeElem && activePosition) {
163
+ eventHub.trigger(middlewareEventTextChange, {
164
+ element: {
165
+ uuid: activeElem.uuid,
166
+ detail: {
167
+ text: activeElem.detail.text
168
+ }
169
+ },
170
+ position: [...activePosition]
171
+ });
172
+ }
132
173
  hideTextArea();
133
174
  });
175
+ textarea.addEventListener('keydown', (e) => {
176
+ e.stopPropagation();
177
+ });
178
+ textarea.addEventListener('keypress', (e) => {
179
+ e.stopPropagation();
180
+ });
181
+ textarea.addEventListener('keyup', (e) => {
182
+ e.stopPropagation();
183
+ });
184
+ textarea.addEventListener('wheel', (e) => {
185
+ e.stopPropagation();
186
+ e.preventDefault();
187
+ });
134
188
  const textEditCallback = (e) => {
135
189
  var _a;
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') {
190
+ if ((e === null || e === void 0 ? void 0 : e.position) && (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') {
137
191
  activeElem = e.element;
192
+ activePosition = e.position;
138
193
  }
139
194
  showTextArea(e);
140
195
  };