@leafer/helper 1.0.0-rc.5 → 1.0.0-rc.7

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leafer/helper",
3
- "version": "1.0.0-rc.5",
3
+ "version": "1.0.0-rc.7",
4
4
  "description": "@leafer/helper",
5
5
  "author": "Chao (Leafer) Wan",
6
6
  "license": "MIT",
@@ -22,9 +22,9 @@
22
22
  "leaferjs"
23
23
  ],
24
24
  "dependencies": {
25
- "@leafer/math": "1.0.0-rc.5"
25
+ "@leafer/math": "1.0.0-rc.7"
26
26
  },
27
27
  "devDependencies": {
28
- "@leafer/interface": "1.0.0-rc.5"
28
+ "@leafer/interface": "1.0.0-rc.7"
29
29
  }
30
30
  }
@@ -1,10 +1,8 @@
1
- import { ILeaf, ILeafList } from '@leafer/interface'
1
+ import { ILeaf, ILeafLevelList, ILeafList } from '@leafer/interface'
2
2
 
3
+ import { LeafHelper } from './LeafHelper'
3
4
 
4
- interface ILeafPushList {
5
- push(item: ILeaf): void
6
- }
7
-
5
+ const { updateBounds } = LeafHelper
8
6
 
9
7
  export const BranchHelper = {
10
8
 
@@ -14,7 +12,7 @@ export const BranchHelper = {
14
12
 
15
13
  // push
16
14
 
17
- pushAllChildBranch(branch: ILeaf, pushList: ILeafPushList): void {
15
+ pushAllChildBranch(branch: ILeaf, leafList: ILeafList | ILeafLevelList): void {
18
16
  branch.__tempNumber = 1 // 标识需要更新子Leaf元素的WorldBounds分支 Layouter需使用
19
17
 
20
18
  if (branch.__.__childBranchNumber) {
@@ -23,19 +21,19 @@ export const BranchHelper = {
23
21
  branch = children[i]
24
22
  if (branch.isBranch) {
25
23
  branch.__tempNumber = 1
26
- pushList.push(branch)
27
- pushAllChildBranch(branch, pushList)
24
+ leafList.add(branch)
25
+ pushAllChildBranch(branch, leafList)
28
26
  }
29
27
  }
30
28
  }
31
29
  },
32
30
 
33
- pushAllParent(leaf: ILeaf, pushList: ILeafPushList): void {
34
- const { keys } = (pushList as ILeafList)
31
+ pushAllParent(leaf: ILeaf, leafList: ILeafList | ILeafLevelList): void {
32
+ const { keys } = (leafList as ILeafList)
35
33
  if (keys) {
36
34
  while (leaf.parent) {
37
35
  if (keys[leaf.parent.innerId] === undefined) {
38
- pushList.push(leaf.parent)
36
+ leafList.add(leaf.parent)
39
37
  leaf = leaf.parent
40
38
  } else {
41
39
  break
@@ -43,7 +41,7 @@ export const BranchHelper = {
43
41
  }
44
42
  } else {
45
43
  while (leaf.parent) {
46
- pushList.push(leaf.parent)
44
+ leafList.add(leaf.parent)
47
45
  leaf = leaf.parent
48
46
  }
49
47
  }
@@ -64,16 +62,24 @@ export const BranchHelper = {
64
62
  }
65
63
  },
66
64
 
67
- updateWorldBoundsByBranchStack(branchStack: ILeaf[]): void {
68
- let branch: ILeaf
65
+ updateBounds(branch: ILeaf, exclude?: ILeaf): void {
66
+ const branchStack: ILeaf[] = [branch]
67
+ pushAllBranchStack(branch, branchStack)
68
+ updateBoundsByBranchStack(branchStack, exclude)
69
+ },
70
+
71
+ updateBoundsByBranchStack(branchStack: ILeaf[], exclude?: ILeaf): void {
72
+ let branch: ILeaf, children: ILeaf[]
69
73
  for (let i = branchStack.length - 1; i > -1; i--) {
70
74
  branch = branchStack[i]
71
- for (let j = 0, len = branch.children.length; j < len; j++) {
72
- branch.children[j].__updateWorldBounds()
75
+ children = branch.children
76
+ for (let j = 0, len = children.length; j < len; j++) {
77
+ updateBounds(children[j])
73
78
  }
79
+ if (exclude && exclude === branch) continue
80
+ updateBounds(branch)
74
81
  }
75
- branch.__updateWorldBounds()
76
82
  }
77
83
  }
78
84
 
79
- const { pushAllChildBranch, pushAllBranchStack } = BranchHelper
85
+ const { pushAllChildBranch, pushAllBranchStack, updateBoundsByBranchStack } = BranchHelper
@@ -8,10 +8,10 @@ export const LeafBoundsHelper = {
8
8
  },
9
9
 
10
10
  localBoxBounds(target: ILeaf): IBoundsData {
11
- return target.__.isEraser ? null : target.__local
11
+ return target.__.isEraser ? null : (target.__local || target.__ as IBoundsData)
12
12
  },
13
13
 
14
- localEventBounds(target: ILeaf): IBoundsData {
14
+ localStrokeBounds(target: ILeaf): IBoundsData {
15
15
  return target.__.isEraser ? null : target.__layout.localStrokeBounds
16
16
  },
17
17
 
@@ -20,10 +20,10 @@ export const LeafBoundsHelper = {
20
20
  },
21
21
 
22
22
  maskLocalBoxBounds(target: ILeaf): IBoundsData {
23
- return target.__.isMask ? target.__local : null
23
+ return target.__.isMask ? target.__localBounds : null
24
24
  },
25
25
 
26
- maskLocalEventBounds(target: ILeaf): IBoundsData {
26
+ maskLocalStrokeBounds(target: ILeaf): IBoundsData {
27
27
  return target.__.isMask ? target.__layout.localStrokeBounds : null
28
28
  },
29
29
 
package/src/LeafHelper.ts CHANGED
@@ -1,21 +1,45 @@
1
- import { IBranch, ILeaf, IMatrixData, IPointData } from '@leafer/interface'
1
+ import { ILeaf, IMatrixData, IPointData } from '@leafer/interface'
2
2
  import { MathHelper, MatrixHelper, PointHelper } from '@leafer/math'
3
3
 
4
4
 
5
- const { copy, toInnerPoint, scaleOfOuter, rotateOfOuter, skewOfOuter } = MatrixHelper
5
+ const { copy, toInnerPoint, scaleOfOuter, rotateOfOuter, skewOfOuter, multiplyParent, divideParent, getLayout } = MatrixHelper
6
6
  const matrix = {} as IMatrixData
7
7
 
8
8
  export const LeafHelper = {
9
9
 
10
- updateAllWorldMatrix(leaf: ILeaf): void {
11
- leaf.__updateWorldMatrix()
10
+ updateAllMatrix(leaf: ILeaf, checkAutoLayout?: boolean, waitAutoLayout?: boolean): void {
11
+ if (checkAutoLayout && leaf.__hasAutoLayout && leaf.__layout.matrixChanged) waitAutoLayout = true
12
+
13
+ updateMatrix(leaf, checkAutoLayout, waitAutoLayout)
12
14
 
13
15
  if (leaf.isBranch) {
14
16
  const { children } = leaf
15
17
  for (let i = 0, len = children.length; i < len; i++) {
16
- updateAllWorldMatrix(children[i])
18
+ updateAllMatrix(children[i], checkAutoLayout, waitAutoLayout)
19
+ }
20
+ }
21
+ },
22
+
23
+ updateMatrix(leaf: ILeaf, checkAutoLayout?: boolean, waitAutoLayout?: boolean): void {
24
+ const layout = leaf.__layout
25
+
26
+ if (checkAutoLayout) {
27
+ if (waitAutoLayout) {
28
+ layout.waitAutoLayout = true
29
+ if (leaf.__hasAutoLayout) layout.matrixChanged = false // wait updateAutoLayout
17
30
  }
31
+ } else if (layout.waitAutoLayout) {
32
+ layout.waitAutoLayout = false
18
33
  }
34
+
35
+ if (layout.matrixChanged) leaf.__updateLocalMatrix()
36
+ if (!layout.waitAutoLayout) leaf.__updateWorldMatrix()
37
+ },
38
+
39
+ updateBounds(leaf: ILeaf): void {
40
+ const layout = leaf.__layout
41
+ if (layout.boundsChanged) leaf.__updateLocalBounds()
42
+ if (!layout.waitAutoLayout) leaf.__updateWorldBounds()
19
43
  },
20
44
 
21
45
  updateAllWorldOpacity(leaf: ILeaf): void {
@@ -30,7 +54,6 @@ export const LeafHelper = {
30
54
  },
31
55
 
32
56
  updateAllChange(leaf: ILeaf): void {
33
-
34
57
  updateAllWorldOpacity(leaf)
35
58
 
36
59
  leaf.__updateChange()
@@ -66,16 +89,15 @@ export const LeafHelper = {
66
89
  t.y += y
67
90
  },
68
91
 
69
- zoomOfWorld(t: ILeaf, origin: IPointData, scaleX: number, scaleY?: number): void {
70
- this.zoomOfLocal(t, getTempLocal(t, origin), scaleX, scaleY)
92
+ zoomOfWorld(t: ILeaf, origin: IPointData, scaleX: number, scaleY?: number, resize?: boolean): void {
93
+ this.zoomOfLocal(t, getTempLocal(t, origin), scaleX, scaleY, resize)
71
94
  },
72
95
 
73
- zoomOfLocal(t: ILeaf, origin: IPointData, scaleX: number, scaleY: number = scaleX): void {
74
- copy(matrix, t.__local)
96
+ zoomOfLocal(t: ILeaf, origin: IPointData, scaleX: number, scaleY: number = scaleX, resize?: boolean): void {
97
+ copy(matrix, t.__localMatrix)
75
98
  scaleOfOuter(matrix, origin, scaleX, scaleY)
76
99
  moveByMatrix(t, matrix)
77
- t.scaleX *= scaleX
78
- t.scaleY *= scaleY
100
+ t.scaleResize(scaleX, scaleY, resize !== true)
79
101
  },
80
102
 
81
103
  rotateOfWorld(t: ILeaf, origin: IPointData, angle: number): void {
@@ -83,43 +105,73 @@ export const LeafHelper = {
83
105
  },
84
106
 
85
107
  rotateOfLocal(t: ILeaf, origin: IPointData, angle: number): void {
86
- copy(matrix, t.__local)
108
+ copy(matrix, t.__localMatrix)
87
109
  rotateOfOuter(matrix, origin, angle)
88
110
  moveByMatrix(t, matrix)
89
111
  t.rotation = MathHelper.formatRotation(t.rotation + angle)
90
112
  },
91
113
 
92
- skewOfWorld(t: ILeaf, origin: IPointData, skewX: number, skewY?: number): void {
93
- this.skewOfLocal(t, getTempLocal(t, origin), skewX, skewY)
114
+ skewOfWorld(t: ILeaf, origin: IPointData, skewX: number, skewY?: number, resize?: boolean): void {
115
+ this.skewOfLocal(t, getTempLocal(t, origin), skewX, skewY, resize)
94
116
  },
95
117
 
96
- skewOfLocal(t: ILeaf, origin: IPointData, skewX: number, skewY: number): void {
97
- copy(matrix, t.__local)
118
+ skewOfLocal(t: ILeaf, origin: IPointData, skewX: number, skewY: number = 0, resize?: boolean): void {
119
+ copy(matrix, t.__localMatrix)
98
120
  skewOfOuter(matrix, origin, skewX, skewY)
99
- moveByMatrix(t, matrix)
100
- t.skewX = MathHelper.formatSkew(t.skewX + skewX)
101
- t.skewY = MathHelper.formatSkew(t.skewY + skewY)
121
+ L.setTransform(t, matrix, resize)
102
122
  },
103
123
 
104
- drop(t: ILeaf, parent: IBranch): void {
105
- const position = { x: t.x, y: t.y }
106
- t.localToWorld(position)
107
- parent.worldToInner(position)
108
- t.set(position)
109
- parent.add(t)
124
+ transform(t: ILeaf, transform: IMatrixData, resize?: boolean): void {
125
+ copy(matrix, t.localTransform)
126
+ multiplyParent(matrix, transform)
127
+ L.setTransform(t, matrix, resize)
128
+ },
129
+
130
+ setTransform(t: ILeaf, transform: IMatrixData, resize?: boolean): void {
131
+ const layout = getLayout(transform)
132
+ if (resize) {
133
+ t.scaleResize(layout.scaleX / t.scaleX, layout.scaleY / t.scaleY, resize !== true)
134
+ delete layout.scaleX
135
+ delete layout.scaleY
136
+ }
137
+ t.set(layout)
138
+ },
139
+
140
+
141
+ drop(t: ILeaf, parent: ILeaf, index?: number, resize?: boolean): void {
142
+ copy(matrix, t.worldTransform)
143
+ divideParent(matrix, parent.worldTransform)
144
+ t.setTransform(matrix, resize)
145
+ parent.add(t, index)
146
+ },
147
+
148
+ hasParent(p: ILeaf, parent: ILeaf): boolean | void {
149
+ if (!parent) return false
150
+ while (p) {
151
+ if (parent === p) return true
152
+ p = p.parent
153
+ }
154
+ },
155
+
156
+ hasParentAutoLayout(p: ILeaf): boolean | void {
157
+ while (p.parent) {
158
+ p = p.parent
159
+ if (p.__hasAutoLayout) return true
160
+ }
110
161
  }
111
162
 
112
163
  }
113
164
 
114
165
  const L = LeafHelper
115
- const { updateAllWorldMatrix, updateAllWorldOpacity, updateAllChange } = L
166
+ const { updateAllMatrix, updateMatrix, updateAllWorldOpacity, updateAllChange } = L
116
167
 
117
168
  function moveByMatrix(t: ILeaf, matrix: IMatrixData): void {
118
- t.x += matrix.e - t.__local.e
119
- t.y += matrix.f - t.__local.f
169
+ const { e, f } = t.__localMatrix
170
+ t.x += matrix.e - e
171
+ t.y += matrix.f - f
120
172
  }
121
173
 
122
174
  function getTempLocal(t: ILeaf, world: IPointData): IPointData {
123
- t.__layout.checkUpdate()
175
+ t.__layout.update()
124
176
  return t.parent ? PointHelper.tempToInnerOf(world, t.parent.__world) : world
125
177
  }
package/types/index.d.ts CHANGED
@@ -1,40 +1,44 @@
1
- import { ILeaf, IPointData, IBranch, IBoundsData, IFunction } from '@leafer/interface';
1
+ import { ILeaf, IPointData, IMatrixData, IBoundsData, ILeafList, ILeafLevelList, IFunction } from '@leafer/interface';
2
2
 
3
3
  declare const LeafHelper: {
4
- updateAllWorldMatrix(leaf: ILeaf): void;
4
+ updateAllMatrix(leaf: ILeaf, checkAutoLayout?: boolean, waitAutoLayout?: boolean): void;
5
+ updateMatrix(leaf: ILeaf, checkAutoLayout?: boolean, waitAutoLayout?: boolean): void;
6
+ updateBounds(leaf: ILeaf): void;
5
7
  updateAllWorldOpacity(leaf: ILeaf): void;
6
8
  updateAllChange(leaf: ILeaf): void;
7
9
  worldHittable(t: ILeaf): boolean;
8
10
  moveWorld(t: ILeaf, x: number, y: number): void;
9
11
  moveLocal(t: ILeaf, x: number, y?: number): void;
10
- zoomOfWorld(t: ILeaf, origin: IPointData, scaleX: number, scaleY?: number): void;
11
- zoomOfLocal(t: ILeaf, origin: IPointData, scaleX: number, scaleY?: number): void;
12
+ zoomOfWorld(t: ILeaf, origin: IPointData, scaleX: number, scaleY?: number, resize?: boolean): void;
13
+ zoomOfLocal(t: ILeaf, origin: IPointData, scaleX: number, scaleY?: number, resize?: boolean): void;
12
14
  rotateOfWorld(t: ILeaf, origin: IPointData, angle: number): void;
13
15
  rotateOfLocal(t: ILeaf, origin: IPointData, angle: number): void;
14
- skewOfWorld(t: ILeaf, origin: IPointData, skewX: number, skewY?: number): void;
15
- skewOfLocal(t: ILeaf, origin: IPointData, skewX: number, skewY: number): void;
16
- drop(t: ILeaf, parent: IBranch): void;
16
+ skewOfWorld(t: ILeaf, origin: IPointData, skewX: number, skewY?: number, resize?: boolean): void;
17
+ skewOfLocal(t: ILeaf, origin: IPointData, skewX: number, skewY?: number, resize?: boolean): void;
18
+ transform(t: ILeaf, transform: IMatrixData, resize?: boolean): void;
19
+ setTransform(t: ILeaf, transform: IMatrixData, resize?: boolean): void;
20
+ drop(t: ILeaf, parent: ILeaf, index?: number, resize?: boolean): void;
21
+ hasParent(p: ILeaf, parent: ILeaf): boolean | void;
22
+ hasParentAutoLayout(p: ILeaf): boolean | void;
17
23
  };
18
24
 
19
25
  declare const LeafBoundsHelper: {
20
26
  worldBounds(target: ILeaf): IBoundsData;
21
27
  localBoxBounds(target: ILeaf): IBoundsData;
22
- localEventBounds(target: ILeaf): IBoundsData;
28
+ localStrokeBounds(target: ILeaf): IBoundsData;
23
29
  localRenderBounds(target: ILeaf): IBoundsData;
24
30
  maskLocalBoxBounds(target: ILeaf): IBoundsData;
25
- maskLocalEventBounds(target: ILeaf): IBoundsData;
31
+ maskLocalStrokeBounds(target: ILeaf): IBoundsData;
26
32
  maskLocalRenderBounds(target: ILeaf): IBoundsData;
27
33
  };
28
34
 
29
- interface ILeafPushList {
30
- push(item: ILeaf): void;
31
- }
32
35
  declare const BranchHelper: {
33
36
  sort(a: ILeaf, b: ILeaf): number;
34
- pushAllChildBranch(branch: ILeaf, pushList: ILeafPushList): void;
35
- pushAllParent(leaf: ILeaf, pushList: ILeafPushList): void;
37
+ pushAllChildBranch(branch: ILeaf, leafList: ILeafList | ILeafLevelList): void;
38
+ pushAllParent(leaf: ILeaf, leafList: ILeafList | ILeafLevelList): void;
36
39
  pushAllBranchStack(branch: ILeaf, pushList: ILeaf[]): void;
37
- updateWorldBoundsByBranchStack(branchStack: ILeaf[]): void;
40
+ updateBounds(branch: ILeaf, exclude?: ILeaf): void;
41
+ updateBoundsByBranchStack(branchStack: ILeaf[], exclude?: ILeaf): void;
38
42
  };
39
43
 
40
44
  declare const WaitHelper: {