@visactor/vrender-components
Version:
components library for dp visualization
104 lines (99 loc) • 7.53 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: !0
}), exports.Indicator = void 0;
const vutils_1 = require("@visactor/vutils"), base_1 = require("../core/base"), util_1 = require("../util"), config_1 = require("./config"), register_1 = require("./register");
(0, register_1.loadIndicatorComponent)();
class Indicator extends base_1.AbstractComponent {
constructor() {
super(...arguments), this.name = "indicator";
}
_renderText(group, title, limit, limitRatio, themePath, graphicName) {
if (!1 !== title.visible) {
const titleStyle = (0, vutils_1.merge)({}, (0, vutils_1.get)(config_1.DEFAULT_INDICATOR_THEME, themePath), title.style, {
visible: title.visible
});
titleStyle.lineHeight = (0, vutils_1.isValid)(titleStyle.lineHeight) ? titleStyle.lineHeight : titleStyle.fontSize,
title.formatMethod && (titleStyle._originText = titleStyle.text, titleStyle.text = title.formatMethod(titleStyle.text, titleStyle));
const textGraphic = (0, util_1.createTextGraphicByType)(titleStyle);
return textGraphic.name = graphicName, group.appendChild(textGraphic), title.autoFit && (0,
vutils_1.isValidNumber)(limit) && this._setLocalAutoFit(limit, textGraphic, title),
title.autoLimit && (0, vutils_1.isValidNumber)(limitRatio) && textGraphic.setAttribute("maxLineWidth", limit),
textGraphic;
}
}
render() {
var _a, _b;
if (this.removeAllChild(!0), !0 !== this.attribute.visible) return;
const {title: title = {}, content: content, size: size, limitRatio: limitRatio = 1 / 0} = this.attribute, limit = Math.min(size.width, size.height) * limitRatio, group = this.createOrUpdateChild("indicator-container", {
x: 0,
y: 0,
zIndex: 1,
pickable: null === (_a = this.attribute.pickable) || void 0 === _a || _a
}, "group");
if ((0, vutils_1.isValid)(title) && (this._title = this._renderText(group, title, limit, limitRatio, "title.style", "indicator-title")),
(0, vutils_1.isValid)(content)) {
const contents = (0, vutils_1.array)(content), contentComponents = [];
contents.forEach(((contentItem, i) => {
!1 !== contentItem.visible && contentComponents.push(this._renderText(group, contentItem, limit, limitRatio, "content.style", "indicator-content-" + i));
})), this._content = contentComponents;
}
this._setGlobalAutoFit(limit), this._setYPosition();
const totalHeight = null !== (_b = null == group ? void 0 : group.AABBBounds.height()) && void 0 !== _b ? _b : 0;
group.setAttribute("y", size.height / 2 - totalHeight / 2), group.setAttribute("x", size.width / 2);
}
_setLocalAutoFit(limit, indicatorItem, indicatorItemSpec) {
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
if ("default" !== (null !== (_a = indicatorItemSpec.fitStrategy) && void 0 !== _a ? _a : "default")) return;
const originWidth = (0, util_1.measureTextSize)(null !== (_c = null === (_b = indicatorItemSpec.style) || void 0 === _b ? void 0 : _b.text) && void 0 !== _c ? _c : "", null !== (_d = indicatorItemSpec.style) && void 0 !== _d ? _d : {}, null === (_f = null === (_e = this.stage) || void 0 === _e ? void 0 : _e.getTheme()) || void 0 === _f ? void 0 : _f.text).width;
if (originWidth > 0) {
const ratio = limit * (null !== (_g = indicatorItemSpec.fitPercent) && void 0 !== _g ? _g : .5) / originWidth, fontSize = Math.floor((null !== (_j = null === (_h = indicatorItemSpec.style) || void 0 === _h ? void 0 : _h.fontSize) && void 0 !== _j ? _j : 20) * ratio);
indicatorItem.setAttribute("fontSize", fontSize), indicatorItem.setAttribute("lineHeight", (0,
vutils_1.isValid)(indicatorItemSpec.style.lineHeight) ? indicatorItemSpec.style.lineHeight : fontSize);
}
}
_setGlobalAutoFit(limit) {
var _a, _b, _c, _d, _e, _f, _g;
const r = limit / 2, autoFitTexts = [];
let otherHeight = 0;
const titleSpec = null !== (_a = this.attribute.title) && void 0 !== _a ? _a : {};
titleSpec.autoFit && "inscribed" === titleSpec.fitStrategy ? (this._title.setAttribute("fontSize", 12),
autoFitTexts.push({
text: this._title,
spec: null !== (_b = this.attribute.title) && void 0 !== _b ? _b : {}
})) : otherHeight += null !== (_f = null === (_e = null === (_d = null === (_c = this._title) || void 0 === _c ? void 0 : _c.AABBBounds) || void 0 === _d ? void 0 : _d.height) || void 0 === _e ? void 0 : _e.call(_d)) && void 0 !== _f ? _f : 0;
const titleSpace = null !== (_g = titleSpec.space) && void 0 !== _g ? _g : 0;
if (otherHeight += titleSpace, (0, vutils_1.array)(this.attribute.content).filter((contentSpec => !1 !== contentSpec.visible)).forEach(((contentSpec, index) => {
var _a, _b, _c, _d;
const contentText = this._content[index];
contentSpec.autoFit && "inscribed" === contentSpec.fitStrategy ? (contentText.setAttribute("fontSize", 12),
autoFitTexts.push({
text: contentText,
spec: contentSpec
})) : otherHeight += null !== (_c = null === (_b = null === (_a = null == contentText ? void 0 : contentText.AABBBounds) || void 0 === _a ? void 0 : _a.height) || void 0 === _b ? void 0 : _b.call(_a)) && void 0 !== _c ? _c : 0;
const contentSpace = null !== (_d = contentSpec.space) && void 0 !== _d ? _d : 0;
otherHeight += contentSpace;
})), autoFitTexts.length <= 0) return;
const ra = 12 / autoFitTexts.reduce(((width, textItem) => Math.max(width, textItem.text.AABBBounds.width())), 0) * autoFitTexts.length, h = otherHeight / 2, a = ra ** 2 + 1, b = 2 * h * ra, c = h ** 2 - r ** 2, y = 2 * (ra * ((-b + Math.sqrt(b ** 2 - 4 * a * c)) / (2 * a)) + h), lineHeight = (y - otherHeight) / autoFitTexts.length;
(0, vutils_1.isValidNumber)(y) && autoFitTexts.forEach((textItem => {
var _a;
const specLineHeight = null === (_a = textItem.spec.style) || void 0 === _a ? void 0 : _a.lineHeight;
textItem.text.setAttribute("fontSize", lineHeight), textItem.text.setAttribute("lineHeight", (0,
vutils_1.isValid)(specLineHeight) ? specLineHeight : lineHeight);
}));
}
_setYPosition() {
var _a, _b, _c, _d, _e, _f;
let lastContentHeight = 0;
const titleHeight = null !== (_d = null === (_c = null === (_b = null === (_a = this._title) || void 0 === _a ? void 0 : _a.AABBBounds) || void 0 === _b ? void 0 : _b.height) || void 0 === _c ? void 0 : _c.call(_b)) && void 0 !== _d ? _d : 0, titleSpace = null !== (_f = null === (_e = this.attribute.title) || void 0 === _e ? void 0 : _e.space) && void 0 !== _f ? _f : 0;
(0, vutils_1.array)(this.attribute.content).filter((contentSpec => !1 !== contentSpec.visible)).forEach(((contentSpec, index) => {
var _a;
const contentText = this._content[index];
contentText.setAttribute("y", titleHeight + titleSpace + lastContentHeight);
const contentSpace = null !== (_a = contentSpec.space) && void 0 !== _a ? _a : 0;
lastContentHeight += contentText.AABBBounds.height() + contentSpace;
}));
}
}
exports.Indicator = Indicator;
//# sourceMappingURL=indicator.js.map