@idraw/util 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,20 +1,20 @@
1
- export { delay, compose, throttle } from './lib/time';
2
- export { downloadImageFromCanvas, parseFileToBase64, pickFile, parseFileToText } from './lib/file';
1
+ export { delay, compose, throttle, debounce } from './lib/time';
2
+ export { downloadImageFromCanvas, parseFileToBase64, pickFile, parseFileToText, downloadFileFromText } from './lib/file';
3
3
  export { toColorHexStr, toColorHexNum, isColorStr, colorNameToHex, colorToCSS, colorToLinearGradientCSS, mergeHexColorAlpha } from './lib/color';
4
4
  export { createUUID, isAssetId, createAssetId } from './lib/uuid';
5
- export { deepClone, sortDataAsserts } from './lib/data';
5
+ export { deepClone, sortDataAsserts, deepCloneElement, filterCompactData } from './lib/data';
6
6
  export { istype } from './lib/istype';
7
7
  export { loadImage, loadSVG, loadHTML } from './lib/load';
8
8
  export { is } from './lib/is';
9
9
  export { check } from './lib/check';
10
- export { createViewContent, createContext2D, createOffscreenContext2D } from './lib/canvas';
10
+ export { createBoardContent, createContext2D, createOffscreenContext2D } from './lib/canvas';
11
11
  export { EventEmitter } from './lib/event';
12
12
  export { calcDistance, calcSpeed, equalPoint, equalTouchPoint, vaildPoint, vaildTouchPoint, getCenterFromTwoPoints } from './lib/point';
13
13
  export { Store } from './lib/store';
14
14
  export { getViewScaleInfoFromSnapshot, getViewSizeInfoFromSnapshot } from './lib/middleware';
15
15
  export { Context2D } from './lib/context2d';
16
16
  export { rotateElement, parseRadianToAngle, parseAngleToRadian, rotateElementVertexes, getElementRotateVertexes, calcElementCenter, calcElementCenterFromVertexes, rotatePointInGroup, limitAngle } from './lib/rotate';
17
- export { getSelectedElementUUIDs, validateElements, calcElementsContextSize, calcElementsViewInfo, getElemenetsAssetIds, findElementFromList, findElementsFromList, findElementFromListByPosition, findElementsFromListByPositions, getGroupQueueFromList, getElementSize, mergeElementAsset, filterElementAsset, isResourceElement, getElementPositionFromList } from './lib/element';
17
+ export { getSelectedElementUUIDs, validateElements, calcElementsContextSize, calcElementsViewInfo, getElemenetsAssetIds, findElementFromList, findElementsFromList, findElementFromListByPosition, findElementQueueFromListByPosition, findElementsFromListByPositions, getGroupQueueFromList, getElementSize, mergeElementAsset, filterElementAsset, isResourceElement, getElementPositionFromList, calcElementListSize } from './lib/element';
18
18
  export { checkRectIntersect } from './lib/rect';
19
19
  export { viewScale, viewScroll, calcViewElementSize, calcViewPointSize, calcViewVertexes, isViewPointInElement, getViewPointAtElement, isElementInView, calcViewScaleInfo } from './lib/view-calc';
20
20
  export { rotatePoint, rotateVertexes, rotateByCenter } from './lib/rotate';
@@ -28,3 +28,5 @@ export { matrixToAngle, matrixToRadian } from './lib/matrix';
28
28
  export { getDefaultElementDetailConfig, getDefaultElementRectDetail } from './lib/config';
29
29
  export { calcViewBoxSize } from './lib/view-box';
30
30
  export { createElement, insertElementToListByPosition, deleteElementInListByPosition, deleteElementInList, moveElementPosition, updateElementInList } from './lib/handle-element';
31
+ export { deepResizeGroupElement } from './lib/resize-element';
32
+ export { calcViewCenterContent, calcViewCenter } from './lib/view-content';
package/dist/esm/index.js CHANGED
@@ -1,20 +1,20 @@
1
- export { delay, compose, throttle } from './lib/time';
2
- export { downloadImageFromCanvas, parseFileToBase64, pickFile, parseFileToText } from './lib/file';
1
+ export { delay, compose, throttle, debounce } from './lib/time';
2
+ export { downloadImageFromCanvas, parseFileToBase64, pickFile, parseFileToText, downloadFileFromText } from './lib/file';
3
3
  export { toColorHexStr, toColorHexNum, isColorStr, colorNameToHex, colorToCSS, colorToLinearGradientCSS, mergeHexColorAlpha } from './lib/color';
