q2-tecton-elements 1.23.0-alpha.0 → 1.24.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/dist/cjs/action-sheet-4b366e9a.js +84 -0
- package/dist/cjs/charting-d02cba1f.js +3127 -0
- package/dist/cjs/{index-3518c78c.js → index-e00b4210.js} +33 -7
- package/dist/cjs/{installCanvasRenderer-b4d10c92.js → installCanvasRenderer-6c4fbcc9.js} +230 -1130
- package/dist/cjs/installLabelLayout-d6b548fe.js +1048 -0
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/q2-action-sheet.cjs.entry.js +218 -0
- package/dist/cjs/q2-badge_2.cjs.entry.js +1 -1
- package/dist/cjs/q2-btn_2.cjs.entry.js +2 -2
- package/dist/cjs/q2-calendar.cjs.entry.js +1 -1
- package/dist/cjs/q2-card.cjs.entry.js +2 -2
- package/dist/cjs/q2-carousel-pane.cjs.entry.js +1 -1
- package/dist/cjs/q2-carousel.cjs.entry.js +1 -1
- package/dist/cjs/q2-chart-area.cjs.entry.js +4569 -0
- package/dist/cjs/q2-chart-bar.cjs.entry.js +25 -3133
- package/dist/cjs/q2-chart-donut.cjs.entry.js +9 -8
- package/dist/cjs/q2-checkbox-group.cjs.entry.js +1 -1
- package/dist/cjs/q2-checkbox.cjs.entry.js +2 -2
- package/dist/cjs/q2-dropdown-item.cjs.entry.js +1 -1
- package/dist/cjs/q2-dropdown.cjs.entry.js +1 -1
- package/dist/cjs/q2-editable-field.cjs.entry.js +1 -1
- package/dist/cjs/q2-icon.cjs.entry.js +1 -1
- package/dist/cjs/q2-loading-element.cjs.entry.js +1 -1
- package/dist/cjs/q2-loc.cjs.entry.js +1 -1
- package/dist/cjs/q2-message.cjs.entry.js +1 -1
- package/dist/cjs/q2-month-picker.cjs.entry.js +1 -1
- package/dist/cjs/q2-optgroup_2.cjs.entry.js +93 -0
- package/dist/cjs/q2-option-list_2.cjs.entry.js +230 -88
- package/dist/cjs/q2-pagination.cjs.entry.js +1 -1
- package/dist/cjs/q2-pill.cjs.entry.js +57 -18
- package/dist/cjs/q2-radio-group.cjs.entry.js +1 -1
- package/dist/cjs/q2-radio.cjs.entry.js +1 -1
- package/dist/cjs/q2-section.cjs.entry.js +1 -1
- package/dist/cjs/q2-select.cjs.entry.js +149 -409
- package/dist/cjs/q2-stepper-pane.cjs.entry.js +1 -1
- package/dist/cjs/q2-stepper-vertical.cjs.entry.js +1 -1
- package/dist/cjs/q2-stepper.cjs.entry.js +1 -1
- package/dist/cjs/q2-tab-container.cjs.entry.js +1 -1
- package/dist/cjs/q2-tag.cjs.entry.js +21 -6
- package/dist/cjs/q2-tecton-elements.cjs.js +1 -1
- package/dist/cjs/q2-textarea.cjs.entry.js +1 -1
- package/dist/collection/collection-manifest.json +2 -0
- package/dist/collection/components/q2-action-sheet/index.js +345 -0
- package/dist/collection/components/q2-action-sheet/styles.css +215 -0
- package/dist/collection/components/q2-card/index.js +1 -1
- package/dist/collection/components/q2-chart-area/index.js +622 -0
- package/dist/collection/components/q2-chart-area/styles.css +82 -0
- package/dist/collection/components/q2-chart-bar/index.js +4 -4
- package/dist/collection/components/q2-chart-bar/styles.css +3 -6
- package/dist/collection/components/q2-chart-donut/index.js +1 -1
- package/dist/collection/components/q2-checkbox/index.js +2 -2
- package/dist/collection/components/q2-checkbox/styles.css +1 -0
- package/dist/collection/components/q2-dropdown/index.js +1 -1
- package/dist/collection/components/q2-loading/index.js +1 -1
- package/dist/collection/components/q2-loading/skeleton/q2-loading-element/styles.css +4 -0
- package/dist/collection/components/q2-loading/styles.css +4 -0
- package/dist/collection/components/q2-optgroup/styles.css +2 -2
- package/dist/collection/components/q2-option/index.js +1 -56
- package/dist/collection/components/q2-option/styles.css +7 -0
- package/dist/collection/components/q2-option-list/index.js +290 -102
- package/dist/collection/components/q2-pill/index.js +79 -18
- package/dist/collection/components/q2-pill/styles.css +1 -2
- package/dist/collection/components/q2-popover/index.js +21 -5
- package/dist/collection/components/q2-popover/styles.css +10 -67
- package/dist/collection/components/q2-radio/index.js +2 -2
- package/dist/collection/components/q2-select/index.js +197 -427
- package/dist/collection/components/q2-select/styles.css +5 -11
- package/dist/collection/components/q2-tag/index.js +38 -5
- package/dist/collection/utils/action-sheet.js +79 -0
- package/dist/collection/utils/index.js +31 -7
- package/dist/components/action-sheet.js +81 -0
- package/dist/components/charting.js +3113 -0
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.js +2 -0
- package/dist/components/index10.js +1 -1
- package/dist/components/index11.js +42 -353
- package/dist/components/index12.js +44 -97
- package/dist/components/index13.js +495 -580
- package/dist/components/index14.js +137 -0
- package/dist/components/index15.js +626 -0
- package/dist/components/index5.js +1 -1
- package/dist/components/index6.js +1 -1
- package/dist/components/index7.js +1 -1
- package/dist/components/index8.js +1 -1
- package/dist/components/index9.js +3 -3
- package/dist/components/installCanvasRenderer.js +188 -1123
- package/dist/components/installLabelLayout.js +1042 -0
- package/dist/components/q2-action-sheet.d.ts +11 -0
- package/dist/components/q2-action-sheet.js +282 -0
- package/dist/components/q2-calendar.js +1 -1
- package/dist/components/q2-card.js +2 -2
- package/dist/components/q2-carousel-pane.js +1 -1
- package/dist/components/q2-carousel.js +1 -1
- package/dist/components/q2-chart-area.d.ts +11 -0
- package/dist/components/q2-chart-area.js +4604 -0
- package/dist/components/q2-chart-bar.js +11 -3119
- package/dist/components/q2-chart-donut.js +4 -3
- package/dist/components/q2-checkbox-group.js +1 -1
- package/dist/components/q2-checkbox.js +2 -2
- package/dist/components/q2-dropdown.js +2 -2
- package/dist/components/q2-editable-field.js +1 -1
- package/dist/components/q2-loading-element.js +1 -1
- package/dist/components/q2-loc.js +1 -1
- package/dist/components/q2-month-picker.js +1 -1
- package/dist/components/q2-optgroup.js +1 -70
- package/dist/components/q2-option-list.js +1 -1
- package/dist/components/q2-option.js +1 -76
- package/dist/components/q2-pagination.js +1 -1
- package/dist/components/q2-pill.js +62 -21
- package/dist/components/q2-popover.js +1 -1
- package/dist/components/q2-radio-group.js +1 -1
- package/dist/components/q2-radio.js +3 -3
- package/dist/components/q2-section.js +1 -1
- package/dist/components/q2-select.js +181 -427
- package/dist/components/q2-stepper-pane.js +1 -1
- package/dist/components/q2-stepper-vertical.js +1 -1
- package/dist/components/q2-stepper.js +1 -1
- package/dist/components/q2-tab-container.js +1 -1
- package/dist/components/q2-tag.js +24 -8
- package/dist/components/q2-textarea.js +1 -1
- package/dist/esm/action-sheet-a9597b32.js +81 -0
- package/dist/esm/charting-2a73ba8e.js +3113 -0
- package/dist/esm/{index-9c591682.js → index-ca21e539.js} +32 -8
- package/dist/esm/{installCanvasRenderer-0143b52d.js → installCanvasRenderer-4a470516.js} +188 -1123
- package/dist/esm/installLabelLayout-d660eaad.js +1042 -0
- package/dist/esm/loader.js +1 -1
- package/dist/esm/q2-action-sheet.entry.js +214 -0
- package/dist/esm/q2-badge_2.entry.js +1 -1
- package/dist/esm/q2-btn_2.entry.js +2 -2
- package/dist/esm/q2-calendar.entry.js +1 -1
- package/dist/esm/q2-card.entry.js +2 -2
- package/dist/esm/q2-carousel-pane.entry.js +1 -1
- package/dist/esm/q2-carousel.entry.js +1 -1
- package/dist/esm/q2-chart-area.entry.js +4565 -0
- package/dist/esm/q2-chart-bar.entry.js +11 -3119
- package/dist/esm/q2-chart-donut.entry.js +4 -3
- package/dist/esm/q2-checkbox-group.entry.js +1 -1
- package/dist/esm/q2-checkbox.entry.js +2 -2
- package/dist/esm/q2-dropdown-item.entry.js +1 -1
- package/dist/esm/q2-dropdown.entry.js +1 -1
- package/dist/esm/q2-editable-field.entry.js +1 -1
- package/dist/esm/q2-icon.entry.js +1 -1
- package/dist/esm/q2-loading-element.entry.js +1 -1
- package/dist/esm/q2-loc.entry.js +1 -1
- package/dist/esm/q2-message.entry.js +1 -1
- package/dist/esm/q2-month-picker.entry.js +1 -1
- package/dist/esm/q2-optgroup_2.entry.js +88 -0
- package/dist/esm/q2-option-list_2.entry.js +230 -88
- package/dist/esm/q2-pagination.entry.js +1 -1
- package/dist/esm/q2-pill.entry.js +57 -18
- package/dist/esm/q2-radio-group.entry.js +1 -1
- package/dist/esm/q2-radio.entry.js +1 -1
- package/dist/esm/q2-section.entry.js +1 -1
- package/dist/esm/q2-select.entry.js +149 -409
- package/dist/esm/q2-stepper-pane.entry.js +1 -1
- package/dist/esm/q2-stepper-vertical.entry.js +1 -1
- package/dist/esm/q2-stepper.entry.js +1 -1
- package/dist/esm/q2-tab-container.entry.js +1 -1
- package/dist/esm/q2-tag.entry.js +21 -6
- package/dist/esm/q2-tecton-elements.js +1 -1
- package/dist/esm/q2-textarea.entry.js +1 -1
- package/dist/q2-tecton-elements/{p-db873db2.entry.js → p-0473f4f7.entry.js} +1 -1
- package/dist/q2-tecton-elements/{p-520c40f6.entry.js → p-13a1390b.entry.js} +1 -1
- package/dist/q2-tecton-elements/{p-9ebb283a.entry.js → p-13deb3ed.entry.js} +1 -1
- package/dist/q2-tecton-elements/{p-0ba564b1.entry.js → p-1d854203.entry.js} +1 -1
- package/dist/q2-tecton-elements/p-1f71774f.entry.js +1 -0
- package/dist/q2-tecton-elements/{p-18cc4758.entry.js → p-256d3fe6.entry.js} +1 -1
- package/dist/q2-tecton-elements/{p-9281adaa.entry.js → p-282f0f8c.entry.js} +1 -1
- package/dist/q2-tecton-elements/{p-2d2c5af2.entry.js → p-30969629.entry.js} +1 -1
- package/dist/q2-tecton-elements/p-30cd888b.entry.js +1 -0
- package/dist/q2-tecton-elements/{p-fc134a5d.entry.js → p-37cf9c97.entry.js} +1 -1
- package/dist/q2-tecton-elements/{p-fb37e67e.entry.js → p-388349b5.entry.js} +1 -1
- package/dist/q2-tecton-elements/p-458b1987.js +1 -0
- package/dist/q2-tecton-elements/p-52063431.js +39 -0
- package/dist/q2-tecton-elements/p-5589ae0f.entry.js +1 -0
- package/dist/q2-tecton-elements/p-619aed74.entry.js +1 -0
- package/dist/q2-tecton-elements/{p-4625184b.entry.js → p-63b67260.entry.js} +1 -1
- package/dist/q2-tecton-elements/{p-e4dc9ac0.entry.js → p-63e363ad.entry.js} +1 -1
- package/dist/q2-tecton-elements/{p-cbd1289a.entry.js → p-6736df05.entry.js} +1 -1
- package/dist/q2-tecton-elements/p-72fe10cc.entry.js +1 -0
- package/dist/q2-tecton-elements/{p-c4640b55.entry.js → p-75b817c6.entry.js} +1 -1
- package/dist/q2-tecton-elements/{p-c3f27fe2.entry.js → p-7a116095.entry.js} +1 -1
- package/dist/q2-tecton-elements/p-7c94119b.entry.js +1 -0
- package/dist/q2-tecton-elements/p-833398d1.js +1 -0
- package/dist/q2-tecton-elements/{p-ce015552.entry.js → p-90572e43.entry.js} +1 -1
- package/dist/q2-tecton-elements/p-91153c61.entry.js +1 -0
- package/dist/q2-tecton-elements/p-9792de8a.entry.js +1 -0
- package/dist/q2-tecton-elements/p-9acfa94e.js +1 -0
- package/dist/q2-tecton-elements/p-a1926e65.js +1 -0
- package/dist/q2-tecton-elements/{p-ffb48ccc.entry.js → p-b3a8cdc5.entry.js} +1 -1
- package/dist/q2-tecton-elements/p-ce3f203c.entry.js +1 -0
- package/dist/q2-tecton-elements/{p-041b3a82.entry.js → p-ce91cd9b.entry.js} +1 -1
- package/dist/q2-tecton-elements/{p-b8b00394.entry.js → p-cefc9d0b.entry.js} +1 -1
- package/dist/q2-tecton-elements/p-d05beeb7.entry.js +1 -0
- package/dist/q2-tecton-elements/p-dc7c8371.entry.js +1 -0
- package/dist/q2-tecton-elements/{p-16c11d74.entry.js → p-e58581fc.entry.js} +1 -1
- package/dist/q2-tecton-elements/{p-f800fd1e.entry.js → p-e886c55b.entry.js} +1 -1
- package/dist/q2-tecton-elements/{p-6e6b5b80.entry.js → p-f0ec4d2c.entry.js} +1 -1
- package/dist/q2-tecton-elements/{p-97aa8423.entry.js → p-f94e7043.entry.js} +1 -1
- package/dist/q2-tecton-elements/{p-c444a60b.entry.js → p-fcb7d191.entry.js} +1 -1
- package/dist/q2-tecton-elements/q2-tecton-elements.esm.js +1 -1
- package/dist/test/helpers.js +3 -2
- package/dist/types/components/q2-action-sheet/index.d.ts +52 -0
- package/dist/types/components/q2-card/index.d.ts +1 -1
- package/dist/types/components/q2-chart-area/index.d.ts +40 -0
- package/dist/types/components/q2-chart-bar/index.d.ts +2 -2
- package/dist/types/components/q2-chart-donut/index.d.ts +1 -1
- package/dist/types/components/q2-checkbox/index.d.ts +4 -1
- package/dist/types/components/q2-option/index.d.ts +0 -3
- package/dist/types/components/q2-option-list/index.d.ts +16 -8
- package/dist/types/components/q2-pill/index.d.ts +10 -1
- package/dist/types/components/q2-popover/index.d.ts +2 -0
- package/dist/types/components/q2-select/index.d.ts +46 -47
- package/dist/types/components/q2-tag/index.d.ts +3 -2
- package/dist/types/components.d.ts +100 -13
- package/dist/types/global.d.ts +10 -1
- package/dist/types/utils/action-sheet.d.ts +12 -0
- package/dist/types/utils/index.d.ts +3 -1
- package/dist/types/workspace/workspace/{_production_release_1.22.x-alpha → Tecton_tecton-production_master}/packages/q2-tecton-elements/.stencil/test/helpers.d.ts +1 -1
- package/package.json +3 -2
- package/dist/cjs/q2-optgroup.cjs.entry.js +0 -56
- package/dist/cjs/q2-option.cjs.entry.js +0 -46
- package/dist/esm/q2-optgroup.entry.js +0 -52
- package/dist/esm/q2-option.entry.js +0 -42
- package/dist/q2-tecton-elements/p-0d8dd75a.entry.js +0 -1
- package/dist/q2-tecton-elements/p-0fad9c5a.entry.js +0 -1
- package/dist/q2-tecton-elements/p-1f85cced.js +0 -39
- package/dist/q2-tecton-elements/p-2c9b1308.entry.js +0 -1
- package/dist/q2-tecton-elements/p-5e374fbd.js +0 -1
- package/dist/q2-tecton-elements/p-6b52a262.entry.js +0 -1
- package/dist/q2-tecton-elements/p-aaf42539.entry.js +0 -1
- package/dist/q2-tecton-elements/p-cf41970f.entry.js +0 -1
- package/dist/q2-tecton-elements/p-de164483.entry.js +0 -1
- package/dist/q2-tecton-elements/p-e6d26f39.entry.js +0 -1
- package/dist/q2-tecton-elements/p-f1d06917.entry.js +0 -1
- package/dist/q2-tecton-elements/p-f35bf6a3.entry.js +0 -1
|
@@ -0,0 +1,1042 @@
|
|
|
1
|
+
import { W as Point, bV as DISPLAY_STATES, b6 as retrieve2, ba as Polyline, y as defaults, J as SPECIAL_STATES, bz as invert, P as Path, Y as lerp, bW as quadraticProjectPoint, bX as cubicProjectPoint, bY as dist, v as PathProxy, bZ as normalizeRadian, a3 as makeInner, Q as BoundingRect, D as isFunction, bK as keys, d as getECData, aM as parsePercent, b_ as prepareLayoutList, a5 as filter, b$ as shiftLayoutOnX, b8 as shiftLayoutOnY, c0 as hideOverlap, I as each, c1 as isElementRemoved, H as labelInner, i as initProps, at as indexOf, u as updateProps, c2 as animateLabelValue, X as Transformable } from './installCanvasRenderer.js';
|
|
2
|
+
|
|
3
|
+
var PI2 = Math.PI * 2;
|
|
4
|
+
var CMD = PathProxy.CMD;
|
|
5
|
+
var DEFAULT_SEARCH_SPACE = ['top', 'right', 'bottom', 'left'];
|
|
6
|
+
|
|
7
|
+
function getCandidateAnchor(pos, distance, rect, outPt, outDir) {
|
|
8
|
+
var width = rect.width;
|
|
9
|
+
var height = rect.height;
|
|
10
|
+
|
|
11
|
+
switch (pos) {
|
|
12
|
+
case 'top':
|
|
13
|
+
outPt.set(rect.x + width / 2, rect.y - distance);
|
|
14
|
+
outDir.set(0, -1);
|
|
15
|
+
break;
|
|
16
|
+
|
|
17
|
+
case 'bottom':
|
|
18
|
+
outPt.set(rect.x + width / 2, rect.y + height + distance);
|
|
19
|
+
outDir.set(0, 1);
|
|
20
|
+
break;
|
|
21
|
+
|
|
22
|
+
case 'left':
|
|
23
|
+
outPt.set(rect.x - distance, rect.y + height / 2);
|
|
24
|
+
outDir.set(-1, 0);
|
|
25
|
+
break;
|
|
26
|
+
|
|
27
|
+
case 'right':
|
|
28
|
+
outPt.set(rect.x + width + distance, rect.y + height / 2);
|
|
29
|
+
outDir.set(1, 0);
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function projectPointToArc(cx, cy, r, startAngle, endAngle, anticlockwise, x, y, out) {
|
|
35
|
+
x -= cx;
|
|
36
|
+
y -= cy;
|
|
37
|
+
var d = Math.sqrt(x * x + y * y);
|
|
38
|
+
x /= d;
|
|
39
|
+
y /= d; // Intersect point.
|
|
40
|
+
|
|
41
|
+
var ox = x * r + cx;
|
|
42
|
+
var oy = y * r + cy;
|
|
43
|
+
|
|
44
|
+
if (Math.abs(startAngle - endAngle) % PI2 < 1e-4) {
|
|
45
|
+
// Is a circle
|
|
46
|
+
out[0] = ox;
|
|
47
|
+
out[1] = oy;
|
|
48
|
+
return d - r;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (anticlockwise) {
|
|
52
|
+
var tmp = startAngle;
|
|
53
|
+
startAngle = normalizeRadian(endAngle);
|
|
54
|
+
endAngle = normalizeRadian(tmp);
|
|
55
|
+
} else {
|
|
56
|
+
startAngle = normalizeRadian(startAngle);
|
|
57
|
+
endAngle = normalizeRadian(endAngle);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (startAngle > endAngle) {
|
|
61
|
+
endAngle += PI2;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
var angle = Math.atan2(y, x);
|
|
65
|
+
|
|
66
|
+
if (angle < 0) {
|
|
67
|
+
angle += PI2;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (angle >= startAngle && angle <= endAngle || angle + PI2 >= startAngle && angle + PI2 <= endAngle) {
|
|
71
|
+
// Project point is on the arc.
|
|
72
|
+
out[0] = ox;
|
|
73
|
+
out[1] = oy;
|
|
74
|
+
return d - r;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
var x1 = r * Math.cos(startAngle) + cx;
|
|
78
|
+
var y1 = r * Math.sin(startAngle) + cy;
|
|
79
|
+
var x2 = r * Math.cos(endAngle) + cx;
|
|
80
|
+
var y2 = r * Math.sin(endAngle) + cy;
|
|
81
|
+
var d1 = (x1 - x) * (x1 - x) + (y1 - y) * (y1 - y);
|
|
82
|
+
var d2 = (x2 - x) * (x2 - x) + (y2 - y) * (y2 - y);
|
|
83
|
+
|
|
84
|
+
if (d1 < d2) {
|
|
85
|
+
out[0] = x1;
|
|
86
|
+
out[1] = y1;
|
|
87
|
+
return Math.sqrt(d1);
|
|
88
|
+
} else {
|
|
89
|
+
out[0] = x2;
|
|
90
|
+
out[1] = y2;
|
|
91
|
+
return Math.sqrt(d2);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function projectPointToLine(x1, y1, x2, y2, x, y, out, limitToEnds) {
|
|
96
|
+
var dx = x - x1;
|
|
97
|
+
var dy = y - y1;
|
|
98
|
+
var dx1 = x2 - x1;
|
|
99
|
+
var dy1 = y2 - y1;
|
|
100
|
+
var lineLen = Math.sqrt(dx1 * dx1 + dy1 * dy1);
|
|
101
|
+
dx1 /= lineLen;
|
|
102
|
+
dy1 /= lineLen; // dot product
|
|
103
|
+
|
|
104
|
+
var projectedLen = dx * dx1 + dy * dy1;
|
|
105
|
+
var t = projectedLen / lineLen;
|
|
106
|
+
|
|
107
|
+
if (limitToEnds) {
|
|
108
|
+
t = Math.min(Math.max(t, 0), 1);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
t *= lineLen;
|
|
112
|
+
var ox = out[0] = x1 + t * dx1;
|
|
113
|
+
var oy = out[1] = y1 + t * dy1;
|
|
114
|
+
return Math.sqrt((ox - x) * (ox - x) + (oy - y) * (oy - y));
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function projectPointToRect(x1, y1, width, height, x, y, out) {
|
|
118
|
+
if (width < 0) {
|
|
119
|
+
x1 = x1 + width;
|
|
120
|
+
width = -width;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (height < 0) {
|
|
124
|
+
y1 = y1 + height;
|
|
125
|
+
height = -height;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
var x2 = x1 + width;
|
|
129
|
+
var y2 = y1 + height;
|
|
130
|
+
var ox = out[0] = Math.min(Math.max(x, x1), x2);
|
|
131
|
+
var oy = out[1] = Math.min(Math.max(y, y1), y2);
|
|
132
|
+
return Math.sqrt((ox - x) * (ox - x) + (oy - y) * (oy - y));
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
var tmpPt = [];
|
|
136
|
+
|
|
137
|
+
function nearestPointOnRect(pt, rect, out) {
|
|
138
|
+
var dist = projectPointToRect(rect.x, rect.y, rect.width, rect.height, pt.x, pt.y, tmpPt);
|
|
139
|
+
out.set(tmpPt[0], tmpPt[1]);
|
|
140
|
+
return dist;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Calculate min distance corresponding point.
|
|
144
|
+
* This method won't evaluate if point is in the path.
|
|
145
|
+
*/
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
function nearestPointOnPath(pt, path, out) {
|
|
149
|
+
var xi = 0;
|
|
150
|
+
var yi = 0;
|
|
151
|
+
var x0 = 0;
|
|
152
|
+
var y0 = 0;
|
|
153
|
+
var x1;
|
|
154
|
+
var y1;
|
|
155
|
+
var minDist = Infinity;
|
|
156
|
+
var data = path.data;
|
|
157
|
+
var x = pt.x;
|
|
158
|
+
var y = pt.y;
|
|
159
|
+
|
|
160
|
+
for (var i = 0; i < data.length;) {
|
|
161
|
+
var cmd = data[i++];
|
|
162
|
+
|
|
163
|
+
if (i === 1) {
|
|
164
|
+
xi = data[i];
|
|
165
|
+
yi = data[i + 1];
|
|
166
|
+
x0 = xi;
|
|
167
|
+
y0 = yi;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
var d = minDist;
|
|
171
|
+
|
|
172
|
+
switch (cmd) {
|
|
173
|
+
case CMD.M:
|
|
174
|
+
// moveTo 命令重新创建一个新的 subpath, 并且更新新的起点
|
|
175
|
+
// 在 closePath 的时候使用
|
|
176
|
+
x0 = data[i++];
|
|
177
|
+
y0 = data[i++];
|
|
178
|
+
xi = x0;
|
|
179
|
+
yi = y0;
|
|
180
|
+
break;
|
|
181
|
+
|
|
182
|
+
case CMD.L:
|
|
183
|
+
d = projectPointToLine(xi, yi, data[i], data[i + 1], x, y, tmpPt, true);
|
|
184
|
+
xi = data[i++];
|
|
185
|
+
yi = data[i++];
|
|
186
|
+
break;
|
|
187
|
+
|
|
188
|
+
case CMD.C:
|
|
189
|
+
d = cubicProjectPoint(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], x, y, tmpPt);
|
|
190
|
+
xi = data[i++];
|
|
191
|
+
yi = data[i++];
|
|
192
|
+
break;
|
|
193
|
+
|
|
194
|
+
case CMD.Q:
|
|
195
|
+
d = quadraticProjectPoint(xi, yi, data[i++], data[i++], data[i], data[i + 1], x, y, tmpPt);
|
|
196
|
+
xi = data[i++];
|
|
197
|
+
yi = data[i++];
|
|
198
|
+
break;
|
|
199
|
+
|
|
200
|
+
case CMD.A:
|
|
201
|
+
// TODO Arc 判断的开销比较大
|
|
202
|
+
var cx = data[i++];
|
|
203
|
+
var cy = data[i++];
|
|
204
|
+
var rx = data[i++];
|
|
205
|
+
var ry = data[i++];
|
|
206
|
+
var theta = data[i++];
|
|
207
|
+
var dTheta = data[i++]; // TODO Arc 旋转
|
|
208
|
+
|
|
209
|
+
i += 1;
|
|
210
|
+
var anticlockwise = !!(1 - data[i++]);
|
|
211
|
+
x1 = Math.cos(theta) * rx + cx;
|
|
212
|
+
y1 = Math.sin(theta) * ry + cy; // 不是直接使用 arc 命令
|
|
213
|
+
|
|
214
|
+
if (i <= 1) {
|
|
215
|
+
// 第一个命令起点还未定义
|
|
216
|
+
x0 = x1;
|
|
217
|
+
y0 = y1;
|
|
218
|
+
} // zr 使用scale来模拟椭圆, 这里也对x做一定的缩放
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
var _x = (x - cx) * ry / rx + cx;
|
|
222
|
+
|
|
223
|
+
d = projectPointToArc(cx, cy, ry, theta, theta + dTheta, anticlockwise, _x, y, tmpPt);
|
|
224
|
+
xi = Math.cos(theta + dTheta) * rx + cx;
|
|
225
|
+
yi = Math.sin(theta + dTheta) * ry + cy;
|
|
226
|
+
break;
|
|
227
|
+
|
|
228
|
+
case CMD.R:
|
|
229
|
+
x0 = xi = data[i++];
|
|
230
|
+
y0 = yi = data[i++];
|
|
231
|
+
var width = data[i++];
|
|
232
|
+
var height = data[i++];
|
|
233
|
+
d = projectPointToRect(x0, y0, width, height, x, y, tmpPt);
|
|
234
|
+
break;
|
|
235
|
+
|
|
236
|
+
case CMD.Z:
|
|
237
|
+
d = projectPointToLine(xi, yi, x0, y0, x, y, tmpPt, true);
|
|
238
|
+
xi = x0;
|
|
239
|
+
yi = y0;
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
if (d < minDist) {
|
|
244
|
+
minDist = d;
|
|
245
|
+
out.set(tmpPt[0], tmpPt[1]);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
return minDist;
|
|
250
|
+
} // Temporal variable for intermediate usage.
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
var pt0 = new Point();
|
|
254
|
+
var pt1 = new Point();
|
|
255
|
+
var pt2 = new Point();
|
|
256
|
+
var dir = new Point();
|
|
257
|
+
var dir2 = new Point();
|
|
258
|
+
/**
|
|
259
|
+
* Calculate a proper guide line based on the label position and graphic element definition
|
|
260
|
+
* @param label
|
|
261
|
+
* @param labelRect
|
|
262
|
+
* @param target
|
|
263
|
+
* @param targetRect
|
|
264
|
+
*/
|
|
265
|
+
|
|
266
|
+
function updateLabelLinePoints(target, labelLineModel) {
|
|
267
|
+
if (!target) {
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
var labelLine = target.getTextGuideLine();
|
|
272
|
+
var label = target.getTextContent(); // Needs to create text guide in each charts.
|
|
273
|
+
|
|
274
|
+
if (!(label && labelLine)) {
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
var labelGuideConfig = target.textGuideLineConfig || {};
|
|
279
|
+
var points = [[0, 0], [0, 0], [0, 0]];
|
|
280
|
+
var searchSpace = labelGuideConfig.candidates || DEFAULT_SEARCH_SPACE;
|
|
281
|
+
var labelRect = label.getBoundingRect().clone();
|
|
282
|
+
labelRect.applyTransform(label.getComputedTransform());
|
|
283
|
+
var minDist = Infinity;
|
|
284
|
+
var anchorPoint = labelGuideConfig.anchor;
|
|
285
|
+
var targetTransform = target.getComputedTransform();
|
|
286
|
+
var targetInversedTransform = targetTransform && invert([], targetTransform);
|
|
287
|
+
var len = labelLineModel.get('length2') || 0;
|
|
288
|
+
|
|
289
|
+
if (anchorPoint) {
|
|
290
|
+
pt2.copy(anchorPoint);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
for (var i = 0; i < searchSpace.length; i++) {
|
|
294
|
+
var candidate = searchSpace[i];
|
|
295
|
+
getCandidateAnchor(candidate, 0, labelRect, pt0, dir);
|
|
296
|
+
Point.scaleAndAdd(pt1, pt0, dir, len); // Transform to target coord space.
|
|
297
|
+
|
|
298
|
+
pt1.transform(targetInversedTransform); // Note: getBoundingRect will ensure the `path` being created.
|
|
299
|
+
|
|
300
|
+
var boundingRect = target.getBoundingRect();
|
|
301
|
+
var dist = anchorPoint ? anchorPoint.distance(pt1) : target instanceof Path ? nearestPointOnPath(pt1, target.path, pt2) : nearestPointOnRect(pt1, boundingRect, pt2); // TODO pt2 is in the path
|
|
302
|
+
|
|
303
|
+
if (dist < minDist) {
|
|
304
|
+
minDist = dist; // Transform back to global space.
|
|
305
|
+
|
|
306
|
+
pt1.transform(targetTransform);
|
|
307
|
+
pt2.transform(targetTransform);
|
|
308
|
+
pt2.toArray(points[0]);
|
|
309
|
+
pt1.toArray(points[1]);
|
|
310
|
+
pt0.toArray(points[2]);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
limitTurnAngle(points, labelLineModel.get('minTurnAngle'));
|
|
315
|
+
labelLine.setShape({
|
|
316
|
+
points: points
|
|
317
|
+
});
|
|
318
|
+
} // Temporal variable for the limitTurnAngle function
|
|
319
|
+
|
|
320
|
+
var tmpArr = [];
|
|
321
|
+
var tmpProjPoint = new Point();
|
|
322
|
+
/**
|
|
323
|
+
* Reduce the line segment attached to the label to limit the turn angle between two segments.
|
|
324
|
+
* @param linePoints
|
|
325
|
+
* @param minTurnAngle Radian of minimum turn angle. 0 - 180
|
|
326
|
+
*/
|
|
327
|
+
|
|
328
|
+
function limitTurnAngle(linePoints, minTurnAngle) {
|
|
329
|
+
if (!(minTurnAngle <= 180 && minTurnAngle > 0)) {
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
minTurnAngle = minTurnAngle / 180 * Math.PI; // The line points can be
|
|
334
|
+
// /pt1----pt2 (label)
|
|
335
|
+
// /
|
|
336
|
+
// pt0/
|
|
337
|
+
|
|
338
|
+
pt0.fromArray(linePoints[0]);
|
|
339
|
+
pt1.fromArray(linePoints[1]);
|
|
340
|
+
pt2.fromArray(linePoints[2]);
|
|
341
|
+
Point.sub(dir, pt0, pt1);
|
|
342
|
+
Point.sub(dir2, pt2, pt1);
|
|
343
|
+
var len1 = dir.len();
|
|
344
|
+
var len2 = dir2.len();
|
|
345
|
+
|
|
346
|
+
if (len1 < 1e-3 || len2 < 1e-3) {
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
dir.scale(1 / len1);
|
|
351
|
+
dir2.scale(1 / len2);
|
|
352
|
+
var angleCos = dir.dot(dir2);
|
|
353
|
+
var minTurnAngleCos = Math.cos(minTurnAngle);
|
|
354
|
+
|
|
355
|
+
if (minTurnAngleCos < angleCos) {
|
|
356
|
+
// Smaller than minTurnAngle
|
|
357
|
+
// Calculate project point of pt0 on pt1-pt2
|
|
358
|
+
var d = projectPointToLine(pt1.x, pt1.y, pt2.x, pt2.y, pt0.x, pt0.y, tmpArr, false);
|
|
359
|
+
tmpProjPoint.fromArray(tmpArr); // Calculate new projected length with limited minTurnAngle and get the new connect point
|
|
360
|
+
|
|
361
|
+
tmpProjPoint.scaleAndAdd(dir2, d / Math.tan(Math.PI - minTurnAngle)); // Limit the new calculated connect point between pt1 and pt2.
|
|
362
|
+
|
|
363
|
+
var t = pt2.x !== pt1.x ? (tmpProjPoint.x - pt1.x) / (pt2.x - pt1.x) : (tmpProjPoint.y - pt1.y) / (pt2.y - pt1.y);
|
|
364
|
+
|
|
365
|
+
if (isNaN(t)) {
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
if (t < 0) {
|
|
370
|
+
Point.copy(tmpProjPoint, pt1);
|
|
371
|
+
} else if (t > 1) {
|
|
372
|
+
Point.copy(tmpProjPoint, pt2);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
tmpProjPoint.toArray(linePoints[1]);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Limit the angle of line and the surface
|
|
380
|
+
* @param maxSurfaceAngle Radian of minimum turn angle. 0 - 180. 0 is same direction to normal. 180 is opposite
|
|
381
|
+
*/
|
|
382
|
+
|
|
383
|
+
function limitSurfaceAngle(linePoints, surfaceNormal, maxSurfaceAngle) {
|
|
384
|
+
if (!(maxSurfaceAngle <= 180 && maxSurfaceAngle > 0)) {
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
maxSurfaceAngle = maxSurfaceAngle / 180 * Math.PI;
|
|
389
|
+
pt0.fromArray(linePoints[0]);
|
|
390
|
+
pt1.fromArray(linePoints[1]);
|
|
391
|
+
pt2.fromArray(linePoints[2]);
|
|
392
|
+
Point.sub(dir, pt1, pt0);
|
|
393
|
+
Point.sub(dir2, pt2, pt1);
|
|
394
|
+
var len1 = dir.len();
|
|
395
|
+
var len2 = dir2.len();
|
|
396
|
+
|
|
397
|
+
if (len1 < 1e-3 || len2 < 1e-3) {
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
dir.scale(1 / len1);
|
|
402
|
+
dir2.scale(1 / len2);
|
|
403
|
+
var angleCos = dir.dot(surfaceNormal);
|
|
404
|
+
var maxSurfaceAngleCos = Math.cos(maxSurfaceAngle);
|
|
405
|
+
|
|
406
|
+
if (angleCos < maxSurfaceAngleCos) {
|
|
407
|
+
// Calculate project point of pt0 on pt1-pt2
|
|
408
|
+
var d = projectPointToLine(pt1.x, pt1.y, pt2.x, pt2.y, pt0.x, pt0.y, tmpArr, false);
|
|
409
|
+
tmpProjPoint.fromArray(tmpArr);
|
|
410
|
+
var HALF_PI = Math.PI / 2;
|
|
411
|
+
var angle2 = Math.acos(dir2.dot(surfaceNormal));
|
|
412
|
+
var newAngle = HALF_PI + angle2 - maxSurfaceAngle;
|
|
413
|
+
|
|
414
|
+
if (newAngle >= HALF_PI) {
|
|
415
|
+
// parallel
|
|
416
|
+
Point.copy(tmpProjPoint, pt2);
|
|
417
|
+
} else {
|
|
418
|
+
// Calculate new projected length with limited minTurnAngle and get the new connect point
|
|
419
|
+
tmpProjPoint.scaleAndAdd(dir2, d / Math.tan(Math.PI / 2 - newAngle)); // Limit the new calculated connect point between pt1 and pt2.
|
|
420
|
+
|
|
421
|
+
var t = pt2.x !== pt1.x ? (tmpProjPoint.x - pt1.x) / (pt2.x - pt1.x) : (tmpProjPoint.y - pt1.y) / (pt2.y - pt1.y);
|
|
422
|
+
|
|
423
|
+
if (isNaN(t)) {
|
|
424
|
+
return;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
if (t < 0) {
|
|
428
|
+
Point.copy(tmpProjPoint, pt1);
|
|
429
|
+
} else if (t > 1) {
|
|
430
|
+
Point.copy(tmpProjPoint, pt2);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
tmpProjPoint.toArray(linePoints[1]);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
function setLabelLineState(labelLine, ignore, stateName, stateModel) {
|
|
439
|
+
var isNormal = stateName === 'normal';
|
|
440
|
+
var stateObj = isNormal ? labelLine : labelLine.ensureState(stateName); // Make sure display.
|
|
441
|
+
|
|
442
|
+
stateObj.ignore = ignore; // Set smooth
|
|
443
|
+
|
|
444
|
+
var smooth = stateModel.get('smooth');
|
|
445
|
+
|
|
446
|
+
if (smooth && smooth === true) {
|
|
447
|
+
smooth = 0.3;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
stateObj.shape = stateObj.shape || {};
|
|
451
|
+
|
|
452
|
+
if (smooth > 0) {
|
|
453
|
+
stateObj.shape.smooth = smooth;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
var styleObj = stateModel.getModel('lineStyle').getLineStyle();
|
|
457
|
+
isNormal ? labelLine.useStyle(styleObj) : stateObj.style = styleObj;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
function buildLabelLinePath(path, shape) {
|
|
461
|
+
var smooth = shape.smooth;
|
|
462
|
+
var points = shape.points;
|
|
463
|
+
|
|
464
|
+
if (!points) {
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
path.moveTo(points[0][0], points[0][1]);
|
|
469
|
+
|
|
470
|
+
if (smooth > 0 && points.length >= 3) {
|
|
471
|
+
var len1 = dist(points[0], points[1]);
|
|
472
|
+
var len2 = dist(points[1], points[2]);
|
|
473
|
+
|
|
474
|
+
if (!len1 || !len2) {
|
|
475
|
+
path.lineTo(points[1][0], points[1][1]);
|
|
476
|
+
path.lineTo(points[2][0], points[2][1]);
|
|
477
|
+
return;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
var moveLen = Math.min(len1, len2) * smooth;
|
|
481
|
+
var midPoint0 = lerp([], points[1], points[0], moveLen / len1);
|
|
482
|
+
var midPoint2 = lerp([], points[1], points[2], moveLen / len2);
|
|
483
|
+
var midPoint1 = lerp([], midPoint0, midPoint2, 0.5);
|
|
484
|
+
path.bezierCurveTo(midPoint0[0], midPoint0[1], midPoint0[0], midPoint0[1], midPoint1[0], midPoint1[1]);
|
|
485
|
+
path.bezierCurveTo(midPoint2[0], midPoint2[1], midPoint2[0], midPoint2[1], points[2][0], points[2][1]);
|
|
486
|
+
} else {
|
|
487
|
+
for (var i = 1; i < points.length; i++) {
|
|
488
|
+
path.lineTo(points[i][0], points[i][1]);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* Create a label line if necessary and set it's style.
|
|
494
|
+
*/
|
|
495
|
+
|
|
496
|
+
|
|
497
|
+
function setLabelLineStyle(targetEl, statesModels, defaultStyle) {
|
|
498
|
+
var labelLine = targetEl.getTextGuideLine();
|
|
499
|
+
var label = targetEl.getTextContent();
|
|
500
|
+
|
|
501
|
+
if (!label) {
|
|
502
|
+
// Not show label line if there is no label.
|
|
503
|
+
if (labelLine) {
|
|
504
|
+
targetEl.removeTextGuideLine();
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
return;
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
var normalModel = statesModels.normal;
|
|
511
|
+
var showNormal = normalModel.get('show');
|
|
512
|
+
var labelIgnoreNormal = label.ignore;
|
|
513
|
+
|
|
514
|
+
for (var i = 0; i < DISPLAY_STATES.length; i++) {
|
|
515
|
+
var stateName = DISPLAY_STATES[i];
|
|
516
|
+
var stateModel = statesModels[stateName];
|
|
517
|
+
var isNormal = stateName === 'normal';
|
|
518
|
+
|
|
519
|
+
if (stateModel) {
|
|
520
|
+
var stateShow = stateModel.get('show');
|
|
521
|
+
var isLabelIgnored = isNormal ? labelIgnoreNormal : retrieve2(label.states[stateName] && label.states[stateName].ignore, labelIgnoreNormal);
|
|
522
|
+
|
|
523
|
+
if (isLabelIgnored // Not show when label is not shown in this state.
|
|
524
|
+
|| !retrieve2(stateShow, showNormal) // Use normal state by default if not set.
|
|
525
|
+
) {
|
|
526
|
+
var stateObj = isNormal ? labelLine : labelLine && labelLine.states[stateName];
|
|
527
|
+
|
|
528
|
+
if (stateObj) {
|
|
529
|
+
stateObj.ignore = true;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
continue;
|
|
533
|
+
} // Create labelLine if not exists
|
|
534
|
+
|
|
535
|
+
|
|
536
|
+
if (!labelLine) {
|
|
537
|
+
labelLine = new Polyline();
|
|
538
|
+
targetEl.setTextGuideLine(labelLine); // Reset state of normal because it's new created.
|
|
539
|
+
// NOTE: NORMAL should always been the first!
|
|
540
|
+
|
|
541
|
+
if (!isNormal && (labelIgnoreNormal || !showNormal)) {
|
|
542
|
+
setLabelLineState(labelLine, true, 'normal', statesModels.normal);
|
|
543
|
+
} // Use same state proxy.
|
|
544
|
+
|
|
545
|
+
|
|
546
|
+
if (targetEl.stateProxy) {
|
|
547
|
+
labelLine.stateProxy = targetEl.stateProxy;
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
setLabelLineState(labelLine, false, stateName, stateModel);
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
if (labelLine) {
|
|
556
|
+
defaults(labelLine.style, defaultStyle); // Not fill.
|
|
557
|
+
|
|
558
|
+
labelLine.style.fill = null;
|
|
559
|
+
var showAbove = normalModel.get('showAbove');
|
|
560
|
+
var labelLineConfig = targetEl.textGuideLineConfig = targetEl.textGuideLineConfig || {};
|
|
561
|
+
labelLineConfig.showAbove = showAbove || false; // Custom the buildPath.
|
|
562
|
+
|
|
563
|
+
labelLine.buildPath = buildLabelLinePath;
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
function getLabelLineStatesModels(itemModel, labelLineName) {
|
|
567
|
+
labelLineName = labelLineName || 'labelLine';
|
|
568
|
+
var statesModels = {
|
|
569
|
+
normal: itemModel.getModel(labelLineName)
|
|
570
|
+
};
|
|
571
|
+
|
|
572
|
+
for (var i = 0; i < SPECIAL_STATES.length; i++) {
|
|
573
|
+
var stateName = SPECIAL_STATES[i];
|
|
574
|
+
statesModels[stateName] = itemModel.getModel([stateName, labelLineName]);
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
return statesModels;
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
function cloneArr(points) {
|
|
581
|
+
if (points) {
|
|
582
|
+
var newPoints = [];
|
|
583
|
+
|
|
584
|
+
for (var i = 0; i < points.length; i++) {
|
|
585
|
+
newPoints.push(points[i].slice());
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
return newPoints;
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
function prepareLayoutCallbackParams(labelItem, hostEl) {
|
|
593
|
+
var label = labelItem.label;
|
|
594
|
+
var labelLine = hostEl && hostEl.getTextGuideLine();
|
|
595
|
+
return {
|
|
596
|
+
dataIndex: labelItem.dataIndex,
|
|
597
|
+
dataType: labelItem.dataType,
|
|
598
|
+
seriesIndex: labelItem.seriesModel.seriesIndex,
|
|
599
|
+
text: labelItem.label.style.text,
|
|
600
|
+
rect: labelItem.hostRect,
|
|
601
|
+
labelRect: labelItem.rect,
|
|
602
|
+
// x: labelAttr.x,
|
|
603
|
+
// y: labelAttr.y,
|
|
604
|
+
align: label.style.align,
|
|
605
|
+
verticalAlign: label.style.verticalAlign,
|
|
606
|
+
labelLinePoints: cloneArr(labelLine && labelLine.shape.points)
|
|
607
|
+
};
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
var LABEL_OPTION_TO_STYLE_KEYS = ['align', 'verticalAlign', 'width', 'height', 'fontSize'];
|
|
611
|
+
var dummyTransformable = new Transformable();
|
|
612
|
+
var labelLayoutInnerStore = makeInner();
|
|
613
|
+
var labelLineAnimationStore = makeInner();
|
|
614
|
+
|
|
615
|
+
function extendWithKeys(target, source, keys) {
|
|
616
|
+
for (var i = 0; i < keys.length; i++) {
|
|
617
|
+
var key = keys[i];
|
|
618
|
+
|
|
619
|
+
if (source[key] != null) {
|
|
620
|
+
target[key] = source[key];
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
var LABEL_LAYOUT_PROPS = ['x', 'y', 'rotation'];
|
|
626
|
+
|
|
627
|
+
var LabelManager =
|
|
628
|
+
/** @class */
|
|
629
|
+
function () {
|
|
630
|
+
function LabelManager() {
|
|
631
|
+
this._labelList = [];
|
|
632
|
+
this._chartViewList = [];
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
LabelManager.prototype.clearLabels = function () {
|
|
636
|
+
this._labelList = [];
|
|
637
|
+
this._chartViewList = [];
|
|
638
|
+
};
|
|
639
|
+
/**
|
|
640
|
+
* Add label to manager
|
|
641
|
+
*/
|
|
642
|
+
|
|
643
|
+
|
|
644
|
+
LabelManager.prototype._addLabel = function (dataIndex, dataType, seriesModel, label, layoutOption) {
|
|
645
|
+
var labelStyle = label.style;
|
|
646
|
+
var hostEl = label.__hostTarget;
|
|
647
|
+
var textConfig = hostEl.textConfig || {}; // TODO: If label is in other state.
|
|
648
|
+
|
|
649
|
+
var labelTransform = label.getComputedTransform();
|
|
650
|
+
var labelRect = label.getBoundingRect().plain();
|
|
651
|
+
BoundingRect.applyTransform(labelRect, labelRect, labelTransform);
|
|
652
|
+
|
|
653
|
+
if (labelTransform) {
|
|
654
|
+
dummyTransformable.setLocalTransform(labelTransform);
|
|
655
|
+
} else {
|
|
656
|
+
// Identity transform.
|
|
657
|
+
dummyTransformable.x = dummyTransformable.y = dummyTransformable.rotation = dummyTransformable.originX = dummyTransformable.originY = 0;
|
|
658
|
+
dummyTransformable.scaleX = dummyTransformable.scaleY = 1;
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
var host = label.__hostTarget;
|
|
662
|
+
var hostRect;
|
|
663
|
+
|
|
664
|
+
if (host) {
|
|
665
|
+
hostRect = host.getBoundingRect().plain();
|
|
666
|
+
var transform = host.getComputedTransform();
|
|
667
|
+
BoundingRect.applyTransform(hostRect, hostRect, transform);
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
var labelGuide = hostRect && host.getTextGuideLine();
|
|
671
|
+
|
|
672
|
+
this._labelList.push({
|
|
673
|
+
label: label,
|
|
674
|
+
labelLine: labelGuide,
|
|
675
|
+
seriesModel: seriesModel,
|
|
676
|
+
dataIndex: dataIndex,
|
|
677
|
+
dataType: dataType,
|
|
678
|
+
layoutOption: layoutOption,
|
|
679
|
+
computedLayoutOption: null,
|
|
680
|
+
rect: labelRect,
|
|
681
|
+
hostRect: hostRect,
|
|
682
|
+
// Label with lower priority will be hidden when overlapped
|
|
683
|
+
// Use rect size as default priority
|
|
684
|
+
priority: hostRect ? hostRect.width * hostRect.height : 0,
|
|
685
|
+
// Save default label attributes.
|
|
686
|
+
// For restore if developers want get back to default value in callback.
|
|
687
|
+
defaultAttr: {
|
|
688
|
+
ignore: label.ignore,
|
|
689
|
+
labelGuideIgnore: labelGuide && labelGuide.ignore,
|
|
690
|
+
x: dummyTransformable.x,
|
|
691
|
+
y: dummyTransformable.y,
|
|
692
|
+
scaleX: dummyTransformable.scaleX,
|
|
693
|
+
scaleY: dummyTransformable.scaleY,
|
|
694
|
+
rotation: dummyTransformable.rotation,
|
|
695
|
+
style: {
|
|
696
|
+
x: labelStyle.x,
|
|
697
|
+
y: labelStyle.y,
|
|
698
|
+
align: labelStyle.align,
|
|
699
|
+
verticalAlign: labelStyle.verticalAlign,
|
|
700
|
+
width: labelStyle.width,
|
|
701
|
+
height: labelStyle.height,
|
|
702
|
+
fontSize: labelStyle.fontSize
|
|
703
|
+
},
|
|
704
|
+
cursor: label.cursor,
|
|
705
|
+
attachedPos: textConfig.position,
|
|
706
|
+
attachedRot: textConfig.rotation
|
|
707
|
+
}
|
|
708
|
+
});
|
|
709
|
+
};
|
|
710
|
+
|
|
711
|
+
LabelManager.prototype.addLabelsOfSeries = function (chartView) {
|
|
712
|
+
var _this = this;
|
|
713
|
+
|
|
714
|
+
this._chartViewList.push(chartView);
|
|
715
|
+
|
|
716
|
+
var seriesModel = chartView.__model;
|
|
717
|
+
var layoutOption = seriesModel.get('labelLayout');
|
|
718
|
+
/**
|
|
719
|
+
* Ignore layouting if it's not specified anything.
|
|
720
|
+
*/
|
|
721
|
+
|
|
722
|
+
if (!(isFunction(layoutOption) || keys(layoutOption).length)) {
|
|
723
|
+
return;
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
chartView.group.traverse(function (child) {
|
|
727
|
+
if (child.ignore) {
|
|
728
|
+
return true; // Stop traverse descendants.
|
|
729
|
+
} // Only support label being hosted on graphic elements.
|
|
730
|
+
|
|
731
|
+
|
|
732
|
+
var textEl = child.getTextContent();
|
|
733
|
+
var ecData = getECData(child); // Can only attach the text on the element with dataIndex
|
|
734
|
+
|
|
735
|
+
if (textEl && !textEl.disableLabelLayout) {
|
|
736
|
+
_this._addLabel(ecData.dataIndex, ecData.dataType, seriesModel, textEl, layoutOption);
|
|
737
|
+
}
|
|
738
|
+
});
|
|
739
|
+
};
|
|
740
|
+
|
|
741
|
+
LabelManager.prototype.updateLayoutConfig = function (api) {
|
|
742
|
+
var width = api.getWidth();
|
|
743
|
+
var height = api.getHeight();
|
|
744
|
+
|
|
745
|
+
function createDragHandler(el, labelLineModel) {
|
|
746
|
+
return function () {
|
|
747
|
+
updateLabelLinePoints(el, labelLineModel);
|
|
748
|
+
};
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
for (var i = 0; i < this._labelList.length; i++) {
|
|
752
|
+
var labelItem = this._labelList[i];
|
|
753
|
+
var label = labelItem.label;
|
|
754
|
+
var hostEl = label.__hostTarget;
|
|
755
|
+
var defaultLabelAttr = labelItem.defaultAttr;
|
|
756
|
+
var layoutOption = void 0; // TODO A global layout option?
|
|
757
|
+
|
|
758
|
+
if (isFunction(labelItem.layoutOption)) {
|
|
759
|
+
layoutOption = labelItem.layoutOption(prepareLayoutCallbackParams(labelItem, hostEl));
|
|
760
|
+
} else {
|
|
761
|
+
layoutOption = labelItem.layoutOption;
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
layoutOption = layoutOption || {};
|
|
765
|
+
labelItem.computedLayoutOption = layoutOption;
|
|
766
|
+
var degreeToRadian = Math.PI / 180; // TODO hostEl should always exists.
|
|
767
|
+
// Or label should not have parent because the x, y is all in global space.
|
|
768
|
+
|
|
769
|
+
if (hostEl) {
|
|
770
|
+
hostEl.setTextConfig({
|
|
771
|
+
// Force to set local false.
|
|
772
|
+
local: false,
|
|
773
|
+
// Ignore position and rotation config on the host el if x or y is changed.
|
|
774
|
+
position: layoutOption.x != null || layoutOption.y != null ? null : defaultLabelAttr.attachedPos,
|
|
775
|
+
// Ignore rotation config on the host el if rotation is changed.
|
|
776
|
+
rotation: layoutOption.rotate != null ? layoutOption.rotate * degreeToRadian : defaultLabelAttr.attachedRot,
|
|
777
|
+
offset: [layoutOption.dx || 0, layoutOption.dy || 0]
|
|
778
|
+
});
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
var needsUpdateLabelLine = false;
|
|
782
|
+
|
|
783
|
+
if (layoutOption.x != null) {
|
|
784
|
+
// TODO width of chart view.
|
|
785
|
+
label.x = parsePercent(layoutOption.x, width);
|
|
786
|
+
label.setStyle('x', 0); // Ignore movement in style. TODO: origin.
|
|
787
|
+
|
|
788
|
+
needsUpdateLabelLine = true;
|
|
789
|
+
} else {
|
|
790
|
+
label.x = defaultLabelAttr.x;
|
|
791
|
+
label.setStyle('x', defaultLabelAttr.style.x);
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
if (layoutOption.y != null) {
|
|
795
|
+
// TODO height of chart view.
|
|
796
|
+
label.y = parsePercent(layoutOption.y, height);
|
|
797
|
+
label.setStyle('y', 0); // Ignore movement in style.
|
|
798
|
+
|
|
799
|
+
needsUpdateLabelLine = true;
|
|
800
|
+
} else {
|
|
801
|
+
label.y = defaultLabelAttr.y;
|
|
802
|
+
label.setStyle('y', defaultLabelAttr.style.y);
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
if (layoutOption.labelLinePoints) {
|
|
806
|
+
var guideLine = hostEl.getTextGuideLine();
|
|
807
|
+
|
|
808
|
+
if (guideLine) {
|
|
809
|
+
guideLine.setShape({
|
|
810
|
+
points: layoutOption.labelLinePoints
|
|
811
|
+
}); // Not update
|
|
812
|
+
|
|
813
|
+
needsUpdateLabelLine = false;
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
var labelLayoutStore = labelLayoutInnerStore(label);
|
|
818
|
+
labelLayoutStore.needsUpdateLabelLine = needsUpdateLabelLine;
|
|
819
|
+
label.rotation = layoutOption.rotate != null ? layoutOption.rotate * degreeToRadian : defaultLabelAttr.rotation;
|
|
820
|
+
label.scaleX = defaultLabelAttr.scaleX;
|
|
821
|
+
label.scaleY = defaultLabelAttr.scaleY;
|
|
822
|
+
|
|
823
|
+
for (var k = 0; k < LABEL_OPTION_TO_STYLE_KEYS.length; k++) {
|
|
824
|
+
var key = LABEL_OPTION_TO_STYLE_KEYS[k];
|
|
825
|
+
label.setStyle(key, layoutOption[key] != null ? layoutOption[key] : defaultLabelAttr.style[key]);
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
if (layoutOption.draggable) {
|
|
829
|
+
label.draggable = true;
|
|
830
|
+
label.cursor = 'move';
|
|
831
|
+
|
|
832
|
+
if (hostEl) {
|
|
833
|
+
var hostModel = labelItem.seriesModel;
|
|
834
|
+
|
|
835
|
+
if (labelItem.dataIndex != null) {
|
|
836
|
+
var data = labelItem.seriesModel.getData(labelItem.dataType);
|
|
837
|
+
hostModel = data.getItemModel(labelItem.dataIndex);
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
label.on('drag', createDragHandler(hostEl, hostModel.getModel('labelLine')));
|
|
841
|
+
}
|
|
842
|
+
} else {
|
|
843
|
+
// TODO Other drag functions?
|
|
844
|
+
label.off('drag');
|
|
845
|
+
label.cursor = defaultLabelAttr.cursor;
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
};
|
|
849
|
+
|
|
850
|
+
LabelManager.prototype.layout = function (api) {
|
|
851
|
+
var width = api.getWidth();
|
|
852
|
+
var height = api.getHeight();
|
|
853
|
+
var labelList = prepareLayoutList(this._labelList);
|
|
854
|
+
var labelsNeedsAdjustOnX = filter(labelList, function (item) {
|
|
855
|
+
return item.layoutOption.moveOverlap === 'shiftX';
|
|
856
|
+
});
|
|
857
|
+
var labelsNeedsAdjustOnY = filter(labelList, function (item) {
|
|
858
|
+
return item.layoutOption.moveOverlap === 'shiftY';
|
|
859
|
+
});
|
|
860
|
+
shiftLayoutOnX(labelsNeedsAdjustOnX, 0, width);
|
|
861
|
+
shiftLayoutOnY(labelsNeedsAdjustOnY, 0, height);
|
|
862
|
+
var labelsNeedsHideOverlap = filter(labelList, function (item) {
|
|
863
|
+
return item.layoutOption.hideOverlap;
|
|
864
|
+
});
|
|
865
|
+
hideOverlap(labelsNeedsHideOverlap);
|
|
866
|
+
};
|
|
867
|
+
/**
|
|
868
|
+
* Process all labels. Not only labels with layoutOption.
|
|
869
|
+
*/
|
|
870
|
+
|
|
871
|
+
|
|
872
|
+
LabelManager.prototype.processLabelsOverall = function () {
|
|
873
|
+
var _this = this;
|
|
874
|
+
|
|
875
|
+
each(this._chartViewList, function (chartView) {
|
|
876
|
+
var seriesModel = chartView.__model;
|
|
877
|
+
var ignoreLabelLineUpdate = chartView.ignoreLabelLineUpdate;
|
|
878
|
+
var animationEnabled = seriesModel.isAnimationEnabled();
|
|
879
|
+
chartView.group.traverse(function (child) {
|
|
880
|
+
if (child.ignore && !child.forceLabelAnimation) {
|
|
881
|
+
return true; // Stop traverse descendants.
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
var needsUpdateLabelLine = !ignoreLabelLineUpdate;
|
|
885
|
+
var label = child.getTextContent();
|
|
886
|
+
|
|
887
|
+
if (!needsUpdateLabelLine && label) {
|
|
888
|
+
needsUpdateLabelLine = labelLayoutInnerStore(label).needsUpdateLabelLine;
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
if (needsUpdateLabelLine) {
|
|
892
|
+
_this._updateLabelLine(child, seriesModel);
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
if (animationEnabled) {
|
|
896
|
+
_this._animateLabels(child, seriesModel);
|
|
897
|
+
}
|
|
898
|
+
});
|
|
899
|
+
});
|
|
900
|
+
};
|
|
901
|
+
|
|
902
|
+
LabelManager.prototype._updateLabelLine = function (el, seriesModel) {
|
|
903
|
+
// Only support label being hosted on graphic elements.
|
|
904
|
+
var textEl = el.getTextContent(); // Update label line style.
|
|
905
|
+
|
|
906
|
+
var ecData = getECData(el);
|
|
907
|
+
var dataIndex = ecData.dataIndex; // Only support labelLine on the labels represent data.
|
|
908
|
+
|
|
909
|
+
if (textEl && dataIndex != null) {
|
|
910
|
+
var data = seriesModel.getData(ecData.dataType);
|
|
911
|
+
var itemModel = data.getItemModel(dataIndex);
|
|
912
|
+
var defaultStyle = {};
|
|
913
|
+
var visualStyle = data.getItemVisual(dataIndex, 'style');
|
|
914
|
+
var visualType = data.getVisual('drawType'); // Default to be same with main color
|
|
915
|
+
|
|
916
|
+
defaultStyle.stroke = visualStyle[visualType];
|
|
917
|
+
var labelLineModel = itemModel.getModel('labelLine');
|
|
918
|
+
setLabelLineStyle(el, getLabelLineStatesModels(itemModel), defaultStyle);
|
|
919
|
+
updateLabelLinePoints(el, labelLineModel);
|
|
920
|
+
}
|
|
921
|
+
};
|
|
922
|
+
|
|
923
|
+
LabelManager.prototype._animateLabels = function (el, seriesModel) {
|
|
924
|
+
var textEl = el.getTextContent();
|
|
925
|
+
var guideLine = el.getTextGuideLine(); // Animate
|
|
926
|
+
|
|
927
|
+
if (textEl // `forceLabelAnimation` has the highest priority
|
|
928
|
+
&& (el.forceLabelAnimation || !textEl.ignore && !textEl.invisible && !el.disableLabelAnimation && !isElementRemoved(el))) {
|
|
929
|
+
var layoutStore = labelLayoutInnerStore(textEl);
|
|
930
|
+
var oldLayout = layoutStore.oldLayout;
|
|
931
|
+
var ecData = getECData(el);
|
|
932
|
+
var dataIndex = ecData.dataIndex;
|
|
933
|
+
var newProps = {
|
|
934
|
+
x: textEl.x,
|
|
935
|
+
y: textEl.y,
|
|
936
|
+
rotation: textEl.rotation
|
|
937
|
+
};
|
|
938
|
+
var data = seriesModel.getData(ecData.dataType);
|
|
939
|
+
|
|
940
|
+
if (!oldLayout) {
|
|
941
|
+
textEl.attr(newProps); // Disable fade in animation if value animation is enabled.
|
|
942
|
+
|
|
943
|
+
if (!labelInner(textEl).valueAnimation) {
|
|
944
|
+
var oldOpacity = retrieve2(textEl.style.opacity, 1); // Fade in animation
|
|
945
|
+
|
|
946
|
+
textEl.style.opacity = 0;
|
|
947
|
+
initProps(textEl, {
|
|
948
|
+
style: {
|
|
949
|
+
opacity: oldOpacity
|
|
950
|
+
}
|
|
951
|
+
}, seriesModel, dataIndex);
|
|
952
|
+
}
|
|
953
|
+
} else {
|
|
954
|
+
textEl.attr(oldLayout); // Make sure the animation from is in the right status.
|
|
955
|
+
|
|
956
|
+
var prevStates = el.prevStates;
|
|
957
|
+
|
|
958
|
+
if (prevStates) {
|
|
959
|
+
if (indexOf(prevStates, 'select') >= 0) {
|
|
960
|
+
textEl.attr(layoutStore.oldLayoutSelect);
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
if (indexOf(prevStates, 'emphasis') >= 0) {
|
|
964
|
+
textEl.attr(layoutStore.oldLayoutEmphasis);
|
|
965
|
+
}
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
updateProps(textEl, newProps, seriesModel, dataIndex);
|
|
969
|
+
}
|
|
970
|
+
|
|
971
|
+
layoutStore.oldLayout = newProps;
|
|
972
|
+
|
|
973
|
+
if (textEl.states.select) {
|
|
974
|
+
var layoutSelect = layoutStore.oldLayoutSelect = {};
|
|
975
|
+
extendWithKeys(layoutSelect, newProps, LABEL_LAYOUT_PROPS);
|
|
976
|
+
extendWithKeys(layoutSelect, textEl.states.select, LABEL_LAYOUT_PROPS);
|
|
977
|
+
}
|
|
978
|
+
|
|
979
|
+
if (textEl.states.emphasis) {
|
|
980
|
+
var layoutEmphasis = layoutStore.oldLayoutEmphasis = {};
|
|
981
|
+
extendWithKeys(layoutEmphasis, newProps, LABEL_LAYOUT_PROPS);
|
|
982
|
+
extendWithKeys(layoutEmphasis, textEl.states.emphasis, LABEL_LAYOUT_PROPS);
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
animateLabelValue(textEl, dataIndex, data, seriesModel, seriesModel);
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
if (guideLine && !guideLine.ignore && !guideLine.invisible) {
|
|
989
|
+
var layoutStore = labelLineAnimationStore(guideLine);
|
|
990
|
+
var oldLayout = layoutStore.oldLayout;
|
|
991
|
+
var newLayout = {
|
|
992
|
+
points: guideLine.shape.points
|
|
993
|
+
};
|
|
994
|
+
|
|
995
|
+
if (!oldLayout) {
|
|
996
|
+
guideLine.setShape(newLayout);
|
|
997
|
+
guideLine.style.strokePercent = 0;
|
|
998
|
+
initProps(guideLine, {
|
|
999
|
+
style: {
|
|
1000
|
+
strokePercent: 1
|
|
1001
|
+
}
|
|
1002
|
+
}, seriesModel);
|
|
1003
|
+
} else {
|
|
1004
|
+
guideLine.attr({
|
|
1005
|
+
shape: oldLayout
|
|
1006
|
+
});
|
|
1007
|
+
updateProps(guideLine, {
|
|
1008
|
+
shape: newLayout
|
|
1009
|
+
}, seriesModel);
|
|
1010
|
+
}
|
|
1011
|
+
|
|
1012
|
+
layoutStore.oldLayout = newLayout;
|
|
1013
|
+
}
|
|
1014
|
+
};
|
|
1015
|
+
|
|
1016
|
+
return LabelManager;
|
|
1017
|
+
}();
|
|
1018
|
+
|
|
1019
|
+
var getLabelManager = makeInner();
|
|
1020
|
+
function installLabelLayout(registers) {
|
|
1021
|
+
registers.registerUpdateLifecycle('series:beforeupdate', function (ecModel, api, params) {
|
|
1022
|
+
// TODO api provide an namespace that can save stuff per instance
|
|
1023
|
+
var labelManager = getLabelManager(api).labelManager;
|
|
1024
|
+
|
|
1025
|
+
if (!labelManager) {
|
|
1026
|
+
labelManager = getLabelManager(api).labelManager = new LabelManager();
|
|
1027
|
+
}
|
|
1028
|
+
|
|
1029
|
+
labelManager.clearLabels();
|
|
1030
|
+
});
|
|
1031
|
+
registers.registerUpdateLifecycle('series:layoutlabels', function (ecModel, api, params) {
|
|
1032
|
+
var labelManager = getLabelManager(api).labelManager;
|
|
1033
|
+
params.updatedSeries.forEach(function (series) {
|
|
1034
|
+
labelManager.addLabelsOfSeries(api.getViewOfSeriesModel(series));
|
|
1035
|
+
});
|
|
1036
|
+
labelManager.updateLayoutConfig(api);
|
|
1037
|
+
labelManager.layout(api);
|
|
1038
|
+
labelManager.processLabelsOverall();
|
|
1039
|
+
});
|
|
1040
|
+
}
|
|
1041
|
+
|
|
1042
|
+
export { limitSurfaceAngle as a, getLabelLineStatesModels as g, installLabelLayout as i, limitTurnAngle as l, setLabelLineStyle as s };
|