vislite 1.6.0-alpha.0 → 1.6.0
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/CHANGELOG +5 -1
- package/README.md +284 -284
- package/lib/BarLayout/index.es.js +4 -2
- package/lib/BarLayout/index.es.min.js +2 -2
- package/lib/Buffer/index.es.js +1 -1
- package/lib/Buffer/index.es.min.js +1 -1
- package/lib/Canvas/index.es.js +5 -3
- package/lib/Canvas/index.es.min.js +2 -2
- package/lib/Cardinal/index.es.js +1 -1
- package/lib/Cardinal/index.es.min.js +1 -1
- package/lib/Eoap/index.es.js +1 -1
- package/lib/Eoap/index.es.min.js +1 -1
- package/lib/Hermite/index.es.js +1 -1
- package/lib/Hermite/index.es.min.js +1 -1
- package/lib/MapCoordinate/index.es.js +1 -1
- package/lib/MapCoordinate/index.es.min.js +1 -1
- package/lib/Matrix4/index.es.js +1 -1
- package/lib/Matrix4/index.es.min.js +1 -1
- package/lib/Mercator/index.es.js +1 -1
- package/lib/Mercator/index.es.min.js +1 -1
- package/lib/PieLayout/index.es.js +3 -2
- package/lib/PieLayout/index.es.min.js +1 -1
- package/lib/RawCanvas/index.es.js +1 -1
- package/lib/RawCanvas/index.es.min.js +1 -1
- package/lib/SVG/index.es.js +1 -1
- package/lib/SVG/index.es.min.js +1 -1
- package/lib/Shader/index.es.js +1 -1
- package/lib/Shader/index.es.min.js +1 -1
- package/lib/Texture/index.es.js +1 -1
- package/lib/Texture/index.es.min.js +1 -1
- package/lib/TreeLayout/index.es.js +2 -1
- package/lib/TreeLayout/index.es.min.js +3 -3
- package/lib/animation/index.es.js +1 -1
- package/lib/animation/index.es.min.js +1 -1
- package/lib/assemble/index.es.js +1 -1
- package/lib/assemble/index.es.min.js +1 -1
- package/lib/getLoopColors/index.es.js +1 -1
- package/lib/getLoopColors/index.es.min.js +1 -1
- package/lib/getWebGLContext/index.es.js +1 -1
- package/lib/getWebGLContext/index.es.min.js +1 -1
- package/lib/index.umd.js +11 -5
- package/lib/index.umd.min.js +2 -2
- package/lib/initOption/index.es.js +1 -1
- package/lib/initOption/index.es.min.js +1 -1
- package/lib/mergeOption/index.es.js +1 -1
- package/lib/mergeOption/index.es.min.js +1 -1
- package/lib/move/index.es.js +1 -1
- package/lib/move/index.es.min.js +1 -1
- package/lib/rotate/index.es.js +1 -1
- package/lib/rotate/index.es.min.js +1 -1
- package/lib/ruler/index.es.js +1 -1
- package/lib/ruler/index.es.min.js +1 -1
- package/lib/scale/index.es.js +1 -1
- package/lib/scale/index.es.min.js +1 -1
- package/lib/throttle/index.es.js +1 -1
- package/lib/throttle/index.es.min.js +1 -1
- package/package.json +1 -1
- package/src/Canvas.ts +89 -89
- package/src/SVG.ts +55 -55
- package/src/common/tree/toPlainTree.ts +135 -135
- package/src/common/webgl/texture.ts +98 -98
- package/src/layout/BarLayout.ts +249 -248
- package/src/layout/PieLayout.ts +144 -141
- package/src/layout/TreeLayout.ts +200 -197
- package/types/Canvas.d.ts +3 -1
package/src/layout/TreeLayout.ts
CHANGED
|
@@ -1,198 +1,201 @@
|
|
|
1
|
-
import type TreeLayoutType from '../../types/TreeLayout'
|
|
2
|
-
import type { TreeResultType } from '../../types/Tree'
|
|
3
|
-
import type TreeOptionType from '../../types/TreeOption'
|
|
4
|
-
|
|
5
|
-
import Tree from '../common/tree/index'
|
|
6
|
-
import { initOption } from '../common/option'
|
|
7
|
-
import { animation } from "oipage/web/animation/index"
|
|
8
|
-
import rotate from '../rotate'
|
|
9
|
-
|
|
10
|
-
class TreeLayout extends Tree implements TreeLayoutType {
|
|
11
|
-
readonly name: string = 'TreeLayout'
|
|
12
|
-
|
|
13
|
-
private __option = {
|
|
14
|
-
offsetX: 0,
|
|
15
|
-
offsetY: 0,
|
|
16
|
-
duration: 500,
|
|
17
|
-
type: "plain",
|
|
18
|
-
direction: "LR",
|
|
19
|
-
x: 100,
|
|
20
|
-
y: 100,
|
|
21
|
-
width: 100,
|
|
22
|
-
height: 100,
|
|
23
|
-
radius: 100
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
private __rback: (tree: TreeResultType) => void
|
|
27
|
-
private __oralTree: any
|
|
28
|
-
private __preTree: TreeResultType | null
|
|
29
|
-
|
|
30
|
-
private __noOpens = {}
|
|
31
|
-
|
|
32
|
-
setOption(option: TreeOptionType) {
|
|
33
|
-
initOption(option, this.__option)
|
|
34
|
-
return this
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
use(initTree: any, noOpens = {}) {
|
|
38
|
-
const tree = super.use(initTree, noOpens)
|
|
39
|
-
|
|
40
|
-
// 校对偏差
|
|
41
|
-
if (this.__option.offsetX != 0 || this.__option.offsetY != 0) {
|
|
42
|
-
for (const key in tree.node) {
|
|
43
|
-
if (!tree.node[key].show) {
|
|
44
|
-
|
|
45
|
-
let deep = 0, pid = key
|
|
46
|
-
do {
|
|
47
|
-
pid = tree.node[pid].pid
|
|
48
|
-
deep++
|
|
49
|
-
} while (!tree.node[pid].show)
|
|
50
|
-
|
|
51
|
-
tree.node[key].left += this.__option.offsetX * deep
|
|
52
|
-
tree.node[key].top += this.__option.offsetY * deep
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
if (this.__option.type == 'rect') {
|
|
58
|
-
if (this.__option.direction == 'LR' || this.__option.direction == "RL") {
|
|
59
|
-
|
|
60
|
-
const perW = this.__option.height / tree.size
|
|
61
|
-
const perD = this.__option.width / (tree.deep - 1)
|
|
62
|
-
|
|
63
|
-
const balanceW = this.__option.y - this.__option.height * 0.5
|
|
64
|
-
const flag = this.__option.direction == 'LR' ? 1 : -1
|
|
65
|
-
|
|
66
|
-
for (const key in tree.node) {
|
|
67
|
-
if (tree.deep == 1) {
|
|
68
|
-
tree.node[key].left = this.__option.x + this.__option.width * 0.5 * flag
|
|
69
|
-
tree.node[key].top = this.__option.y
|
|
70
|
-
} else {
|
|
71
|
-
tree.node[key].left = this.__option.x + (tree.node[key].left - 0.5) * perD * flag
|
|
72
|
-
tree.node[key].top = tree.node[key].top * perW + balanceW
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
} else if (this.__option.direction == 'TB' || this.__option.direction == "BT") {
|
|
76
|
-
|
|
77
|
-
const perW = this.__option.width / tree.size
|
|
78
|
-
const perD = this.__option.height / (tree.deep - 1)
|
|
79
|
-
|
|
80
|
-
const balanceW = this.__option.x - this.__option.width * 0.5
|
|
81
|
-
const flag = this.__option.direction == 'TB' ? 1 : -1
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
for (const key in tree.node) {
|
|
86
|
-
tree.node[key].deg = this.__option.direction == 'TB' ? Math.PI * 0.5 : Math.PI * -0.5
|
|
87
|
-
|
|
88
|
-
if (tree.deep == 1) {
|
|
89
|
-
tree.node[key].left = this.__option.x
|
|
90
|
-
tree.node[key].top = this.__option.y + this.__option.height * 0.5 * flag
|
|
91
|
-
} else {
|
|
92
|
-
const left = tree.node[key].left
|
|
93
|
-
tree.node[key].left = tree.node[key].top * perW + balanceW
|
|
94
|
-
tree.node[key].top = this.__option.y + (left - 0.5) * perD * flag
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
} else if (this.__option.type == 'circle') {
|
|
101
|
-
const cx = this.__option.x, cy = this.__option.y
|
|
102
|
-
const deg = Math.PI * 2 / tree.size
|
|
103
|
-
const per = this.__option.radius / (tree.deep - 1)
|
|
104
|
-
|
|
105
|
-
for (const key in tree.node) {
|
|
106
|
-
if (tree.node[key].left == 0.5) {
|
|
107
|
-
tree.node[key].left = cx
|
|
108
|
-
tree.node[key].top = cy
|
|
109
|
-
} else {
|
|
110
|
-
const position = rotate(cx, cy, deg * tree.node[key].top, cx + (tree.node[key].left - 0.5) * per, cy)
|
|
111
|
-
|
|
112
|
-
tree.node[key].deg = deg * tree.node[key].top
|
|
113
|
-
tree.node[key].left = position[0]
|
|
114
|
-
tree.node[key].top = position[1]
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
return tree
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
bind(initTree: any, renderBack: (tree: TreeResultType) => void, noOpens = {}) {
|
|
123
|
-
this.__rback = renderBack
|
|
124
|
-
this.__oralTree = initTree
|
|
125
|
-
this.__noOpens = noOpens
|
|
126
|
-
|
|
127
|
-
this.__preTree = this.use(this.__oralTree, this.__noOpens)
|
|
128
|
-
this.__rback(this.__preTree)
|
|
129
|
-
|
|
130
|
-
return this
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
unbind() {
|
|
134
|
-
this.__rback = () => null
|
|
135
|
-
this.__oralTree = null
|
|
136
|
-
this.__preTree = null
|
|
137
|
-
this.__noOpens = {}
|
|
138
|
-
return this
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
doUpdate() {
|
|
142
|
-
const newTree = this.use(this.__oralTree, this.__noOpens)
|
|
143
|
-
|
|
144
|
-
const cacheTree = JSON.parse(JSON.stringify(newTree))
|
|
145
|
-
|
|
146
|
-
animation((deep) => {
|
|
147
|
-
|
|
148
|
-
if (this.__preTree) {
|
|
149
|
-
for (const key in cacheTree.node) {
|
|
150
|
-
if (newTree.node[key].show || this.__preTree.node[key].show) {
|
|
151
|
-
cacheTree.node[key].show = true
|
|
152
|
-
|
|
153
|
-
cacheTree.node[key].left = this.__preTree.node[key].left + (newTree.node[key].left - this.__preTree.node[key].left) * deep
|
|
154
|
-
cacheTree.node[key].top = this.__preTree.node[key].top + (newTree.node[key].top - this.__preTree.node[key].top) * deep
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
this.__rback(cacheTree)
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
}, this.__option.duration, () => {
|
|
162
|
-
this.__preTree = newTree
|
|
163
|
-
this.__rback(this.__preTree)
|
|
164
|
-
})
|
|
165
|
-
|
|
166
|
-
return this
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
closeNode(id: string) {
|
|
170
|
-
if (!this.__preTree) return this
|
|
171
|
-
// @ts-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
this.
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
this.
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
1
|
+
import type TreeLayoutType from '../../types/TreeLayout'
|
|
2
|
+
import type { TreeResultType } from '../../types/Tree'
|
|
3
|
+
import type TreeOptionType from '../../types/TreeOption'
|
|
4
|
+
|
|
5
|
+
import Tree from '../common/tree/index'
|
|
6
|
+
import { initOption } from '../common/option'
|
|
7
|
+
import { animation } from "oipage/web/animation/index"
|
|
8
|
+
import rotate from '../rotate'
|
|
9
|
+
|
|
10
|
+
class TreeLayout extends Tree implements TreeLayoutType {
|
|
11
|
+
readonly name: string = 'TreeLayout'
|
|
12
|
+
|
|
13
|
+
private __option = {
|
|
14
|
+
offsetX: 0,
|
|
15
|
+
offsetY: 0,
|
|
16
|
+
duration: 500,
|
|
17
|
+
type: "plain",
|
|
18
|
+
direction: "LR",
|
|
19
|
+
x: 100,
|
|
20
|
+
y: 100,
|
|
21
|
+
width: 100,
|
|
22
|
+
height: 100,
|
|
23
|
+
radius: 100
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
private __rback: (tree: TreeResultType) => void
|
|
27
|
+
private __oralTree: any
|
|
28
|
+
private __preTree: TreeResultType | null
|
|
29
|
+
|
|
30
|
+
private __noOpens = {}
|
|
31
|
+
|
|
32
|
+
setOption(option: TreeOptionType) {
|
|
33
|
+
initOption(option, this.__option)
|
|
34
|
+
return this
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
use(initTree: any, noOpens = {}) {
|
|
38
|
+
const tree = super.use(initTree, noOpens)
|
|
39
|
+
|
|
40
|
+
// 校对偏差
|
|
41
|
+
if (this.__option.offsetX != 0 || this.__option.offsetY != 0) {
|
|
42
|
+
for (const key in tree.node) {
|
|
43
|
+
if (!tree.node[key].show) {
|
|
44
|
+
|
|
45
|
+
let deep = 0, pid = key
|
|
46
|
+
do {
|
|
47
|
+
pid = tree.node[pid].pid
|
|
48
|
+
deep++
|
|
49
|
+
} while (!tree.node[pid].show)
|
|
50
|
+
|
|
51
|
+
tree.node[key].left += this.__option.offsetX * deep
|
|
52
|
+
tree.node[key].top += this.__option.offsetY * deep
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (this.__option.type == 'rect') {
|
|
58
|
+
if (this.__option.direction == 'LR' || this.__option.direction == "RL") {
|
|
59
|
+
|
|
60
|
+
const perW = this.__option.height / tree.size
|
|
61
|
+
const perD = this.__option.width / (tree.deep - 1)
|
|
62
|
+
|
|
63
|
+
const balanceW = this.__option.y - this.__option.height * 0.5
|
|
64
|
+
const flag = this.__option.direction == 'LR' ? 1 : -1
|
|
65
|
+
|
|
66
|
+
for (const key in tree.node) {
|
|
67
|
+
if (tree.deep == 1) {
|
|
68
|
+
tree.node[key].left = this.__option.x + this.__option.width * 0.5 * flag
|
|
69
|
+
tree.node[key].top = this.__option.y
|
|
70
|
+
} else {
|
|
71
|
+
tree.node[key].left = this.__option.x + (tree.node[key].left - 0.5) * perD * flag
|
|
72
|
+
tree.node[key].top = tree.node[key].top * perW + balanceW
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
} else if (this.__option.direction == 'TB' || this.__option.direction == "BT") {
|
|
76
|
+
|
|
77
|
+
const perW = this.__option.width / tree.size
|
|
78
|
+
const perD = this.__option.height / (tree.deep - 1)
|
|
79
|
+
|
|
80
|
+
const balanceW = this.__option.x - this.__option.width * 0.5
|
|
81
|
+
const flag = this.__option.direction == 'TB' ? 1 : -1
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
for (const key in tree.node) {
|
|
86
|
+
tree.node[key].deg = this.__option.direction == 'TB' ? Math.PI * 0.5 : Math.PI * -0.5
|
|
87
|
+
|
|
88
|
+
if (tree.deep == 1) {
|
|
89
|
+
tree.node[key].left = this.__option.x
|
|
90
|
+
tree.node[key].top = this.__option.y + this.__option.height * 0.5 * flag
|
|
91
|
+
} else {
|
|
92
|
+
const left = tree.node[key].left
|
|
93
|
+
tree.node[key].left = tree.node[key].top * perW + balanceW
|
|
94
|
+
tree.node[key].top = this.__option.y + (left - 0.5) * perD * flag
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
} else if (this.__option.type == 'circle') {
|
|
101
|
+
const cx = this.__option.x, cy = this.__option.y
|
|
102
|
+
const deg = Math.PI * 2 / tree.size
|
|
103
|
+
const per = this.__option.radius / (tree.deep - 1)
|
|
104
|
+
|
|
105
|
+
for (const key in tree.node) {
|
|
106
|
+
if (tree.node[key].left == 0.5) {
|
|
107
|
+
tree.node[key].left = cx
|
|
108
|
+
tree.node[key].top = cy
|
|
109
|
+
} else {
|
|
110
|
+
const position = rotate(cx, cy, deg * tree.node[key].top, cx + (tree.node[key].left - 0.5) * per, cy)
|
|
111
|
+
|
|
112
|
+
tree.node[key].deg = deg * tree.node[key].top
|
|
113
|
+
tree.node[key].left = position[0]
|
|
114
|
+
tree.node[key].top = position[1]
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return tree
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
bind(initTree: any, renderBack: (tree: TreeResultType) => void, noOpens = {}) {
|
|
123
|
+
this.__rback = renderBack
|
|
124
|
+
this.__oralTree = initTree
|
|
125
|
+
this.__noOpens = noOpens
|
|
126
|
+
|
|
127
|
+
this.__preTree = this.use(this.__oralTree, this.__noOpens)
|
|
128
|
+
this.__rback(this.__preTree)
|
|
129
|
+
|
|
130
|
+
return this
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
unbind() {
|
|
134
|
+
this.__rback = () => null
|
|
135
|
+
this.__oralTree = null
|
|
136
|
+
this.__preTree = null
|
|
137
|
+
this.__noOpens = {}
|
|
138
|
+
return this
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
doUpdate() {
|
|
142
|
+
const newTree = this.use(this.__oralTree, this.__noOpens)
|
|
143
|
+
|
|
144
|
+
const cacheTree = JSON.parse(JSON.stringify(newTree))
|
|
145
|
+
|
|
146
|
+
animation((deep) => {
|
|
147
|
+
|
|
148
|
+
if (this.__preTree) {
|
|
149
|
+
for (const key in cacheTree.node) {
|
|
150
|
+
if (newTree.node[key].show || this.__preTree.node[key].show) {
|
|
151
|
+
cacheTree.node[key].show = true
|
|
152
|
+
|
|
153
|
+
cacheTree.node[key].left = this.__preTree.node[key].left + (newTree.node[key].left - this.__preTree.node[key].left) * deep
|
|
154
|
+
cacheTree.node[key].top = this.__preTree.node[key].top + (newTree.node[key].top - this.__preTree.node[key].top) * deep
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
this.__rback(cacheTree)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
}, this.__option.duration, () => {
|
|
162
|
+
this.__preTree = newTree
|
|
163
|
+
this.__rback(this.__preTree)
|
|
164
|
+
})
|
|
165
|
+
|
|
166
|
+
return this
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
closeNode(id: string) {
|
|
170
|
+
if (!this.__preTree) return this
|
|
171
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
172
|
+
// @ts-ignore
|
|
173
|
+
this.__noOpens[id] = true
|
|
174
|
+
|
|
175
|
+
this.doUpdate()
|
|
176
|
+
return this
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
openNode(id: string) {
|
|
180
|
+
if (!this.__preTree) return this
|
|
181
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
182
|
+
// @ts-ignore
|
|
183
|
+
this.__noOpens[id] = false
|
|
184
|
+
|
|
185
|
+
this.doUpdate()
|
|
186
|
+
return this
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
toggleNode(id: string) {
|
|
190
|
+
if (!this.__preTree) return this
|
|
191
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
192
|
+
// @ts-ignore
|
|
193
|
+
this.__noOpens[id] = !this.__noOpens[id]
|
|
194
|
+
|
|
195
|
+
this.doUpdate()
|
|
196
|
+
return this
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
}
|
|
200
|
+
|
|
198
201
|
export default TreeLayout
|
package/types/Canvas.d.ts
CHANGED
|
@@ -271,8 +271,10 @@ export default interface CanvasType {
|
|
|
271
271
|
|
|
272
272
|
/**
|
|
273
273
|
* 把画布变成url
|
|
274
|
+
* @param type 【仅H5端有效】字符串类型,可选,表示要导出的图片格式,默认为 "image/png"(还可以设置为 "image/jpeg"、"image/webp" 等格式)
|
|
275
|
+
* @param encoderOptions 【仅H5端有效】数值类型,可选,用于指定图像的质量,默认0.92,如果设置了该参数,则只对 "image/jpeg" 和 "image/webp" 格式有效,取值范围是 0 到 1 之间,其中 1 表示最高质量,0 表示最低质量。对于 PNG 格式,此参数无效。
|
|
274
276
|
*/
|
|
275
|
-
toDataURL(): Promise<string>
|
|
277
|
+
toDataURL(type?: string, encoderOptions?: number): Promise<string>
|
|
276
278
|
|
|
277
279
|
/**
|
|
278
280
|
* 获取原生画笔
|