4
4
  export { createUUID, isAssetId, createAssetId } from './lib/uuid';
5
- export { deepClone, sortDataAsserts } from './lib/data';
5
+ export { deepClone, sortDataAsserts, deepCloneElement, filterCompactData } from './lib/data';
6
6
  export { istype } from './lib/istype';
7
7
  export { loadImage, loadSVG, loadHTML } from './lib/load';
8
8
  export { is } from './lib/is';
9
9
  export { check } from './lib/check';
10
- export { createViewContent, createContext2D, createOffscreenContext2D } from './lib/canvas';
10
+ export { createBoardContent, createContext2D, createOffscreenContext2D } from './lib/canvas';
11
11
  export { EventEmitter } from './lib/event';
12
12
  export { calcDistance, calcSpeed, equalPoint, equalTouchPoint, vaildPoint, vaildTouchPoint, getCenterFromTwoPoints } from './lib/point';
13
13
  export { Store } from './lib/store';
14
14
  export { getViewScaleInfoFromSnapshot, getViewSizeInfoFromSnapshot } from './lib/middleware';
15
15
  export { Context2D } from './lib/context2d';
16
16
  export { rotateElement, parseRadianToAngle, parseAngleToRadian, rotateElementVertexes, getElementRotateVertexes, calcElementCenter, calcElementCenterFromVertexes, rotatePointInGroup, limitAngle } from './lib/rotate';
17
- export { getSelectedElementUUIDs, validateElements, calcElementsContextSize, calcElementsViewInfo, getElemenetsAssetIds, findElementFromList, findElementsFromList, findElementFromListByPosition, findElementsFromListByPositions, getGroupQueueFromList, getElementSize, mergeElementAsset, filterElementAsset, isResourceElement, getElementPositionFromList } from './lib/element';
17
+ export { getSelectedElementUUIDs, validateElements, calcElementsContextSize, calcElementsViewInfo, getElemenetsAssetIds, findElementFromList, findElementsFromList, findElementFromListByPosition, findElementQueueFromListByPosition, findElementsFromListByPositions, getGroupQueueFromList, getElementSize, mergeElementAsset, filterElementAsset, isResourceElement, getElementPositionFromList, calcElementListSize } from './lib/element';
18
18
  export { checkRectIntersect } from './lib/rect';
19
19
  export { viewScale, viewScroll, calcViewElementSize, calcViewPointSize, calcViewVertexes, isViewPointInElement, getViewPointAtElement, isElementInView, calcViewScaleInfo } from './lib/view-calc';
20
20
  export { rotatePoint, rotateVertexes, rotateByCenter } from './lib/rotate';
@@ -28,3 +28,5 @@ export { matrixToAngle, matrixToRadian } from './lib/matrix';
28
28
  export { getDefaultElementDetailConfig, getDefaultElementRectDetail } from './lib/config';
29
29
  export { calcViewBoxSize } from './lib/view-box';
30
30
  export { createElement, insertElementToListByPosition, deleteElementInListByPosition, deleteElementInList, moveElementPosition, updateElementInList } from './lib/handle-element';
31
+ export { deepResizeGroupElement } from './lib/resize-element';
32
+ export { calcViewCenterContent, calcViewCenter } from './lib/view-content';
@@ -1,4 +1,4 @@
1
- import type { ViewContent } from '@idraw/types';
1
+ import type { BoardContent, ViewContext2D } from '@idraw/types';
2
2
  import { Context2D } from './context2d';
3
3
  export declare function createContext2D(opts: {
4
4
  ctx?: CanvasRenderingContext2D;
@@ -11,9 +11,14 @@ export declare function createOffscreenContext2D(opts: {
11
11
  height: number;
12
12
  devicePixelRatio: number;
13
13
  }): Context2D;
14
- export declare function createViewContent(canvas: HTMLCanvasElement, opts: {
14
+ export declare function createBoardContent(canvas: HTMLCanvasElement, opts: {
15
15
  width: number;
16
16
  height: number;
17
17
  devicePixelRatio: number;
18
18
  offscreen?: boolean;
19
- }): ViewContent;
19
+ createCustomContext2D?: (opts: {
20
+ width: number;
21
+ height: number;
22
+ devicePixelRatio: number;
23
+ }) => ViewContext2D;
24
+ }): BoardContent;
@@ -22,15 +22,39 @@ export function createOffscreenContext2D(opts) {
22
22
  });
23
23
  return context2d;
24
24
  }
