in src/label/labelStyle.ts [199:292]
function setLabelStyle<TLabelDataIndex>(
targetEl: Element,
labelStatesModels: LabelStatesModels<LabelModel>,
opt?: SetLabelStyleOpt<TLabelDataIndex>,
stateSpecified?: Partial<Record<DisplayState, TextStyleProps>>
// TODO specified position?
) {
opt = opt || EMPTY_OBJ;
const isSetOnText = targetEl instanceof ZRText;
let needsCreateText = false;
for (let i = 0; i < DISPLAY_STATES.length; i++) {
const stateModel = labelStatesModels[DISPLAY_STATES[i]];
if (stateModel && stateModel.getShallow('show')) {
needsCreateText = true;
break;
}
}
let textContent = isSetOnText ? targetEl as ZRText : targetEl.getTextContent();
if (needsCreateText) {
if (!isSetOnText) {
// Reuse the previous
if (!textContent) {
textContent = new ZRText();
targetEl.setTextContent(textContent);
}
// Use same state proxy
if (targetEl.stateProxy) {
textContent.stateProxy = targetEl.stateProxy;
}
}
const labelStatesTexts = getLabelText(opt, labelStatesModels);
const normalModel = labelStatesModels.normal;
const showNormal = !!normalModel.getShallow('show');
const normalStyle = createTextStyle(
normalModel, stateSpecified && stateSpecified.normal, opt, false, !isSetOnText
);
normalStyle.text = labelStatesTexts.normal;
if (!isSetOnText) {
// Always create new
targetEl.setTextConfig(createTextConfig(normalModel, opt, false));
}
for (let i = 0; i < SPECIAL_STATES.length; i++) {
const stateName = SPECIAL_STATES[i];
const stateModel = labelStatesModels[stateName];
if (stateModel) {
const stateObj = textContent.ensureState(stateName);
const stateShow = !!retrieve2(stateModel.getShallow('show'), showNormal);
if (stateShow !== showNormal) {
stateObj.ignore = !stateShow;
}
stateObj.style = createTextStyle(
stateModel, stateSpecified && stateSpecified[stateName], opt, true, !isSetOnText
);
stateObj.style.text = labelStatesTexts[stateName];
if (!isSetOnText) {
const targetElEmphasisState = targetEl.ensureState(stateName);
targetElEmphasisState.textConfig = createTextConfig(stateModel, opt, true);
}
}
}
// PENDING: if there is many requirements that emphasis position
// need to be different from normal position, we might consider
// auto silent is those cases.
textContent.silent = !!normalModel.getShallow('silent');
// Keep x and y
if (textContent.style.x != null) {
normalStyle.x = textContent.style.x;
}
if (textContent.style.y != null) {
normalStyle.y = textContent.style.y;
}
textContent.ignore = !showNormal;
// Always create new style.
textContent.useStyle(normalStyle);
textContent.dirty();
if (opt.enableTextSetter) {
labelInner(textContent).setLabelText = function (interpolatedValue: InterpolatableValue) {
const labelStatesTexts = getLabelText(opt, labelStatesModels, interpolatedValue);
setLabelText(textContent, labelStatesTexts);
};
}
}
else if (textContent) {
// Not display rich text.
textContent.ignore = true;
}
targetEl.dirty();
}