@visactor/vrender-components 0.21.0-vstory.1 → 0.21.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/cjs/axis/type.d.ts +2 -2
- package/cjs/axis/type.js.map +1 -1
- package/cjs/data-zoom/type.d.ts +1 -1
- package/cjs/data-zoom/type.js.map +1 -1
- package/cjs/index.d.ts +1 -2
- package/cjs/index.js +2 -2
- package/cjs/index.js.map +1 -1
- package/cjs/interface.d.ts +1 -2
- package/cjs/interface.js.map +1 -1
- package/cjs/label/arc.js +1 -1
- package/cjs/label/arc.js.map +1 -1
- package/cjs/label/base.js +20 -10
- package/cjs/label/base.js.map +1 -1
- package/cjs/label/overlap/place.d.ts +6 -1
- package/cjs/label/overlap/place.js +4 -4
- package/cjs/label/overlap/place.js.map +1 -1
- package/cjs/label/overlap/shiftY.d.ts +10 -4
- package/cjs/label/overlap/shiftY.js +103 -27
- package/cjs/label/overlap/shiftY.js.map +1 -1
- package/cjs/legend/color/type.d.ts +2 -2
- package/cjs/legend/color/type.js.map +1 -1
- package/cjs/legend/discrete/discrete.d.ts +7 -0
- package/cjs/legend/discrete/discrete.js +106 -23
- package/cjs/legend/discrete/discrete.js.map +1 -1
- package/cjs/legend/discrete/type.d.ts +16 -4
- package/cjs/legend/discrete/type.js.map +1 -1
- package/cjs/marker/type.d.ts +2 -2
- package/cjs/marker/type.js.map +1 -1
- package/cjs/player/type/discrete-player.d.ts +3 -3
- package/cjs/player/type/discrete-player.js.map +1 -1
- package/cjs/player/type/index.d.ts +2 -2
- package/cjs/player/type/index.js.map +1 -1
- package/cjs/radio/radio.d.ts +2 -2
- package/cjs/radio/radio.js +1 -1
- package/cjs/radio/radio.js.map +1 -1
- package/cjs/scrollbar/index.d.ts +1 -0
- package/cjs/scrollbar/index.js +2 -1
- package/cjs/scrollbar/index.js.map +1 -1
- package/cjs/scrollbar/scrollbar-plugin.d.ts +18 -15
- package/cjs/scrollbar/scrollbar-plugin.js +109 -97
- package/cjs/scrollbar/scrollbar-plugin.js.map +1 -1
- package/cjs/timeline/type.js.map +1 -1
- package/dist/index.es.js +9537 -9390
- package/es/axis/type.d.ts +2 -2
- package/es/axis/type.js.map +1 -1
- package/es/data-zoom/type.d.ts +1 -1
- package/es/data-zoom/type.js.map +1 -1
- package/es/index.d.ts +1 -2
- package/es/index.js +1 -3
- package/es/index.js.map +1 -1
- package/es/interface.d.ts +1 -2
- package/es/interface.js.map +1 -1
- package/es/label/arc.js +1 -1
- package/es/label/arc.js.map +1 -1
- package/es/label/base.js +20 -9
- package/es/label/base.js.map +1 -1
- package/es/label/overlap/place.d.ts +6 -1
- package/es/label/overlap/place.js +4 -4
- package/es/label/overlap/place.js.map +1 -1
- package/es/label/overlap/shiftY.d.ts +10 -4
- package/es/label/overlap/shiftY.js +99 -24
- package/es/label/overlap/shiftY.js.map +1 -1
- package/es/legend/color/type.d.ts +2 -2
- package/es/legend/color/type.js.map +1 -1
- package/es/legend/discrete/discrete.d.ts +7 -0
- package/es/legend/discrete/discrete.js +106 -24
- package/es/legend/discrete/discrete.js.map +1 -1
- package/es/legend/discrete/type.d.ts +16 -4
- package/es/legend/discrete/type.js.map +1 -1
- package/es/marker/type.d.ts +2 -2
- package/es/marker/type.js.map +1 -1
- package/es/player/type/discrete-player.d.ts +3 -3
- package/es/player/type/discrete-player.js.map +1 -1
- package/es/player/type/index.d.ts +2 -2
- package/es/player/type/index.js.map +1 -1
- package/es/radio/radio.d.ts +2 -2
- package/es/radio/radio.js +2 -2
- package/es/radio/radio.js.map +1 -1
- package/es/scrollbar/index.d.ts +1 -0
- package/es/scrollbar/index.js +2 -0
- package/es/scrollbar/index.js.map +1 -1
- package/es/scrollbar/scrollbar-plugin.d.ts +18 -15
- package/es/scrollbar/scrollbar-plugin.js +111 -94
- package/es/scrollbar/scrollbar-plugin.js.map +1 -1
- package/es/timeline/type.js.map +1 -1
- package/package.json +10 -9
- package/cjs/weather/index.d.ts +0 -1
- package/cjs/weather/index.js +0 -21
- package/cjs/weather/index.js.map +0 -1
- package/cjs/weather/register.d.ts +0 -1
- package/cjs/weather/register.js +0 -14
- package/cjs/weather/register.js.map +0 -1
- package/cjs/weather/type.d.ts +0 -24
- package/cjs/weather/type.js +0 -6
- package/cjs/weather/type.js.map +0 -1
- package/cjs/weather/weather-box.d.ts +0 -13
- package/cjs/weather/weather-box.js +0 -129
- package/cjs/weather/weather-box.js.map +0 -1
- package/es/weather/index.d.ts +0 -1
- package/es/weather/index.js +0 -2
- package/es/weather/index.js.map +0 -1
- package/es/weather/register.d.ts +0 -1
- package/es/weather/register.js +0 -6
- package/es/weather/register.js.map +0 -1
- package/es/weather/type.d.ts +0 -24
- package/es/weather/type.js +0 -2
- package/es/weather/type.js.map +0 -1
- package/es/weather/weather-box.d.ts +0 -13
- package/es/weather/weather-box.js +0 -127
- package/es/weather/weather-box.js.map +0 -1
|
@@ -1,47 +1,123 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: !0
|
|
5
|
+
}), exports.shiftY = void 0;
|
|
6
|
+
|
|
7
|
+
const vutils_1 = require("@visactor/vutils"), isIntersect = (top, bottom) => Math.ceil(top) > Math.floor(bottom), isXIntersect = ([a, b], [c, d]) => d > a && b > c;
|
|
8
|
+
|
|
9
|
+
function getIntersectionLength(range1, range2) {
|
|
10
|
+
const [start1, end1] = range1, [start2, end2] = range2, start = Math.max(start1, start2), end = Math.min(end1, end2);
|
|
11
|
+
return Math.max(0, end - start);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function shiftY(texts, option) {
|
|
15
|
+
const {maxY: maxY = Number.MAX_VALUE, labelling: labelling, globalShiftY: globalShiftY = {
|
|
16
|
+
enable: !0,
|
|
17
|
+
maxIterations: 10,
|
|
18
|
+
maxError: .1,
|
|
19
|
+
padding: 1
|
|
20
|
+
}} = option, n = texts.length;
|
|
5
21
|
if (n <= 1) return texts;
|
|
6
|
-
const
|
|
7
|
-
textInformation.get(text).
|
|
22
|
+
const xMap = new Map, textInformation = new Map, getY1Initial = text => textInformation.get(text).y1Initial, getHeight = text => textInformation.get(text).height, getY1 = text => textInformation.get(text).y1, getX = text => textInformation.get(text).x, getX1 = text => textInformation.get(text).x1, getX2 = text => textInformation.get(text).x2, getAdjustAttempts = text => textInformation.get(text).attempts, setY1 = (text, y) => {
|
|
23
|
+
textInformation.get(text).y1 = y;
|
|
24
|
+
}, setAdjustAttempts = (text, attempts) => {
|
|
25
|
+
textInformation.get(text).attempts = attempts;
|
|
8
26
|
};
|
|
27
|
+
function adjustPositionInOneGroup(texts) {
|
|
28
|
+
var text;
|
|
29
|
+
if (1 !== texts.length) for (let i = texts.length - 1; i > 0; i--) {
|
|
30
|
+
const curText = texts[i], upperText = texts[i - 1], lowerText = texts[i + 1];
|
|
31
|
+
if (isIntersect(getY1(upperText) + getHeight(upperText), getY1(curText))) {
|
|
32
|
+
const {y: y} = labelling(curText);
|
|
33
|
+
lowerText && isIntersect(y + getHeight(curText) / 2, getY1(lowerText)) || y + getHeight(curText) / 2 <= maxY && setY1(curText, getY1(curText) + y - (text = curText,
|
|
34
|
+
textInformation.get(text).y));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
texts.sort(((a, b) => a.attribute.x - b.attribute.x));
|
|
9
39
|
for (const text of texts) {
|
|
10
|
-
const {y1: y1, y2: y2, x1: x1, x2: x2} = text.AABBBounds;
|
|
40
|
+
const {y1: y1, y2: y2, x1: x1, x2: x2} = text.AABBBounds, {x: x, y: y} = text.attribute;
|
|
11
41
|
textInformation.set(text, {
|
|
12
|
-
|
|
13
|
-
|
|
42
|
+
y1Initial: y1,
|
|
43
|
+
y1: y1,
|
|
44
|
+
y2: y2,
|
|
45
|
+
y: y,
|
|
14
46
|
height: y2 - y1,
|
|
15
47
|
x1: x1,
|
|
16
|
-
x2: x2
|
|
48
|
+
x2: x2,
|
|
49
|
+
x: x,
|
|
50
|
+
attempts: 0
|
|
17
51
|
});
|
|
52
|
+
let hasRange = !1;
|
|
53
|
+
for (const [range, xGroupTexts] of xMap) {
|
|
54
|
+
const {start: start, end: end} = range;
|
|
55
|
+
if (x1 >= start && x2 <= end) xGroupTexts.push(text), hasRange = !0; else if ((0,
|
|
56
|
+
vutils_1.isNumberClose)(x, getX(xGroupTexts[0]), void 0, 5)) {
|
|
57
|
+
const newRange = {
|
|
58
|
+
start: Math.min(start, x1),
|
|
59
|
+
end: Math.max(end, x2)
|
|
60
|
+
};
|
|
61
|
+
xGroupTexts.push(text), xMap.set(newRange, xGroupTexts), xMap.delete(range), hasRange = !0;
|
|
62
|
+
} else if (getIntersectionLength([ start, end ], [ x1, x2 ]) / (end - start) > .5) {
|
|
63
|
+
const newRange = {
|
|
64
|
+
start: Math.min(start, x1),
|
|
65
|
+
end: Math.max(end, x2)
|
|
66
|
+
};
|
|
67
|
+
xGroupTexts.push(text), xMap.set(newRange, xGroupTexts), xMap.delete(range), hasRange = !0;
|
|
68
|
+
}
|
|
69
|
+
if (hasRange) break;
|
|
70
|
+
}
|
|
71
|
+
hasRange || xMap.set({
|
|
72
|
+
start: x1,
|
|
73
|
+
end: x2
|
|
74
|
+
}, [ text ]);
|
|
18
75
|
}
|
|
19
|
-
for (
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const
|
|
28
|
-
if (
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
76
|
+
for (const xTexts of xMap.values()) xTexts.sort(((a, b) => getY1Initial(a) - getY1Initial(b))),
|
|
77
|
+
adjustPositionInOneGroup(xTexts);
|
|
78
|
+
if (!1 !== globalShiftY.enable) {
|
|
79
|
+
const {maxIterations: maxIterations = 10, maxError: maxError = .1, padding: padding = 1, maxAttempts: maxAttempts = 1e3, deltaYTolerance: deltaYTolerance = Number.MAX_VALUE} = globalShiftY;
|
|
80
|
+
for (let iter = 0; iter < maxIterations; iter++) {
|
|
81
|
+
texts.sort(((a, b) => getY1(a) - getY1(b)));
|
|
82
|
+
let error = 0;
|
|
83
|
+
for (let i = 0; i < n - 1; i++) {
|
|
84
|
+
const curText = texts[i];
|
|
85
|
+
if (getAdjustAttempts(curText) >= maxAttempts) continue;
|
|
86
|
+
let nextText, j = i + 1;
|
|
87
|
+
for (;(nextText = texts[j]) && !isXIntersect([ getX1(curText), getX2(curText) ], [ getX1(nextText), getX2(nextText) ]); ) j += 1;
|
|
88
|
+
if (nextText) {
|
|
89
|
+
const y1 = getY1(curText), h0 = getHeight(curText), nextY1 = getY1(nextText), delta = nextY1 - (y1 + h0);
|
|
90
|
+
if (delta < padding) {
|
|
91
|
+
const newDelta = (padding - delta) / 2;
|
|
92
|
+
if (error = Math.max(error, newDelta), y1 + newDelta + getHeight(nextText) > maxY) {
|
|
93
|
+
const newY1 = y1 - (padding - delta), curTextDelta = getY1Initial(curText) - newY1;
|
|
94
|
+
Math.abs(curTextDelta) <= deltaYTolerance && (setY1(curText, newY1), setAdjustAttempts(curText, getAdjustAttempts(curText) + 1));
|
|
95
|
+
} else if (y1 - newDelta < 0) {
|
|
96
|
+
const newY1 = nextY1 + (padding - delta), nextTextDelta = getY1Initial(nextText) - newY1;
|
|
97
|
+
Math.abs(nextTextDelta) <= deltaYTolerance && (setY1(nextText, newY1), setAdjustAttempts(nextText, getAdjustAttempts(nextText) + 1));
|
|
98
|
+
} else {
|
|
99
|
+
const newCurY1 = y1 - newDelta, curTextDelta = getY1Initial(curText) - newCurY1, newNextY1 = nextY1 + newDelta, nextTextDelta = getY1Initial(nextText) - newNextY1;
|
|
100
|
+
Math.abs(curTextDelta) <= deltaYTolerance && Math.abs(nextTextDelta) <= deltaYTolerance && (setY1(curText, newCurY1),
|
|
101
|
+
setY1(nextText, newNextY1), setAdjustAttempts(curText, getAdjustAttempts(curText) + 1),
|
|
102
|
+
setAdjustAttempts(nextText, getAdjustAttempts(nextText) + 1));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
32
105
|
}
|
|
33
106
|
}
|
|
107
|
+
if (error < maxError) break;
|
|
34
108
|
}
|
|
35
|
-
if (error < maxError) break;
|
|
36
109
|
}
|
|
37
110
|
for (const text of texts) {
|
|
38
|
-
const finalY = text.attribute.y +
|
|
111
|
+
const finalY = text.attribute.y + getY1(text) - getY1Initial(text);
|
|
39
112
|
text.setAttribute("y", finalY);
|
|
40
113
|
}
|
|
41
|
-
|
|
114
|
+
const result = [];
|
|
115
|
+
texts.sort(((a, b) => a.attribute.x - b.attribute.x));
|
|
116
|
+
let start = 0, end = texts.length - 1;
|
|
117
|
+
for (;start <= end; ) start === end ? result.push(texts[start]) : (result.push(texts[start]),
|
|
118
|
+
result.push(texts[end])), start++, end--;
|
|
119
|
+
return result;
|
|
42
120
|
}
|
|
43
121
|
|
|
44
|
-
|
|
45
|
-
value: !0
|
|
46
|
-
}), exports.shiftY = void 0, exports.shiftY = shiftY;
|
|
122
|
+
exports.shiftY = shiftY;
|
|
47
123
|
//# sourceMappingURL=shiftY.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/label/overlap/shiftY.ts"],"names":[],"mappings":"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","file":"shiftY.js","sourcesContent":["import type { IText } from '@visactor/vrender-core';\n\nexport interface IShiftYOption {\n maxIterations?: number;\n maxError?: number;\n padding?: number;\n maxY?: number;\n}\n\nexport function shiftY(texts: IText[], option: IShiftYOption = {}) {\n const { maxIterations = 10, maxError = 0.1, padding = 1, maxY = Number.MAX_VALUE } = option;\n\n const n = texts.length;\n if (n <= 1) {\n return texts;\n }\n\n const isIntersect = ([a, b]: [number, number], [c, d]: [number, number]) => {\n return d > a && b > c;\n };\n\n const textInformation = new Map<IText, { y0: number; y: number; height: number; x1: number; x2: number }>();\n\n // y0 : 初始位置\n // y : 最终位置\n // height : 高度\n // x1, x2 : 左右边界\n const getY0 = (text: IText) => textInformation.get(text).y0;\n const getY = (text: IText) => textInformation.get(text).y;\n const getHeight = (text: IText) => textInformation.get(text).height;\n const getX1 = (text: IText) => textInformation.get(text).x1;\n const getX2 = (text: IText) => textInformation.get(text).x2;\n const setY = (text: IText, y: number) => {\n textInformation.get(text).y = y;\n };\n\n for (const text of texts) {\n const { y1, y2, x1, x2 } = text.AABBBounds;\n textInformation.set(text, { y0: y1, y: y1, height: y2 - y1, x1, x2 });\n }\n\n for (let iter = 0; iter < maxIterations; iter++) {\n texts.sort((a, b) => getY(a) - getY(b));\n let error = 0;\n for (let i = 0; i < n - 1; i++) {\n const curText = texts[i];\n let j = i + 1;\n let nextText;\n while (\n (nextText = texts[j]) &&\n !isIntersect([getX1(curText), getX2(curText)], [getX1(nextText), getX2(nextText)])\n ) {\n j += 1;\n }\n if (nextText) {\n const y0 = getY(curText);\n const h0 = getHeight(curText);\n const y1 = getY(nextText);\n const delta = y1 - (y0 + h0);\n if (delta < padding) {\n const newDelta = (padding - delta) / 2;\n error = Math.max(error, newDelta);\n if (y1 + newDelta + getHeight(nextText) > maxY) {\n setY(curText, y0 - (padding - delta));\n } else if (y0 - newDelta < 0) {\n setY(nextText, y1 + (padding - delta));\n } else {\n setY(curText, y0 - newDelta);\n setY(nextText, y1 + newDelta);\n }\n }\n }\n }\n if (error < maxError) {\n break;\n }\n }\n\n for (const text of texts) {\n const finalY = text.attribute.y + getY(text) - getY0(text);\n text.setAttribute('y', finalY);\n }\n\n return texts;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/label/overlap/shiftY.ts"],"names":[],"mappings":"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","file":"shiftY.js","sourcesContent":["import type { IText } from '@visactor/vrender-core';\nimport { isNumberClose } from '@visactor/vutils';\n\nexport interface IShiftYOption {\n labelling: (...args: any[]) => any;\n\n maxY?: number;\n globalShiftY?: {\n /**\n * 是否开启全局调整,开启后,所有文字会整体调整,否则只会按照 x 分组调整 top/bottom\n * @default true\n */\n enable?: boolean;\n /**\n * 最大迭代次数\n * @default 10\n */\n maxIterations?: number;\n /**\n * 最大误差\n * @default 0.1\n */\n maxError?: number;\n /**\n * 调整后 text 之间的 padding\n * @default 1\n */\n padding?: number;\n /**\n * 每个 text 最大被调整的次数\n * @default 1000\n */\n maxAttempts?: number;\n /**\n * 每个 text 调整的 y 坐标差值限制\n */\n deltaYTolerance?: number;\n };\n}\n\nconst isIntersect = (top: number, bottom: number) => {\n return Math.ceil(top) > Math.floor(bottom);\n};\n\nconst isXIntersect = ([a, b]: [number, number], [c, d]: [number, number]) => {\n return d > a && b > c;\n};\n\nfunction getIntersectionLength(range1: number[], range2: number[]) {\n const [start1, end1] = range1;\n const [start2, end2] = range2;\n\n const start = Math.max(start1, start2);\n const end = Math.min(end1, end2);\n\n return Math.max(0, end - start);\n}\n\nexport function shiftY(texts: IText[], option: IShiftYOption) {\n const {\n maxY = Number.MAX_VALUE,\n labelling,\n globalShiftY = { enable: true, maxIterations: 10, maxError: 0.1, padding: 1 }\n } = option;\n\n const n = texts.length;\n if (n <= 1) {\n return texts;\n }\n\n // 根据 x 坐标给 text 分组,存放信息到 map 中\n const xMap = new Map<{ start: number; end: number }, IText[]>();\n const textInformation = new Map<\n IText,\n {\n y1Initial: number;\n y1: number;\n y: number;\n y2: number;\n height: number;\n x1: number;\n x2: number;\n x: number;\n attempts: number;\n }\n >();\n\n const getY1Initial = (text: IText) => textInformation.get(text).y1Initial;\n const getHeight = (text: IText) => textInformation.get(text).height;\n const getY1 = (text: IText) => textInformation.get(text).y1;\n const getY = (text: IText) => textInformation.get(text).y;\n const getX = (text: IText) => textInformation.get(text).x;\n const getX1 = (text: IText) => textInformation.get(text).x1;\n const getX2 = (text: IText) => textInformation.get(text).x2;\n const getAdjustAttempts = (text: IText) => textInformation.get(text).attempts;\n\n const setY1 = (text: IText, y: number) => {\n textInformation.get(text).y1 = y;\n };\n\n const setAdjustAttempts = (text: IText, attempts: number) => {\n textInformation.get(text).attempts = attempts;\n };\n\n function adjustPositionInOneGroup(texts: IText[]) {\n if (texts.length === 1) {\n return;\n }\n // 从最后一个 text 向前遍历,如果与前一个 text 相交,则尝试放到下方(需要判断和前一个 text 是否相交,若相交则不能放到下方)\n for (let i = texts.length - 1; i > 0; i--) {\n const curText = texts[i];\n const upperText = texts[i - 1];\n const lowerText = texts[i + 1];\n\n // 当前 text 和上面一个 text 相交\n if (isIntersect(getY1(upperText) + getHeight(upperText), getY1(curText))) {\n const { y } = labelling(curText);\n // 挪动当前 text 后, 和下面一个 text 不相交\n if (!lowerText || !isIntersect(y + getHeight(curText) / 2, getY1(lowerText))) {\n if (y + getHeight(curText) / 2 <= maxY) {\n setY1(curText, getY1(curText) + y - getY(curText));\n }\n }\n }\n }\n }\n\n // 根据 x 坐标进行分组\n texts.sort((a, b) => a.attribute.x - b.attribute.x);\n for (const text of texts) {\n const { y1, y2, x1, x2 } = text.AABBBounds;\n const { x, y } = text.attribute;\n textInformation.set(text, { y1Initial: y1, y1, y2, y, height: y2 - y1, x1, x2, x, attempts: 0 });\n let hasRange = false;\n\n for (const [range, xGroupTexts] of xMap) {\n const { start, end } = range;\n // 1. x1,x2 在 start 和 end 范围内\n if (x1 >= start && x2 <= end) {\n xGroupTexts.push(text);\n hasRange = true;\n }\n // 2. x 坐标接近,相差在 5px 以内\n else if (isNumberClose(x, getX(xGroupTexts[0]), undefined, 5)) {\n // x 坐标相等,也纳入到一个分组中,并且要扩大分组 range\n const newRange = { start: Math.min(start, x1), end: Math.max(end, x2) };\n xGroupTexts.push(text);\n xMap.set(newRange, xGroupTexts);\n xMap.delete(range);\n hasRange = true;\n }\n // 3. 与区间相交范围 > 50%\n else if (getIntersectionLength([start, end], [x1, x2]) / (end - start) > 0.5) {\n const newRange = { start: Math.min(start, x1), end: Math.max(end, x2) };\n xGroupTexts.push(text);\n xMap.set(newRange, xGroupTexts);\n xMap.delete(range);\n hasRange = true;\n }\n\n if (hasRange) {\n break;\n }\n }\n\n if (!hasRange) {\n xMap.set({ start: x1, end: x2 }, [text]);\n }\n }\n\n // 对每个 x 坐标的 text 数组进行排序\n for (const xTexts of xMap.values()) {\n // 从上到下排序\n xTexts.sort((a, b) => getY1Initial(a) - getY1Initial(b));\n adjustPositionInOneGroup(xTexts);\n }\n\n // 整体调整一次 Y 坐标,进行散开\n if (globalShiftY.enable !== false) {\n const {\n maxIterations = 10,\n maxError = 0.1,\n padding = 1,\n maxAttempts = 1000,\n deltaYTolerance = Number.MAX_VALUE\n } = globalShiftY;\n for (let iter = 0; iter < maxIterations; iter++) {\n texts.sort((a, b) => getY1(a) - getY1(b));\n let error = 0;\n for (let i = 0; i < n - 1; i++) {\n const curText = texts[i];\n if (getAdjustAttempts(curText) >= maxAttempts) {\n continue;\n }\n let j = i + 1;\n let nextText;\n while (\n (nextText = texts[j]) &&\n !isXIntersect([getX1(curText), getX2(curText)], [getX1(nextText), getX2(nextText)])\n ) {\n j += 1;\n }\n if (nextText) {\n const y1 = getY1(curText);\n const h0 = getHeight(curText);\n const nextY1 = getY1(nextText);\n const delta = nextY1 - (y1 + h0);\n if (delta < padding) {\n const newDelta = (padding - delta) / 2;\n error = Math.max(error, newDelta);\n if (y1 + newDelta + getHeight(nextText) > maxY) {\n const newY1 = y1 - (padding - delta);\n const curTextDelta = getY1Initial(curText) - newY1;\n if (Math.abs(curTextDelta) <= deltaYTolerance) {\n setY1(curText, newY1);\n setAdjustAttempts(curText, getAdjustAttempts(curText) + 1);\n }\n } else if (y1 - newDelta < 0) {\n const newY1 = nextY1 + (padding - delta);\n const nextTextDelta = getY1Initial(nextText) - newY1;\n if (Math.abs(nextTextDelta) <= deltaYTolerance) {\n setY1(nextText, newY1);\n setAdjustAttempts(nextText, getAdjustAttempts(nextText) + 1);\n }\n } else {\n const newCurY1 = y1 - newDelta;\n const curTextDelta = getY1Initial(curText) - newCurY1;\n const newNextY1 = nextY1 + newDelta;\n const nextTextDelta = getY1Initial(nextText) - newNextY1;\n if (Math.abs(curTextDelta) <= deltaYTolerance && Math.abs(nextTextDelta) <= deltaYTolerance) {\n setY1(curText, newCurY1);\n setY1(nextText, newNextY1);\n setAdjustAttempts(curText, getAdjustAttempts(curText) + 1);\n setAdjustAttempts(nextText, getAdjustAttempts(nextText) + 1);\n }\n }\n }\n }\n }\n if (error < maxError) {\n break;\n }\n }\n }\n\n for (const text of texts) {\n const finalY = text.attribute.y + getY1(text) - getY1Initial(text);\n text.setAttribute('y', finalY);\n }\n\n const result = [];\n // 调整文字顺序,越靠前的越优先占据空间\n // texts 按照 x 进行排序,然后左右交替,保证首尾标签优先展示\n texts.sort((a, b) => a.attribute.x - b.attribute.x);\n let start = 0;\n let end = texts.length - 1;\n\n while (start <= end) {\n if (start === end) {\n result.push(texts[start]);\n } else {\n result.push(texts[start]);\n result.push(texts[end]);\n }\n start++;\n end--;\n }\n return result;\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { SliderAttributes } from '../../slider/type';
|
|
2
|
-
import { LegendBaseAttributes } from '../type';
|
|
1
|
+
import type { SliderAttributes } from '../../slider/type';
|
|
2
|
+
import type { LegendBaseAttributes } from '../type';
|
|
3
3
|
export type ColorLegendAttributes = {
|
|
4
4
|
colors: string[];
|
|
5
5
|
} & Omit<SliderAttributes, 'step' | 'range'> & LegendBaseAttributes;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/legend/color/type.ts"],"names":[],"mappings":"","file":"type.js","sourcesContent":["import { SliderAttributes } from '../../slider/type';\nimport { LegendBaseAttributes } from '../type';\nexport type ColorLegendAttributes = {\n /**\n * 图例的颜色\n */\n colors: string[];\n} & Omit<SliderAttributes, 'step' | 'range'> &\n LegendBaseAttributes;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/legend/color/type.ts"],"names":[],"mappings":"","file":"type.js","sourcesContent":["import type { SliderAttributes } from '../../slider/type';\nimport type { LegendBaseAttributes } from '../type';\nexport type ColorLegendAttributes = {\n /**\n * 图例的颜色\n */\n colors: string[];\n} & Omit<SliderAttributes, 'step' | 'range'> &\n LegendBaseAttributes;\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { IGroup } from '@visactor/vrender-core';
|
|
1
2
|
import { LegendBase } from '../base';
|
|
2
3
|
import type { DiscreteLegendAttrs, LegendItemDatum } from './type';
|
|
3
4
|
import type { ComponentOptions } from '../../interface';
|
|
@@ -12,6 +13,8 @@ export declare class DiscreteLegend extends LegendBase<DiscreteLegendAttrs> {
|
|
|
12
13
|
private _pagerComponent;
|
|
13
14
|
private _lastActiveItem;
|
|
14
15
|
private _itemContext;
|
|
16
|
+
private _scrollMask;
|
|
17
|
+
private _scrollMaskContext;
|
|
15
18
|
static defaultAttributes: Partial<DiscreteLegendAttrs>;
|
|
16
19
|
constructor(attributes: DiscreteLegendAttrs, options?: ComponentOptions);
|
|
17
20
|
render(): void;
|
|
@@ -29,6 +32,7 @@ export declare class DiscreteLegend extends LegendBase<DiscreteLegendAttrs> {
|
|
|
29
32
|
currentPage: number;
|
|
30
33
|
totalPage: number;
|
|
31
34
|
isScrollbar: boolean;
|
|
35
|
+
clipContainer: IGroup;
|
|
32
36
|
};
|
|
33
37
|
protected _renderContent(): void;
|
|
34
38
|
protected _bindEvents(): void;
|
|
@@ -37,10 +41,13 @@ export declare class DiscreteLegend extends LegendBase<DiscreteLegendAttrs> {
|
|
|
37
41
|
private _createPager;
|
|
38
42
|
private _createScrollbar;
|
|
39
43
|
private _updatePositionOfPager;
|
|
44
|
+
private _computeScrollbarDelta;
|
|
40
45
|
private _updatePositionOfScrollbar;
|
|
41
46
|
private _bindEventsOfPager;
|
|
42
47
|
private _renderPager;
|
|
43
48
|
private _renderScrollbar;
|
|
49
|
+
private renderScrollMask;
|
|
50
|
+
private updateScrollMask;
|
|
44
51
|
private _renderPagerComponent;
|
|
45
52
|
private _onHover;
|
|
46
53
|
private _onUnHover;
|
|
@@ -146,7 +146,8 @@ class DiscreteLegend extends base_1.LegendBase {
|
|
|
146
146
|
items: legendItems,
|
|
147
147
|
isHorizontal: isHorizontal,
|
|
148
148
|
totalPage: 1 / 0,
|
|
149
|
-
isScrollbar: pager && "scrollbar" === pager.type
|
|
149
|
+
isScrollbar: pager && "scrollbar" === pager.type,
|
|
150
|
+
clipContainer: void 0
|
|
150
151
|
}, this._itemContext = this._renderItems();
|
|
151
152
|
let pagerRendered = !1;
|
|
152
153
|
this._itemContext.doWrap && autoPage && this._itemContext.pages > this._itemContext.maxPages && (pagerRendered = this._renderPagerComponent()),
|
|
@@ -157,8 +158,16 @@ class DiscreteLegend extends base_1.LegendBase {
|
|
|
157
158
|
if (this.attribute.disableTriggerEvent) return;
|
|
158
159
|
if (!this._itemsContainer) return;
|
|
159
160
|
const {hover: hover = !0, select: select = !0} = this.attribute;
|
|
160
|
-
|
|
161
|
-
|
|
161
|
+
if (hover) {
|
|
162
|
+
let trigger = "pointermove", triggerOff = "pointerleave";
|
|
163
|
+
(0, vutils_1.isObject)(hover) && (hover.trigger && (trigger = hover.trigger), hover.triggerOff && (triggerOff = hover.triggerOff)),
|
|
164
|
+
this._itemsContainer.addEventListener(trigger, this._onHover), this._itemsContainer.addEventListener(triggerOff, this._onUnHover);
|
|
165
|
+
}
|
|
166
|
+
if (select) {
|
|
167
|
+
let trigger = "pointerdown";
|
|
168
|
+
(0, vutils_1.isObject)(select) && select.trigger && (trigger = select.trigger),
|
|
169
|
+
this._itemsContainer.addEventListener(trigger, this._onClick);
|
|
170
|
+
}
|
|
162
171
|
}
|
|
163
172
|
_autoEllipsis(autoEllipsisStrategy, layoutWidth, labelShape, valueShape) {
|
|
164
173
|
var _a, _b;
|
|
@@ -301,12 +310,12 @@ class DiscreteLegend extends base_1.LegendBase {
|
|
|
301
310
|
direction: "horizontal",
|
|
302
311
|
disableTriggerEvent: disableTriggerEvent,
|
|
303
312
|
range: [ 0, .5 ],
|
|
304
|
-
height: 12
|
|
313
|
+
height: !1 === compStyle.visible ? 0 : 12
|
|
305
314
|
}, compStyle), {
|
|
306
315
|
width: compSize
|
|
307
316
|
})) : new scrollbar_1.ScrollBar(Object.assign(Object.assign({
|
|
308
317
|
direction: "vertical",
|
|
309
|
-
width: 12,
|
|
318
|
+
width: !1 === compStyle.visible ? 0 : 12,
|
|
310
319
|
range: [ 0, .5 ]
|
|
311
320
|
}, compStyle), {
|
|
312
321
|
height: compSize,
|
|
@@ -331,9 +340,15 @@ class DiscreteLegend extends base_1.LegendBase {
|
|
|
331
340
|
});
|
|
332
341
|
}
|
|
333
342
|
}
|
|
343
|
+
_computeScrollbarDelta() {
|
|
344
|
+
const {isHorizontal: isHorizontal, clipContainer: clipContainer} = this._itemContext, itemContainerBounds = this._itemsContainer.AABBBounds, clipContainerBounds = clipContainer.AABBBounds;
|
|
345
|
+
let delta, innerViewSize;
|
|
346
|
+
return isHorizontal ? (innerViewSize = clipContainerBounds.width(), delta = innerViewSize / itemContainerBounds.width()) : (innerViewSize = clipContainerBounds.height(),
|
|
347
|
+
delta = innerViewSize / itemContainerBounds.height()), delta;
|
|
348
|
+
}
|
|
334
349
|
_updatePositionOfScrollbar(contentWidth, contentHeight, renderStartY) {
|
|
335
|
-
const {currentPage: currentPage, totalPage: totalPage
|
|
336
|
-
this._pagerComponent.setScrollRange([
|
|
350
|
+
const {isHorizontal: isHorizontal, currentPage: currentPage, totalPage: totalPage} = this._itemContext, start = (currentPage - 1) / totalPage;
|
|
351
|
+
this._pagerComponent.setScrollRange([ start, start + this._computeScrollbarDelta() ]),
|
|
337
352
|
isHorizontal ? this._pagerComponent.setAttributes({
|
|
338
353
|
x: 0,
|
|
339
354
|
y: renderStartY + contentHeight
|
|
@@ -346,20 +361,32 @@ class DiscreteLegend extends base_1.LegendBase {
|
|
|
346
361
|
const pager = this.attribute.pager || {}, {animation: animation = !0, animationDuration: animationDuration = 450, animationEasing: animationEasing = "quadIn"} = pager, pageParser = this._itemContext.isScrollbar ? e => {
|
|
347
362
|
const {value: value} = e.detail;
|
|
348
363
|
let newPage;
|
|
349
|
-
return 0 === value[0] ?
|
|
350
|
-
|
|
364
|
+
return newPage = 0 === value[0] ? 1 : 1 === value[1] ? this._itemContext.totalPage : value[0] * this._itemContext.totalPage + 1,
|
|
365
|
+
newPage;
|
|
351
366
|
} : e => e.detail.current, onScroll = e => {
|
|
352
367
|
const scrollComponent = this._pagerComponent, preScrollRange = scrollComponent.getScrollRange(), {direction: direction} = scrollComponent.attribute, {width: width, height: height} = scrollComponent.getSliderRenderBounds(), currentScrollValue = "vertical" === direction ? e.deltaY / height : e.deltaX / width;
|
|
353
|
-
scrollComponent.setScrollRange([ preScrollRange[0] + currentScrollValue, preScrollRange[1] + currentScrollValue ], !0)
|
|
368
|
+
scrollComponent.setScrollRange([ preScrollRange[0] + currentScrollValue, preScrollRange[1] + currentScrollValue ], !0),
|
|
369
|
+
this.updateScrollMask();
|
|
354
370
|
}, onPaging = e => {
|
|
355
371
|
const newPage = pageParser(e);
|
|
356
372
|
if (newPage !== this._itemContext.currentPage) {
|
|
357
373
|
if (this._itemContext.currentPage = newPage, this._itemContext && this._itemContext.startIndex < this._itemContext.items.length) {
|
|
358
374
|
this._renderItems();
|
|
359
375
|
const newTotalPage = Math.ceil(this._itemContext.pages / this._itemContext.maxPages);
|
|
360
|
-
this._itemContext.totalPage = newTotalPage, this.
|
|
376
|
+
if (this._itemContext.totalPage = newTotalPage, this._itemContext.isScrollbar && this._pagerComponent) {
|
|
377
|
+
const newDelta = this._computeScrollbarDelta(), [start] = this._pagerComponent.getScrollRange();
|
|
378
|
+
this._pagerComponent.setScrollRange([ start, start + newDelta ]);
|
|
379
|
+
}
|
|
361
380
|
}
|
|
362
|
-
|
|
381
|
+
if (this._itemContext.isScrollbar) {
|
|
382
|
+
const [start] = this._pagerComponent.getScrollRange();
|
|
383
|
+
let containerSize;
|
|
384
|
+
containerSize = this._itemContext.isHorizontal ? this._itemsContainer.AABBBounds.width() : this._itemsContainer.AABBBounds.height();
|
|
385
|
+
const startOffset = containerSize * start;
|
|
386
|
+
this.updateScrollMask(), animation ? this._itemsContainer.animate().to({
|
|
387
|
+
[channel]: -startOffset
|
|
388
|
+
}, animationDuration, animationEasing) : this._itemsContainer.setAttribute(channel, -startOffset);
|
|
389
|
+
} else animation ? this._itemsContainer.animate().to({
|
|
363
390
|
[channel]: -(newPage - 1) * pageSize
|
|
364
391
|
}, animationDuration, animationEasing) : this._itemsContainer.setAttribute(channel, -(newPage - 1) * pageSize);
|
|
365
392
|
}
|
|
@@ -416,18 +443,20 @@ class DiscreteLegend extends base_1.LegendBase {
|
|
|
416
443
|
clip: !0,
|
|
417
444
|
pickable: !1
|
|
418
445
|
});
|
|
419
|
-
return clipGroup.add(itemsContainer), this._innerView.add(clipGroup), this.
|
|
446
|
+
return clipGroup.add(itemsContainer), this._innerView.add(clipGroup), this._itemContext.clipContainer = clipGroup,
|
|
447
|
+
this._bindEventsOfPager(isHorizontal ? compHeight + spaceRow : compWidth + spaceCol, isHorizontal ? "y" : "x"),
|
|
420
448
|
!0;
|
|
421
449
|
}
|
|
422
450
|
_renderScrollbar() {
|
|
451
|
+
var _a;
|
|
423
452
|
const renderStartY = this._title ? this._title.AABBBounds.height() + (0, vutils_1.get)(this.attribute, "title.space", 8) : 0, {maxWidth: maxWidth, item: item = {}, pager: pager = {}} = this.attribute, {spaceCol: spaceCol = constant_1.DEFAULT_ITEM_SPACE_COL, spaceRow: spaceRow = constant_1.DEFAULT_ITEM_SPACE_ROW} = item, itemsContainer = this._itemsContainer, {space: pagerSpace = constant_1.DEFAULT_PAGER_SPACE, defaultCurrent: defaultCurrent = 1} = pager, compStyle = __rest(pager, [ "space", "defaultCurrent" ]), {isHorizontal: isHorizontal} = this._itemContext, maxHeight = this._contentMaxHeight;
|
|
424
|
-
let comp,
|
|
425
|
-
if (isHorizontal)
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
this._innerView.add(comp), contentHeight
|
|
430
|
-
|
|
453
|
+
let comp, contentWidth = 0, contentHeight = 0, startY = 0, pages = 1;
|
|
454
|
+
if (isHorizontal) contentWidth = maxWidth, contentHeight = this._itemHeight, comp = this._createScrollbar(compStyle, contentWidth),
|
|
455
|
+
this._pagerComponent = comp, this._innerView.add(comp); else {
|
|
456
|
+
if (contentHeight = maxHeight - renderStartY, contentWidth = this._itemMaxWidth,
|
|
457
|
+
comp = this._createScrollbar(compStyle, contentHeight), this._pagerComponent = comp,
|
|
458
|
+
this._innerView.add(comp), contentHeight <= 0) return this._innerView.removeChild(comp),
|
|
459
|
+
!1;
|
|
431
460
|
const items = itemsContainer.getChildren(), itemsHeightArr = items.map((item => item.attribute.height));
|
|
432
461
|
if (1 === itemsHeightArr.length || itemsHeightArr.every((entry => entry === itemsHeightArr[0]))) {
|
|
433
462
|
const itemHeight = itemsHeightArr[0], maxContentHeight = contentHeight, pageItemsCount = Math.floor(maxContentHeight / (spaceRow + itemHeight));
|
|
@@ -438,9 +467,15 @@ class DiscreteLegend extends base_1.LegendBase {
|
|
|
438
467
|
prePages !== pages && index === itemsContainer.getChildren().length - 1 && startY - contentHeight >= 1 / 3 * height && (contentHeight = preStartY + height,
|
|
439
468
|
pages -= 1);
|
|
440
469
|
}));
|
|
441
|
-
this._itemContext.totalPage = pages, this._itemContext.pages = pages
|
|
470
|
+
this._itemContext.totalPage = pages, this._itemContext.pages = pages;
|
|
471
|
+
}
|
|
472
|
+
if (defaultCurrent > 1) if (isHorizontal) {
|
|
473
|
+
const maxOffset = this._itemsContainer.AABBBounds.width() - contentWidth;
|
|
474
|
+
itemsContainer.setAttribute("x", -Math.min((defaultCurrent - 1) * (contentWidth + spaceCol), maxOffset));
|
|
475
|
+
} else {
|
|
476
|
+
const maxOffset = this._itemsContainer.AABBBounds.height() - contentHeight;
|
|
477
|
+
itemsContainer.setAttribute("y", -Math.min((defaultCurrent - 1) * (contentHeight + spaceRow), maxOffset));
|
|
442
478
|
}
|
|
443
|
-
defaultCurrent > 1 && (isHorizontal ? itemsContainer.setAttribute("x", -(defaultCurrent - 1) * (contentWidth + spaceCol)) : itemsContainer.setAttribute("y", -(defaultCurrent - 1) * (contentHeight + spaceRow)));
|
|
444
479
|
const clipGroup = vrender_core_1.graphicCreator.group({
|
|
445
480
|
x: 0,
|
|
446
481
|
y: renderStartY,
|
|
@@ -449,9 +484,57 @@ class DiscreteLegend extends base_1.LegendBase {
|
|
|
449
484
|
clip: !0,
|
|
450
485
|
pickable: !1
|
|
451
486
|
});
|
|
452
|
-
return clipGroup.add(itemsContainer), this._innerView.add(clipGroup), this.
|
|
487
|
+
return clipGroup.add(itemsContainer), this._innerView.add(clipGroup), this._itemContext.clipContainer = clipGroup,
|
|
488
|
+
this._updatePositionOfScrollbar(contentWidth, contentHeight, renderStartY), (null === (_a = pager.scrollMask) || void 0 === _a ? void 0 : _a.visible) && this.renderScrollMask(clipGroup),
|
|
489
|
+
this._bindEventsOfPager(isHorizontal ? contentWidth : contentHeight, isHorizontal ? "x" : "y"),
|
|
453
490
|
!0;
|
|
454
491
|
}
|
|
492
|
+
renderScrollMask(clipGroup) {
|
|
493
|
+
const {scrollMask: scrollMask = {}} = this.attribute.pager, {visible: visible = !0, gradientLength: gradientLength = 16, gradientStops: gradientStops} = scrollMask;
|
|
494
|
+
if (!visible || !gradientStops) return;
|
|
495
|
+
const width = clipGroup.AABBBounds.width(), height = clipGroup.AABBBounds.height(), totalLength = this._itemContext.isHorizontal ? width : height, startStops = gradientStops.map((stop => ({
|
|
496
|
+
offset: gradientLength * stop.offset / totalLength,
|
|
497
|
+
color: stop.color
|
|
498
|
+
}))), endStops = gradientStops.map((stop => ({
|
|
499
|
+
offset: (totalLength - gradientLength * stop.offset) / totalLength,
|
|
500
|
+
color: stop.color
|
|
501
|
+
}))), mask = vrender_core_1.graphicCreator.rect({
|
|
502
|
+
x: 0,
|
|
503
|
+
y: 0,
|
|
504
|
+
width: width,
|
|
505
|
+
height: height
|
|
506
|
+
});
|
|
507
|
+
this._scrollMask = mask, this._scrollMaskContext = {
|
|
508
|
+
startStops: startStops,
|
|
509
|
+
endStops: endStops
|
|
510
|
+
}, this.updateScrollMask(), clipGroup.add(mask);
|
|
511
|
+
}
|
|
512
|
+
updateScrollMask() {
|
|
513
|
+
if (!this._scrollMask || !this._pagerComponent) return;
|
|
514
|
+
if (!this._itemContext.isScrollbar) return;
|
|
515
|
+
const [start, end] = this._pagerComponent.getScrollRange(), stops = [];
|
|
516
|
+
(0, vutils_1.isNumberClose)((0, vutils_1.clamp)(end, 0, 1), 1) || stops.push(...this._scrollMaskContext.endStops),
|
|
517
|
+
(0, vutils_1.isNumberClose)((0, vutils_1.clamp)(start, 0, 1), 0) || stops.push(...this._scrollMaskContext.startStops),
|
|
518
|
+
stops.length && (this._itemContext.isHorizontal ? this._scrollMask.setAttributes({
|
|
519
|
+
fill: {
|
|
520
|
+
gradient: "linear",
|
|
521
|
+
x0: 0,
|
|
522
|
+
y0: 0,
|
|
523
|
+
x1: 1,
|
|
524
|
+
y1: 0,
|
|
525
|
+
stops: stops
|
|
526
|
+
}
|
|
527
|
+
}) : this._scrollMask.setAttributes({
|
|
528
|
+
fill: {
|
|
529
|
+
gradient: "linear",
|
|
530
|
+
x0: 0,
|
|
531
|
+
y0: 0,
|
|
532
|
+
x1: 0,
|
|
533
|
+
y1: 1,
|
|
534
|
+
stops: stops
|
|
535
|
+
}
|
|
536
|
+
}));
|
|
537
|
+
}
|
|
455
538
|
_renderPagerComponent() {
|
|
456
539
|
return this._itemContext.isScrollbar ? this._renderScrollbar() : this._renderPager(),
|
|
457
540
|
!0;
|