25
- export function createViewContent(canvas, opts) {
26
- const { width, height, devicePixelRatio, offscreen } = opts;
25
+ export function createBoardContent(canvas, opts) {
26
+ const { width, height, devicePixelRatio, offscreen, createCustomContext2D } = opts;
27
27
  const ctxOpts = {
28
28
  width,
29
29
  height,
30
30
  devicePixelRatio
31
31
  };
32
+ const ctx = canvas.getContext('2d');
33
+ if (createCustomContext2D) {
34
+ const viewContext = createCustomContext2D(ctxOpts);
35
+ const helperContext = createCustomContext2D(ctxOpts);
36
+ const underContext = createCustomContext2D(ctxOpts);
37
+ const boardContext = createContext2D(Object.assign({ ctx }, ctxOpts));
38
+ const drawView = () => {
39
+ const { width: w, height: h } = viewContext.$getSize();
40
+ boardContext.clearRect(0, 0, w, h);
41
+ boardContext.drawImage(underContext.canvas, 0, 0, w, h);
42
+ boardContext.drawImage(viewContext.canvas, 0, 0, w, h);
43
+ boardContext.drawImage(helperContext.canvas, 0, 0, w, h);
44
+ underContext.clearRect(0, 0, w, h);
45
+ viewContext.clearRect(0, 0, w, h);
46
+ helperContext.clearRect(0, 0, w, h);
47
+ };
48
+ const content = {
49
+ underContext,
50
+ viewContext,
51
+ helperContext,
52
+ boardContext,
53
+ drawView
54
+ };
55
+ return content;
56
+ }
32
57
  if (offscreen === true) {
33
- const ctx = canvas.getContext('2d');
34
58
  const viewContext = createOffscreenContext2D(ctxOpts);
35
59
  const helperContext = createOffscreenContext2D(ctxOpts);
36
60
  const underContext = createOffscreenContext2D(ctxOpts);
@@ -55,7 +79,6 @@ export function createViewContent(canvas, opts) {
55
79
  return content;
56
80
  }
57
81
  else {
58
- const ctx = canvas.getContext('2d');
59
82
  const viewContext = createContext2D(ctxOpts);
60
83
  const helperContext = createContext2D(ctxOpts);
61
84
  const underContext = createContext2D(ctxOpts);
@@ -1,14 +1,9 @@
1
- import type { ViewScaleInfo, DefaultElementDetailConfig, ElementRectDetail, ElementCircleDetail, ElementTextDetail, ElementSVGDetail, ElementImageDetail, ElementGroupDetail } from '@idraw/types';
1
+ import type { DefaultElementDetailConfig, ElementSize, ElementRectDetail, ElementCircleDetail, ElementTextDetail, ElementSVGDetail, ElementImageDetail, ElementGroupDetail } from '@idraw/types';
2
+ export declare const defaultText = "Text Element";
2
3
  export declare function getDefaultElementDetailConfig(): DefaultElementDetailConfig;
3
4
  export declare function getDefaultElementRectDetail(): ElementRectDetail;
4
- export declare function getDefaultElementCircleDetail(opts: {
5
- radius: number;
6
- }): ElementCircleDetail;
7
- export declare function getDefaultElementTextDetail(opts?: {
8
- viewScaleInfo: ViewScaleInfo;
9
- }): ElementTextDetail;
5
+ export declare function getDefaultElementCircleDetail(): ElementCircleDetail;
6
+ export declare function getDefaultElementTextDetail(elementSize: ElementSize): ElementTextDetail;
10
7
  export declare function getDefaultElementSVGDetail(): ElementSVGDetail;
11
8
  export declare function getDefaultElementImageDetail(): ElementImageDetail;
12
- export declare function getDefaultElementGroupDetail(opts?: {
13
- viewScaleInfo: ViewScaleInfo;
14
- }): ElementGroupDetail;
9
+ export declare function getDefaultElementGroupDetail(): ElementGroupDetail;
@@ -1,3 +1,4 @@
1
+ export const defaultText = 'Text Element';
1
2
  export function getDefaultElementDetailConfig() {
2
3
  const config = {
3
4
  boxSizing: 'border-box',
@@ -27,24 +28,22 @@ export function getDefaultElementRectDetail() {
27
28
  };
28
29
  return detail;
29
30
  }
30
- export function getDefaultElementCircleDetail(opts) {
31
+ export function getDefaultElementCircleDetail() {
31
32
  const detail = {
32
33
  background: '#D9D9D9',
33
34
  radius: 0
34
35
  };
35
36
  return detail;
36
37
  }
37
- export function getDefaultElementTextDetail(opts) {
38
- var _a;
38
+ export function getDefaultElementTextDetail(elementSize) {
39
39
  const detailConfig = getDefaultElementDetailConfig();
40
- const scale = ((_a = opts === null || opts === void 0 ? void 0 : opts.viewScaleInfo) === null || _a === void 0 ? void 0 : _a.scale) || 1;
41
40
  const detail = {
42
- text: 'Text Element',
41
+ text: defaultText,
43
42
  color: detailConfig.color,
44
43
  fontFamily: detailConfig.fontFamily,
45
44
  fontWeight: detailConfig.fontWeight,
46
- lineHeight: detailConfig.fontSize * scale,
47
- fontSize: detailConfig.fontSize * scale,
45
+ lineHeight: elementSize.w / defaultText.length,
46
+ fontSize: elementSize.w / defaultText.length,
48
47
  textAlign: 'center',
49
48
  verticalAlign: 'middle'
50
49
  };
@@ -62,7 +61,7 @@ export function getDefaultElementImageDetail() {
62
61
  };
63
62
  return detail;
64
63
  }
65
- export function getDefaultElementGroupDetail(opts) {
64
+ export function getDefaultElementGroupDetail() {
66
65
  const detail = {
67
66
  children: [],
68
67
  background: '#D9D9D9',
@@ -5,6 +5,7 @@ export declare class Context2D implements ViewContext2D {
5
5
  $undoPixelRatio(num: number): number;
6
6
  $doPixelRatio(num: number): number;
7
7
  $getContext(): CanvasRenderingContext2D;
8
+ $setContext(ctx: CanvasRenderingContext2D): void;
8
9
  $setFont(opts: {
9
10
  fontSize: number;
10
11
  fontFamily?: string;
@@ -26,6 +26,9 @@ export class Context2D {
26
26
  $getContext() {
27
27
  return __classPrivateFieldGet(this, _Context2D_ctx, "f");
28
28
  }
29
+ $setContext(ctx) {
30
+ __classPrivateFieldSet(this, _Context2D_ctx, ctx, "f");
31
+ }
29
32
  $setFont(opts) {
30
33
  const strList = [];
31
34
  if (opts.fontWeight) {
@@ -44,6 +44,10 @@ export function calcElementSizeController(elemSize, opts) {
44
44
  const topRightCenter = vertexes[1];
45
45
  const bottomRightCenter = vertexes[2];
46
46
  const bottomLeftCenter = vertexes[3];
47
+ const topMiddleSize = createControllerElementSizeFromCenter(topCenter, { size: ctrlSize, angle: totalAngle });
48
+ const rightMiddleSize = createControllerElementSizeFromCenter(rightCenter, { size: ctrlSize, angle: totalAngle });
49
+ const bottomMiddleSize = createControllerElementSizeFromCenter(bottomCenter, { size: ctrlSize, angle: totalAngle });
50
+ const leftMiddleSize = createControllerElementSizeFromCenter(leftCenter, { size: ctrlSize, angle: totalAngle });
47
51
  const topLeftSize = createControllerElementSizeFromCenter(topLeftCenter, { size: ctrlSize, angle: totalAngle });
48
52
  const topRightSize = createControllerElementSizeFromCenter(topRightCenter, { size: ctrlSize, angle: totalAngle });
49
53
  const bottomLeftSize = createControllerElementSizeFromCenter(bottomLeftCenter, { size: ctrlSize, angle: totalAngle });
@@ -56,6 +60,10 @@ export function calcElementSizeController(elemSize, opts) {
56
60
  const rightVertexes = [topRightVertexes[3], topRightVertexes[2], bottomRightVertexes[1], bottomRightVertexes[0]];
57
61
  const bottomVertexes = [bottomLeftVertexes[1], bottomRightVertexes[0], bottomRightVertexes[3], bottomLeftVertexes[2]];
58
62
  const leftVertexes = [topLeftVertexes[3], topLeftVertexes[2], bottomLeftVertexes[1], bottomLeftVertexes[0]];
63
+ const topMiddleVertexes = calcElementVertexes(topMiddleSize);
64
+ const rightMiddleVertexes = calcElementVertexes(rightMiddleSize);
65
+ const bottomMiddleVertexes = calcElementVertexes(bottomMiddleSize);
66
+ const leftMiddleVertexes = calcElementVertexes(leftMiddleSize);
59
67
  const sizeController = {
60
68
  elementWrapper: vertexes,
61
69
  left: {
@@ -97,6 +105,26 @@ export function calcElementSizeController(elemSize, opts) {
97
105
  type: 'bottom-right',
98
106
  vertexes: bottomRightVertexes,
99
107
  center: bottomRightCenter
108
+ },
109
+ leftMiddle: {
110
+ type: 'left-middle',
111
+ vertexes: leftMiddleVertexes,
112
+ center: leftCenter
113
+ },
114
+ rightMiddle: {
115
+ type: 'right-middle',
116
+ vertexes: rightMiddleVertexes,
117
+ center: rightCenter
118
+ },
119
+ topMiddle: {
120
+ type: 'top-middle',
121
+ vertexes: topMiddleVertexes,
122
+ center: topCenter
123
+ },
124
+ bottomMiddle: {
125
+ type: 'bottom-middle',
126
+ vertexes: bottomMiddleVertexes,
127
+ center: bottomCenter
100
128
  }
101
129
  };
102
130
  return sizeController;
@@ -1,5 +1,9 @@
1
- import type { Data } from '@idraw/types';
2
- export declare function deepClone<T extends any = any>(target: T): T;
1
+ import type { Data, Element, LoadItemMap } from '@idraw/types';
2
+ export declare function deepClone<T = any>(target: T): T;
3
+ export declare function deepCloneElement<T extends Element = Element>(element: T): T;
3
4
  export declare function sortDataAsserts(data: Data, opts?: {
4
5
  clone?: boolean;
5
6
  }): Data;
7
+ export declare function filterCompactData(data: Data, opts?: {
8
+ loadItemMap?: LoadItemMap;
9
+ }): Data<Record<string, any>>;
@@ -1,4 +1,4 @@
1
- import { createAssetId } from './uuid';
1
+ import { createAssetId, createUUID, isAssetId } from './uuid';
2
2
  export function deepClone(target) {
3
3
  function _clone(t) {
4
4
  const type = is(t);
@@ -27,6 +27,19 @@ export function deepClone(target) {
27
27
  }
28
28
  return _clone(target);
29
29
  }
30
+ export function deepCloneElement(element) {
31
+ const elem = deepClone(element);
32
+ const _resetUUID = (e) => {
33
+ e.uuid = createUUID();
34
+ if (e.type === 'group' && e.detail.children) {
35
+ e.detail.children.forEach((child) => {
36
+ _resetUUID(child);
37
+ });
38
+ }
39
+ };
40
+ _resetUUID(elem);
41
+ return elem;
42
+ }
30
43
  function is(target) {
31
44
  return Object.prototype.toString
32
45
  .call(target)
@@ -68,7 +81,7 @@ export function sortDataAsserts(data, opts) {
68
81
  const assetUUID = createAssetId(html);
69
82
  if (!assets[assetUUID]) {
70
83
  assets[assetUUID] = {
71
- type: 'svg',
84
+ type: 'html',
72
85
  value: html
73
86
  };
74
87
  }
@@ -90,3 +103,83 @@ export function sortDataAsserts(data, opts) {
90
103
  sortedData.assets = assets;
91
104
  return sortedData;
92
105
  }
106
+ export function filterCompactData(data, opts) {
107
+ const assets = data.assets || {};
108
+ const sortedData = deepClone(data);
109
+ const loadItemMap = (opts === null || opts === void 0 ? void 0 : opts.loadItemMap) || {};
110
+ const _scanElements = (elems) => {
111
+ elems.forEach((elem) => {
112
+ var _a, _b, _c;
113
+ if (elem.type === 'image' && elem.detail.src) {
114
+ const src = elem.detail.src;
115
+ if (isAssetId(src) && !assets[src] && loadItemMap[src] && typeof ((_a = loadItemMap[src]) === null || _a === void 0 ? void 0 : _a.source) === 'string') {
116
+ assets[src] = {
117
+ type: 'image',
118
+ value: loadItemMap[src].source
119
+ };
120
+ }
121
+ else if (!assets[src]) {
122
+ const assetUUID = createAssetId(src);
123
+ if (!assets[assetUUID]) {
124
+ assets[assetUUID] = {
125
+ type: 'image',
126
+ value: src
127
+ };
128
+ }
129
+ elem.detail.src = assetUUID;
130
+ }
131
+ }
132
+ else if (elem.type === 'svg') {
133
+ const svg = elem.detail.svg;
134
+ if (isAssetId(svg) && !assets[svg] && loadItemMap[svg] && typeof ((_b = loadItemMap[svg]) === null || _b === void 0 ? void 0 : _b.source) === 'string') {
135
+ assets[svg] = {
136
+ type: 'svg',
137
+ value: loadItemMap[svg].source
138
+ };
139
+ }
140
+ else if (!assets[svg]) {
141
+ const assetUUID = createAssetId(svg);
142
+ if (!assets[assetUUID]) {
143
+ assets[assetUUID] = {
144
+ type: 'svg',
145
+ value: svg
146
+ };
147
+ }
148
+ elem.detail.svg = assetUUID;
149
+ }
150
+ }
151
+ else if (elem.type === 'html') {
152
+ const html = elem.detail.html;
153
+ if (isAssetId(html) && !assets[html] && loadItemMap[html] && typeof ((_c = loadItemMap[html]) === null || _c === void 0 ? void 0 : _c.source) === 'string') {
154
+ assets[html] = {
155
+ type: 'html',
156
+ value: loadItemMap[html].source
157
+ };
158
+ }
159
+ else if (!assets[html]) {
160
+ const assetUUID = createAssetId(html);
161
+ if (!assets[assetUUID]) {
162
+ assets[assetUUID] = {
163
+ type: 'html',
164
+ value: html
165
+ };
166
+ }
167
+ elem.detail.html = assetUUID;
168
+ }
169
+ }
170
+ else if (elem.type === 'group' && Array.isArray(elem.detail.children)) {
171
+ const groupAssets = elem.detail.assets || {};
172
+ Object.keys(groupAssets).forEach((assetId) => {
173
+ if (!assets[assetId]) {
174
+ assets[assetId] = groupAssets[assetId];
175
+ }
176
+ });
177
+ delete elem.detail.assets;
178
+ _scanElements(elem.detail.children);
179
+ }
180
+ });
181
+ };
182
+ _scanElements(sortedData.elements);
183
+ sortedData.assets = assets;
184
+ return sortedData;
185
+ }
@@ -1,6 +1,7 @@
1
1
  import type { Data, Element, Elements, ElementType, ElementSize, ViewContextSize, ViewSizeInfo, ElementAssets, ElementAssetsItem, LoadElementType, ElementPosition } from '@idraw/types';
2
2
  export declare function getSelectedElementUUIDs(data: Data, indexes: Array<number | string>): string[];
3
3
  export declare function validateElements(elements: Array<Element<ElementType>>): boolean;
4
+ export declare function calcElementListSize(list: Elements): ElementSize;
4
5
  export declare function calcElementsContextSize(elements: Array<Element<ElementType>>, opts?: {
5
6
  viewWidth: number;
6
7
  viewHeight: number;
@@ -25,4 +26,5 @@ export declare function filterElementAsset<T extends Element<LoadElementType>>(e
25
26
  export declare function isResourceElement(elem: Element): boolean;
26
27
  export declare function findElementsFromListByPositions(positions: ElementPosition[], list: Element[]): Element[];
27
28
  export declare function findElementFromListByPosition(position: ElementPosition, list: Element[]): Element | null;
29
+ export declare function findElementQueueFromListByPosition(position: ElementPosition, list: Element[]): Element[];
28
30
  export declare function getElementPositionFromList(uuid: string, elements: Element<ElementType>[]): ElementPosition;
@@ -66,6 +66,59 @@ export function validateElements(elements) {
66
66
  }
67
67
  return isValid;
68
68
  }
69
+ export function calcElementListSize(list) {
70
+ var _a;
71
+ const area = { x: 0, y: 0, w: 0, h: 0 };
72
+ let prevElemSize = null;
73
+ for (let i = 0; i < list.length; i++) {
74
+ const elem = list[i];
75
+ if ((_a = elem === null || elem === void 0 ? void 0 : elem.operations) === null || _a === void 0 ? void 0 : _a.invisible) {
76
+ continue;
77
+ }
78
+ const elemSize = {
79
+ x: elem.x,
80
+ y: elem.y,
81
+ w: elem.w,
82
+ h: elem.h,
83
+ angle: elem.angle || 0
84
+ };
85
+ if (elemSize.angle && (elemSize.angle > 0 || elemSize.angle < 0)) {
86
+ const ves = rotateElementVertexes(elemSize);
87
+ if (ves.length === 4) {
88
+ const xList = [ves[0].x, ves[1].x, ves[2].x, ves[3].x];
89
+ const yList = [ves[0].y, ves[1].y, ves[2].y, ves[3].y];
90
+ elemSize.x = Math.min(...xList);
91
+ elemSize.y = Math.min(...yList);
92
+ elemSize.w = Math.abs(Math.max(...xList) - Math.min(...xList));
93
+ elemSize.h = Math.abs(Math.max(...yList) - Math.min(...yList));
94
+ }
95
+ }
96
+ if (prevElemSize) {
97
+ const areaStartX = Math.min(elemSize.x, area.x);
98
+ const areaStartY = Math.min(elemSize.y, area.y);
99
+ const areaEndX = Math.max(elemSize.x + elemSize.w, area.x + area.w);
100
+ const areaEndY = Math.max(elemSize.y + elemSize.h, area.y + area.h);
101
+ area.x = areaStartX;
102
+ area.y = areaStartY;
103
+ area.w = Math.abs(areaEndX - areaStartX);
104
+ area.h = Math.abs(areaEndY - areaStartY);
105
+ }
106
+ else {
107
+ area.x = elemSize.x;
108
+ area.y = elemSize.y;
109
+ area.w = elemSize.w;
110
+ area.h = elemSize.h;
111
+ }
112
+ prevElemSize = elemSize;
113
+ }
114
+ const listSize = {
115
+ x: Math.floor(area.x),
116
+ y: Math.floor(area.y),
117
+ w: Math.ceil(area.w),
118
+ h: Math.ceil(area.h)
119
+ };
120
+ return listSize;
121
+ }
69
122
  export function calcElementsContextSize(elements, opts) {
70
123
  const area = { x: 0, y: 0, w: 0, h: 0 };
71
124
  elements.forEach((elem) => {
@@ -307,8 +360,29 @@ export function findElementFromListByPosition(position, list) {
307
360
  }
308
361
  return result;
309
362
  }
363
+ export function findElementQueueFromListByPosition(position, list) {
364
+ const result = [];
365
+ let tempList = list;
366
+ for (let i = 0; i < position.length; i++) {
367
+ const pos = position[i];
368
+ const item = tempList[pos];
369
+ if (item) {
370
+ result.push(item);
371
+ }
372
+ else {
373
+ break;
374
+ }
375
+ if (i < position.length - 1 && item.type === 'group') {
376
+ tempList = item.detail.children;
377
+ }
378
+ else {
379
+ break;
380
+ }
381
+ }
382
+ return result;
383
+ }
310
384
  export function getElementPositionFromList(uuid, elements) {
311
- let result = [];
385
+ const result = [];
312
386
  let over = false;
313
387
  const _loop = (list) => {
314
388
  var _a;
@@ -1,9 +1,11 @@
1
1
  import type { UtilEventEmitter } from '@idraw/types';
2
2
  export declare class EventEmitter<T extends Record<string, any>> implements UtilEventEmitter<T> {
3
- private _listeners;
3
+ #private;
4
4
  constructor();
5
5
  on<K extends keyof T>(eventKey: K, callback: (e: T[K]) => void): void;
6
6
  off<K extends keyof T>(eventKey: K, callback: (e: T[K]) => void): void;
7
- trigger<K extends keyof T>(eventKey: K, e: T[K]): boolean;
7
+ trigger<K extends keyof T>(eventKey: K, e?: T[K]): boolean;
8
8
  has<K extends keyof T>(name: K | string): boolean;
9
+ destroy(): void;
10
+ clear(): void;
9
11
  }
@@ -1,20 +1,33 @@
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 _EventEmitter_listeners;
1
13
  export class EventEmitter {
2
14
  constructor() {
3
- this._listeners = new Map();
15
+ _EventEmitter_listeners.set(this, void 0);
16
+ __classPrivateFieldSet(this, _EventEmitter_listeners, new Map(), "f");
4
17
  }
5
18
  on(eventKey, callback) {
6
- if (this._listeners.has(eventKey)) {
7
- const callbacks = this._listeners.get(eventKey) || [];
19
+ if (__classPrivateFieldGet(this, _EventEmitter_listeners, "f").has(eventKey)) {
20
+ const callbacks = __classPrivateFieldGet(this, _EventEmitter_listeners, "f").get(eventKey) || [];
8
21
  callbacks === null || callbacks === void 0 ? void 0 : callbacks.push(callback);
9
- this._listeners.set(eventKey, callbacks);
22
+ __classPrivateFieldGet(this, _EventEmitter_listeners, "f").set(eventKey, callbacks);
10
23
  }
11
24
  else {
12
- this._listeners.set(eventKey, [callback]);
25
+ __classPrivateFieldGet(this, _EventEmitter_listeners, "f").set(eventKey, [callback]);
13
26
  }
14
27
  }
15
28
  off(eventKey, callback) {
16
- if (this._listeners.has(eventKey)) {
17
- const callbacks = this._listeners.get(eventKey);
29
+ if (__classPrivateFieldGet(this, _EventEmitter_listeners, "f").has(eventKey)) {
30
+ const callbacks = __classPrivateFieldGet(this, _EventEmitter_listeners, "f").get(eventKey);
18
31
  if (Array.isArray(callbacks)) {
19
32
  for (let i = 0; i < (callbacks === null || callbacks === void 0 ? void 0 : callbacks.length); i++) {
20
33
  if (callbacks[i] === callback) {
@@ -23,11 +36,11 @@ export class EventEmitter {
23
36
  }
24
37
  }
25
38
  }
26
- this._listeners.set(eventKey, callbacks || []);
39
+ __classPrivateFieldGet(this, _EventEmitter_listeners, "f").set(eventKey, callbacks || []);
27
40
  }
28
41
  }
29
42
  trigger(eventKey, e) {
30
- const callbacks = this._listeners.get(eventKey);
43
+ const callbacks = __classPrivateFieldGet(this, _EventEmitter_listeners, "f").get(eventKey);
31
44
  if (Array.isArray(callbacks)) {
32
45
  callbacks.forEach((cb) => {
33
46
  cb(e);
@@ -39,12 +52,19 @@ export class EventEmitter {
39
52
  }
40
53
  }
41
54
  has(name) {
42
- if (this._listeners.has(name)) {
43
- const list = this._listeners.get(name);
55
+ if (__classPrivateFieldGet(this, _EventEmitter_listeners, "f").has(name)) {
56
+ const list = __classPrivateFieldGet(this, _EventEmitter_listeners, "f").get(name);
44
57
  if (Array.isArray(list) && list.length > 0) {
45
58
  return true;
46
59
  }
47
60
  }
48
61
  return false;
49
62
  }
63
+ destroy() {
64
+ this.clear();
65
+ }
66
+ clear() {
67
+ __classPrivateFieldGet(this, _EventEmitter_listeners, "f").clear();
68
+ }
50
69
  }
70
+ _EventEmitter_listeners = new WeakMap();
@@ -1,14 +1,19 @@
1
1
  type ImageType = 'image/jpeg' | 'image/png';
2
2
  export declare function downloadImageFromCanvas(canvas: HTMLCanvasElement, opts: {
3
- filename: string;
3
+ fileName: string;
4
4
  type: ImageType;
5
5
  }): void;
6
6
  export declare function pickFile(opts: {
7
+ accept?: string;
7
8
  success: (data: {
8
9
  file: File;
9
10
  }) => void;
10
- error?: (err: ErrorEvent) => void;
11
+ error?: (err: Error | any) => void;
11
12
  }): void;
12
13
  export declare function parseFileToBase64(file: File): Promise<string | ArrayBuffer>;
13
14
  export declare function parseFileToText(file: File): Promise<string | ArrayBuffer>;
15
+ export declare function parseTextToBlobURL(text: string): string;
16
+ export declare function downloadFileFromText(text: string, opts: {
17
+ fileName: string;
18
+ }): void;
14
19
  export {};