@idraw/core 0.4.0-alpha.4 → 0.4.0-alpha.6
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.
- package/dist/esm/index.d.ts +13 -5
- package/dist/esm/index.js +50 -15
- package/dist/esm/middleware/ruler/index.js +17 -9
- package/dist/esm/middleware/ruler/util.js +12 -4
- package/dist/esm/middleware/scaler/index.js +5 -0
- package/dist/esm/middleware/scroller/util.js +2 -2
- package/dist/esm/middleware/selector/index.js +18 -4
- package/dist/esm/middleware/text-editor/index.d.ts +3 -0
- package/dist/esm/middleware/text-editor/index.js +132 -0
- package/dist/index.global.js +392 -91
- package/dist/index.global.min.js +1 -1
- package/package.json +5 -5
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
import type { Data, PointSize, CoreOptions, BoardMiddleware, ViewSizeInfo, CoreEvent } from '@idraw/types';
|
|
1
|
+
import type { Data, PointSize, CoreOptions, BoardMiddleware, ViewSizeInfo, CoreEvent, ViewScaleInfo } from '@idraw/types';
|
|
2
2
|
export { MiddlewareSelector, middlewareEventSelect } 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
7
|
export declare class Core {
|
|
7
|
-
private
|
|
8
|
-
private _opts;
|
|
9
|
-
private _container;
|
|
10
|
-
private _canvas;
|
|
8
|
+
#private;
|
|
11
9
|
constructor(container: HTMLDivElement, opts: CoreOptions);
|
|
12
10
|
use(middleware: BoardMiddleware<any, any>): void;
|
|
13
11
|
setData(data: Data): void;
|
|
@@ -21,4 +19,14 @@ export declare class Core {
|
|
|
21
19
|
on<T extends keyof CoreEvent>(name: T, callback: (e: CoreEvent[T]) => void): void;
|
|
22
20
|
off<T extends keyof CoreEvent>(name: T, callback: (e: CoreEvent[T]) => void): void;
|
|
23
21
|
trigger<T extends keyof CoreEvent>(name: T, e: CoreEvent[T]): void;
|
|
22
|
+
getViewInfo(): {
|
|
23
|
+
viewSizeInfo: ViewSizeInfo;
|
|
24
|
+
viewScaleInfo: ViewScaleInfo;
|
|
25
|
+
};
|
|
26
|
+
refresh(): void;
|
|
27
|
+
updateViewScale(opts: {
|
|
28
|
+
scale: number;
|
|
29
|
+
offsetX: number;
|
|
30
|
+
offsetY: number;
|
|
31
|
+
}): void;
|
|
24
32
|
}
|
package/dist/esm/index.js
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var _Core_instances, _Core_board, _Core_container, _Core_initContainer;
|
|
1
13
|
import { Board } from '@idraw/board';
|
|
2
14
|
import { createBoardContexts, validateElements } from '@idraw/util';
|
|
3
15
|
import { Cursor } from './lib/cursor';
|
|
@@ -5,17 +17,20 @@ export { MiddlewareSelector, middlewareEventSelect } from './middleware/selector
|
|
|
5
17
|
export { MiddlewareScroller } from './middleware/scroller';
|
|
6
18
|
export { MiddlewareScaler, middlewareEventScale } from './middleware/scaler';
|
|
7
19
|
export { MiddlewareRuler, middlewareEventRuler } from './middleware/ruler';
|
|
20
|
+
export { MiddlewareTextEditor, middlewareEventTextEdit } from './middleware/text-editor';
|
|
8
21
|
export class Core {
|
|
9
22
|
constructor(container, opts) {
|
|
23
|
+
_Core_instances.add(this);
|
|
24
|
+
_Core_board.set(this, void 0);
|
|
25
|
+
_Core_container.set(this, void 0);
|
|
10
26
|
const { devicePixelRatio = 1, width, height } = opts;
|
|
11
|
-
this
|
|
12
|
-
this._container = container;
|
|
27
|
+
__classPrivateFieldSet(this, _Core_container, container, "f");
|
|
13
28
|
const canvas = document.createElement('canvas');
|
|
14
|
-
this
|
|
29
|
+
__classPrivateFieldGet(this, _Core_instances, "m", _Core_initContainer).call(this);
|
|
15
30
|
container.appendChild(canvas);
|
|
16
31
|
const ctx = canvas.getContext('2d');
|
|
17
32
|
const viewContent = createBoardContexts(ctx, { devicePixelRatio });
|
|
18
|
-
const board = new Board({ viewContent });
|
|
33
|
+
const board = new Board({ viewContent, container });
|
|
19
34
|
const sharer = board.getSharer();
|
|
20
35
|
sharer.setActiveViewSizeInfo({
|
|
21
36
|
width,
|
|
@@ -24,7 +39,7 @@ export class Core {
|
|
|
24
39
|
contextWidth: width,
|
|
25
40
|
contextHeight: height
|
|
26
41
|
});
|
|
27
|
-
this
|
|
42
|
+
__classPrivateFieldSet(this, _Core_board, board, "f");
|
|
28
43
|
this.resize(sharer.getActiveViewSizeInfo());
|
|
29
44
|
const eventHub = board.getEventHub();
|
|
30
45
|
new Cursor(container, {
|
|
@@ -32,39 +47,59 @@ export class Core {
|
|
|
32
47
|
});
|
|
33
48
|
}
|
|
34
49
|
use(middleware) {
|
|
35
|
-
this.
|
|
50
|
+
__classPrivateFieldGet(this, _Core_board, "f").use(middleware);
|
|
36
51
|
}
|
|
37
52
|
setData(data) {
|
|
38
53
|
validateElements((data === null || data === void 0 ? void 0 : data.elements) || []);
|
|
39
|
-
this.
|
|
54
|
+
__classPrivateFieldGet(this, _Core_board, "f").setData(data);
|
|
40
55
|
}
|
|
41
56
|
getData() {
|
|
42
|
-
return this.
|
|
57
|
+
return __classPrivateFieldGet(this, _Core_board, "f").getData();
|
|
43
58
|
}
|
|
44
59
|
scale(opts) {
|
|
45
|
-
this.
|
|
46
|
-
const viewer = this.
|
|
60
|
+
__classPrivateFieldGet(this, _Core_board, "f").scale(opts);
|
|
61
|
+
const viewer = __classPrivateFieldGet(this, _Core_board, "f").getViewer();
|
|
47
62
|
viewer.drawFrame();
|
|
48
63
|
}
|
|
49
64
|
resize(newViewSize) {
|
|
50
|
-
const
|
|
65
|
+
const board = __classPrivateFieldGet(this, _Core_board, "f");
|
|
51
66
|
const sharer = board.getSharer();
|
|
52
67
|
const viewSizeInfo = sharer.getActiveViewSizeInfo();
|
|
53
68
|
board.resize(Object.assign(Object.assign({}, viewSizeInfo), newViewSize));
|
|
54
69
|
}
|
|
55
70
|
clear() {
|
|
56
|
-
this.
|
|
71
|
+
__classPrivateFieldGet(this, _Core_board, "f").clear();
|
|
57
72
|
}
|
|
58
73
|
on(name, callback) {
|
|
59
|
-
const eventHub = this.
|
|
74
|
+
const eventHub = __classPrivateFieldGet(this, _Core_board, "f").getEventHub();
|
|
60
75
|
eventHub.on(name, callback);
|
|
61
76
|
}
|
|
62
77
|
off(name, callback) {
|
|
63
|
-
const eventHub = this.
|
|
78
|
+
const eventHub = __classPrivateFieldGet(this, _Core_board, "f").getEventHub();
|
|
64
79
|
eventHub.off(name, callback);
|
|
65
80
|
}
|
|
66
81
|
trigger(name, e) {
|
|
67
|
-
const eventHub = this.
|
|
82
|
+
const eventHub = __classPrivateFieldGet(this, _Core_board, "f").getEventHub();
|
|
68
83
|
eventHub.trigger(name, e);
|
|
69
84
|
}
|
|
85
|
+
getViewInfo() {
|
|
86
|
+
const board = __classPrivateFieldGet(this, _Core_board, "f");
|
|
87
|
+
const sharer = board.getSharer();
|
|
88
|
+
const viewSizeInfo = sharer.getActiveViewSizeInfo();
|
|
89
|
+
const viewScaleInfo = sharer.getActiveViewScaleInfo();
|
|
90
|
+
return {
|
|
91
|
+
viewSizeInfo,
|
|
92
|
+
viewScaleInfo
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
refresh() {
|
|
96
|
+
__classPrivateFieldGet(this, _Core_board, "f").getViewer().drawFrame();
|
|
97
|
+
}
|
|
98
|
+
updateViewScale(opts) {
|
|
99
|
+
__classPrivateFieldGet(this, _Core_board, "f").updateViewScaleInfo(opts);
|
|
100
|
+
}
|
|
70
101
|
}
|
|
102
|
+
_Core_board = new WeakMap(), _Core_container = new WeakMap(), _Core_instances = new WeakSet(), _Core_initContainer = function _Core_initContainer() {
|
|
103
|
+
const container = __classPrivateFieldGet(this, _Core_container, "f");
|
|
104
|
+
container.style.position = 'relative';
|
|
105
|
+
};
|
|
@@ -5,10 +5,16 @@ export const MiddlewareRuler = (opts) => {
|
|
|
5
5
|
const key = 'RULE';
|
|
6
6
|
const { viewContent, viewer, eventHub } = opts;
|
|
7
7
|
const { helperContext, underContext } = viewContent;
|
|
8
|
-
let
|
|
8
|
+
let show = true;
|
|
9
|
+
let showGrid = true;
|
|
9
10
|
eventHub.on(middlewareEventRuler, (e) => {
|
|
10
11
|
if (typeof (e === null || e === void 0 ? void 0 : e.show) === 'boolean') {
|
|
11
|
-
|
|
12
|
+
show = e.show;
|
|
13
|
+
}
|
|
14
|
+
if (typeof (e === null || e === void 0 ? void 0 : e.showGrid) === 'boolean') {
|
|
15
|
+
showGrid = e.showGrid;
|
|
16
|
+
}
|
|
17
|
+
if (typeof (e === null || e === void 0 ? void 0 : e.show) === 'boolean' || typeof (e === null || e === void 0 ? void 0 : e.showGrid) === 'boolean') {
|
|
12
18
|
viewer.drawFrame();
|
|
13
19
|
}
|
|
14
20
|
});
|
|
@@ -16,7 +22,7 @@ export const MiddlewareRuler = (opts) => {
|
|
|
16
22
|
mode: key,
|
|
17
23
|
isDefault: true,
|
|
18
24
|
beforeDrawFrame: ({ snapshot }) => {
|
|
19
|
-
if (
|
|
25
|
+
if (show === true) {
|
|
20
26
|
const viewScaleInfo = getViewScaleInfoFromSnapshot(snapshot);
|
|
21
27
|
const viewSizeInfo = getViewSizeInfoFromSnapshot(snapshot);
|
|
22
28
|
drawRulerBackground(helperContext, { viewScaleInfo, viewSizeInfo });
|
|
@@ -24,12 +30,14 @@ export const MiddlewareRuler = (opts) => {
|
|
|
24
30
|
drawXRuler(helperContext, { scaleList: xList });
|
|
25
31
|
const yList = calcYRulerScaleList({ viewScaleInfo, viewSizeInfo });
|
|
26
32
|
drawYRuler(helperContext, { scaleList: yList });
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
+
if (showGrid === true) {
|
|
34
|
+
drawUnderGrid(underContext, {
|
|
35
|
+
xList,
|
|
36
|
+
yList,
|
|
37
|
+
viewScaleInfo,
|
|
38
|
+
viewSizeInfo
|
|
39
|
+
});
|
|
40
|
+
}
|
|
33
41
|
}
|
|
34
42
|
}
|
|
35
43
|
};
|
|
@@ -7,14 +7,15 @@ const textColor = '#00000080';
|
|
|
7
7
|
const fontFamily = 'monospace';
|
|
8
8
|
const fontSize = 10;
|
|
9
9
|
const fontWeight = 100;
|
|
10
|
-
const gridColor = '#
|
|
11
|
-
const gridKeyColor = '#
|
|
10
|
+
const gridColor = '#AAAAAA20';
|
|
11
|
+
const gridKeyColor = '#AAAAAA40';
|
|
12
|
+
const lineSize = 1;
|
|
12
13
|
function calcRulerScaleList(opts) {
|
|
13
14
|
const { scale, viewLength, viewOffset } = opts;
|
|
14
15
|
const list = [];
|
|
15
16
|
let rulerUnit = 10;
|
|
16
17
|
rulerUnit = formatNumber(rulerUnit / scale, { decimalPlaces: 0 });
|
|
17
|
-
rulerUnit = Math.max(
|
|
18
|
+
rulerUnit = Math.max(10, Math.min(rulerUnit, 1000));
|
|
18
19
|
const rulerKeyUnit = rulerUnit * 10;
|
|
19
20
|
const rulerSubKeyUnit = rulerUnit * 5;
|
|
20
21
|
let index = 0;
|
|
@@ -77,6 +78,8 @@ export function drawXRuler(ctx, opts) {
|
|
|
77
78
|
ctx.moveTo(item.position, scaleDrawStart);
|
|
78
79
|
ctx.lineTo(item.position, item.isKeyNum ? keyScaleDrawEnd : item.isSubKeyNum ? subKeyScaleDrawEnd : scaleDrawEnd);
|
|
79
80
|
ctx.closePath();
|
|
81
|
+
ctx.lineWidth = lineSize;
|
|
82
|
+
ctx.setLineDash([]);
|
|
80
83
|
ctx.fillStyle = scaleColor;
|
|
81
84
|
ctx.stroke();
|
|
82
85
|
if (item.isKeyNum) {
|
|
@@ -108,6 +111,8 @@ export function drawYRuler(ctx, opts) {
|
|
|
108
111
|
ctx.lineTo(item.isKeyNum ? keyScaleDrawEnd : item.isSubKeyNum ? subKeyScaleDrawEnd : scaleDrawEnd, item.position);
|
|
109
112
|
ctx.closePath();
|
|
110
113
|
ctx.fillStyle = scaleColor;
|
|
114
|
+
ctx.lineWidth = lineSize;
|
|
115
|
+
ctx.setLineDash([]);
|
|
111
116
|
ctx.stroke();
|
|
112
117
|
if (item.showNum === true) {
|
|
113
118
|
const textX = fontStart;
|
|
@@ -140,6 +145,8 @@ export function drawRulerBackground(ctx, opts) {
|
|
|
140
145
|
ctx.closePath();
|
|
141
146
|
ctx.fillStyle = background;
|
|
142
147
|
ctx.fill();
|
|
148
|
+
ctx.lineWidth = lineSize;
|
|
149
|
+
ctx.setLineDash([]);
|
|
143
150
|
ctx.strokeStyle = borderColor;
|
|
144
151
|
ctx.stroke();
|
|
145
152
|
}
|
|
@@ -157,8 +164,9 @@ export function drawUnderGrid(ctx, opts) {
|
|
|
157
164
|
else {
|
|
158
165
|
ctx.strokeStyle = gridColor;
|
|
159
166
|
}
|
|
160
|
-
ctx.lineWidth = 1;
|
|
161
167
|
ctx.closePath();
|
|
168
|
+
ctx.lineWidth = lineSize;
|
|
169
|
+
ctx.setLineDash([]);
|
|
162
170
|
ctx.stroke();
|
|
163
171
|
}
|
|
164
172
|
for (let i = 0; i < yList.length; i++) {
|
|
@@ -3,6 +3,8 @@ export const middlewareEventScale = '@middleware/scale';
|
|
|
3
3
|
export const MiddlewareScaler = (opts) => {
|
|
4
4
|
const key = 'SCALE';
|
|
5
5
|
const { viewer, sharer, eventHub } = opts;
|
|
6
|
+
const maxScale = 50;
|
|
7
|
+
const minScale = 0.05;
|
|
6
8
|
return {
|
|
7
9
|
mode: key,
|
|
8
10
|
isDefault: true,
|
|
@@ -16,6 +18,9 @@ export const MiddlewareScaler = (opts) => {
|
|
|
16
18
|
else if (deltaY > 0) {
|
|
17
19
|
newScaleNum = scale * 0.9;
|
|
18
20
|
}
|
|
21
|
+
if (newScaleNum < minScale || newScaleNum > maxScale) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
19
24
|
const { moveX, moveY } = viewer.scale({ scale: newScaleNum, point });
|
|
20
25
|
viewer.scroll({ moveX, moveY });
|
|
21
26
|
viewer.drawFrame();
|
|
@@ -49,11 +49,11 @@ function calcScrollerInfo(viewScaleInfo, viewSizeInfo) {
|
|
|
49
49
|
const lineSize = scrollerLineWidth;
|
|
50
50
|
let xSize = 0;
|
|
51
51
|
let ySize = 0;
|
|
52
|
-
xSize = Math.max(sliderMinSize, width - (Math.abs(offsetLeft) + Math.abs(offsetRight)));
|
|
52
|
+
xSize = Math.max(sliderMinSize, width - lineSize * 2 - (Math.abs(offsetLeft) + Math.abs(offsetRight)));
|
|
53
53
|
if (xSize >= width) {
|
|
54
54
|
xSize = width;
|
|
55
55
|
}
|
|
56
|
-
ySize = Math.max(sliderMinSize, height - (Math.abs(offsetTop) + Math.abs(offsetBottom)));
|
|
56
|
+
ySize = Math.max(sliderMinSize, height - lineSize * 2 - (Math.abs(offsetTop) + Math.abs(offsetBottom)));
|
|
57
57
|
if (ySize >= height) {
|
|
58
58
|
ySize = height;
|
|
59
59
|
}
|
|
@@ -1,17 +1,24 @@
|
|
|
1
|
-
import { calcElementsViewInfo, calcElementVertexesInGroup, calcElementQueueVertexesQueueInGroup, calcElementSizeController, rotatePointInGroup, getGroupQueueFromList, findElementsFromList } from '@idraw/util';
|
|
1
|
+
import { calcElementsViewInfo, calcElementVertexesInGroup, calcElementQueueVertexesQueueInGroup, calcElementSizeController, rotatePointInGroup, getGroupQueueFromList, findElementsFromList, findElementsFromListByPositions } from '@idraw/util';
|
|
2
2
|
import { drawHoverVertexesWrapper, drawArea, drawListArea, drawGroupQueueVertexesWrappers, drawSelectedElementControllersVertexes } from './draw-wrapper';
|
|
3
3
|
import { getPointTarget, resizeElement, getSelectedListArea, calcSelectedElementsArea, isElementInGroup, isPointInViewActiveGroup, calcMoveInGroup } from './util';
|
|
4
4
|
import { key, keyActionType, keyResizeType, keyAreaStart, keyAreaEnd, keyGroupQueue, keyGroupQueueVertexesList, keyHoverElement, keyHoverElementVertexes, keySelectedElementList, keySelectedElementListVertexes, keySelectedElementController } from './config';
|
|
5
|
+
import { middlewareEventTextEdit } from '../text-editor';
|
|
5
6
|
export const middlewareEventSelect = '@middleware/select';
|
|
6
7
|
export const MiddlewareSelector = (opts) => {
|
|
7
8
|
const { viewer, sharer, viewContent, calculator, eventHub } = opts;
|
|
8
9
|
const { helperContext } = viewContent;
|
|
9
10
|
let prevPoint = null;
|
|
10
11
|
let inBusyMode = null;
|
|
11
|
-
eventHub.on(middlewareEventSelect, ({ uuids }) => {
|
|
12
|
+
eventHub.on(middlewareEventSelect, ({ uuids, positions }) => {
|
|
13
|
+
let elements = [];
|
|
12
14
|
const actionType = sharer.getSharedStorage(keyActionType);
|
|
13
15
|
const data = sharer.getActiveStorage('data');
|
|
14
|
-
|
|
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
|
+
}
|
|
15
22
|
let needRefresh = false;
|
|
16
23
|
if (!actionType && elements.length === 1) {
|
|
17
24
|
sharer.setSharedStorage(keyActionType, 'select');
|
|
@@ -385,7 +392,7 @@ export const MiddlewareSelector = (opts) => {
|
|
|
385
392
|
viewer.drawFrame();
|
|
386
393
|
},
|
|
387
394
|
doubleClick(e) {
|
|
388
|
-
var _a;
|
|
395
|
+
var _a, _b;
|
|
389
396
|
const target = getPointTarget(e.point, pointTargetBaseOptions());
|
|
390
397
|
if (target.elements.length === 1 && ((_a = target.elements[0]) === null || _a === void 0 ? void 0 : _a.type) === 'group') {
|
|
391
398
|
const pushResult = pushGroupQueue(target.elements[0]);
|
|
@@ -395,6 +402,13 @@ export const MiddlewareSelector = (opts) => {
|
|
|
395
402
|
return;
|
|
396
403
|
}
|
|
397
404
|
}
|
|
405
|
+
else if (target.elements.length === 1 && ((_b = target.elements[0]) === null || _b === void 0 ? void 0 : _b.type) === 'text') {
|
|
406
|
+
eventHub.trigger(middlewareEventTextEdit, {
|
|
407
|
+
element: target.elements[0],
|
|
408
|
+
groupQueue: sharer.getSharedStorage(keyGroupQueue) || [],
|
|
409
|
+
viewScaleInfo: sharer.getActiveViewScaleInfo()
|
|
410
|
+
});
|
|
411
|
+
}
|
|
398
412
|
sharer.setSharedStorage(keyActionType, null);
|
|
399
413
|
},
|
|
400
414
|
beforeDrawFrame({ snapshot }) {
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { limitAngle, getDefaultElementDetailConfig } from '@idraw/util';
|
|
2
|
+
export const middlewareEventTextEdit = '@middleware/text-edit';
|
|
3
|
+
const defaultElementDetail = getDefaultElementDetailConfig();
|
|
4
|
+
export const MiddlewareTextEditor = (opts) => {
|
|
5
|
+
const key = 'SELECT';
|
|
6
|
+
const { eventHub, viewContent, viewer } = opts;
|
|
7
|
+
const canvas = viewContent.boardContext.canvas;
|
|
8
|
+
const textarea = document.createElement('textarea');
|
|
9
|
+
const canvasWrapper = document.createElement('div');
|
|
10
|
+
const container = opts.container || document.body;
|
|
11
|
+
const mask = document.createElement('div');
|
|
12
|
+
let activeElem = null;
|
|
13
|
+
canvasWrapper.appendChild(textarea);
|
|
14
|
+
canvasWrapper.style.position = 'absolute';
|
|
15
|
+
mask.appendChild(canvasWrapper);
|
|
16
|
+
mask.style.position = 'fixed';
|
|
17
|
+
mask.style.top = '0';
|
|
18
|
+
mask.style.bottom = '0';
|
|
19
|
+
mask.style.left = '0';
|
|
20
|
+
mask.style.right = '0';
|
|
21
|
+
mask.style.display = 'none';
|
|
22
|
+
container.appendChild(mask);
|
|
23
|
+
const showTextArea = (e) => {
|
|
24
|
+
resetCanvasWrapper();
|
|
25
|
+
resetTextArea(e);
|
|
26
|
+
mask.style.display = 'block';
|
|
27
|
+
};
|
|
28
|
+
const hideTextArea = () => {
|
|
29
|
+
mask.style.display = 'none';
|
|
30
|
+
activeElem = null;
|
|
31
|
+
};
|
|
32
|
+
const getCanvasRect = () => {
|
|
33
|
+
const clientRect = canvas.getBoundingClientRect();
|
|
34
|
+
const { left, top, width, height } = clientRect;
|
|
35
|
+
return { left, top, width, height };
|
|
36
|
+
};
|
|
37
|
+
const createBox = (opts) => {
|
|
38
|
+
const { size, parent } = opts;
|
|
39
|
+
const div = document.createElement('div');
|
|
40
|
+
const { x, y, w, h } = size;
|
|
41
|
+
const angle = limitAngle(size.angle || 0);
|
|
42
|
+
div.style.position = 'absolute';
|
|
43
|
+
div.style.left = `${x}px`;
|
|
44
|
+
div.style.top = `${y}px`;
|
|
45
|
+
div.style.width = `${w}px`;
|
|
46
|
+
div.style.height = `${h}px`;
|
|
47
|
+
div.style.transform = `rotate(${angle}deg)`;
|
|
48
|
+
parent.appendChild(div);
|
|
49
|
+
return div;
|
|
50
|
+
};
|
|
51
|
+
const resetTextArea = (e) => {
|
|
52
|
+
const { viewScaleInfo, element, groupQueue } = e;
|
|
53
|
+
const { scale, offsetTop, offsetLeft } = viewScaleInfo;
|
|
54
|
+
if (canvasWrapper.children) {
|
|
55
|
+
Array.from(canvasWrapper.children).forEach((child) => {
|
|
56
|
+
child.remove();
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
let parent = canvasWrapper;
|
|
60
|
+
for (let i = 0; i < groupQueue.length; i++) {
|
|
61
|
+
const group = groupQueue[i];
|
|
62
|
+
const { x, y, w, h } = group;
|
|
63
|
+
const angle = limitAngle(group.angle || 0);
|
|
64
|
+
const size = {
|
|
65
|
+
x: x * scale,
|
|
66
|
+
y: y * scale,
|
|
67
|
+
w: w * scale,
|
|
68
|
+
h: h * scale,
|
|
69
|
+
angle
|
|
70
|
+
};
|
|
71
|
+
if (i === 0) {
|
|
72
|
+
size.x += offsetLeft;
|
|
73
|
+
size.y += offsetTop;
|
|
74
|
+
}
|
|
75
|
+
parent = createBox({ size, parent });
|
|
76
|
+
}
|
|
77
|
+
const detail = Object.assign(Object.assign({}, defaultElementDetail), element.detail);
|
|
78
|
+
textarea.style.position = 'absolute';
|
|
79
|
+
textarea.style.left = `${element.x * scale}px`;
|
|
80
|
+
textarea.style.top = `${element.y * scale}px`;
|
|
81
|
+
textarea.style.width = `${element.w * scale}px`;
|
|
82
|
+
textarea.style.height = `${element.h * scale}px`;
|
|
83
|
+
textarea.style.transform = `rotate(${limitAngle(element.angle || 0)}deg)`;
|
|
84
|
+
textarea.style.border = 'none';
|
|
85
|
+
textarea.style.resize = 'none';
|
|
86
|
+
textarea.style.overflow = 'hidden';
|
|
87
|
+
textarea.style.wordBreak = 'break-all';
|
|
88
|
+
textarea.style.background = '#FFFFFF';
|
|
89
|
+
textarea.style.color = '#333333';
|
|
90
|
+
textarea.style.fontSize = `${detail.fontSize * scale}px`;
|
|
91
|
+
textarea.style.lineHeight = `${detail.lineHeight * scale}px`;
|
|
92
|
+
textarea.style.fontFamily = detail.fontFamily;
|
|
93
|
+
textarea.style.fontWeight = `${detail.fontWeight}`;
|
|
94
|
+
textarea.value = detail.text || '';
|
|
95
|
+
parent.appendChild(textarea);
|
|
96
|
+
};
|
|
97
|
+
const resetCanvasWrapper = () => {
|
|
98
|
+
const { left, top, width, height } = getCanvasRect();
|
|
99
|
+
canvasWrapper.style.position = 'absolute';
|
|
100
|
+
canvasWrapper.style.overflow = 'hidden';
|
|
101
|
+
canvasWrapper.style.top = `${top}px`;
|
|
102
|
+
canvasWrapper.style.left = `${left}px`;
|
|
103
|
+
canvasWrapper.style.width = `${width}px`;
|
|
104
|
+
canvasWrapper.style.height = `${height}px`;
|
|
105
|
+
};
|
|
106
|
+
mask.addEventListener('click', () => {
|
|
107
|
+
hideTextArea();
|
|
108
|
+
});
|
|
109
|
+
textarea.addEventListener('click', (e) => {
|
|
110
|
+
e.stopPropagation();
|
|
111
|
+
});
|
|
112
|
+
textarea.addEventListener('input', (e) => {
|
|
113
|
+
if (activeElem) {
|
|
114
|
+
activeElem.detail.text = e.target.value || '';
|
|
115
|
+
viewer.drawFrame();
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
textarea.addEventListener('blur', () => {
|
|
119
|
+
hideTextArea();
|
|
120
|
+
});
|
|
121
|
+
eventHub.on(middlewareEventTextEdit, (e) => {
|
|
122
|
+
var _a;
|
|
123
|
+
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') {
|
|
124
|
+
activeElem = e.element;
|
|
125
|
+
}
|
|
126
|
+
showTextArea(e);
|
|
127
|
+
});
|
|
128
|
+
return {
|
|
129
|
+
mode: key,
|
|
130
|
+
isDefault: true
|
|
131
|
+
};
|
|
132
|
+
};
|