in src/component/title/install.ts [144:283]
render(titleModel: TitleModel, ecModel: GlobalModel, api: ExtensionAPI) {
this.group.removeAll();
if (!titleModel.get('show')) {
return;
}
const group = this.group;
const textStyleModel = titleModel.getModel('textStyle');
const subtextStyleModel = titleModel.getModel('subtextStyle');
let textAlign = titleModel.get('textAlign');
let textVerticalAlign = zrUtil.retrieve2(
titleModel.get('textBaseline'), titleModel.get('textVerticalAlign')
);
const textEl = new graphic.Text({
style: createTextStyle(textStyleModel, {
text: titleModel.get('text'),
fill: textStyleModel.getTextColor()
}, {disableBox: true}),
z2: 10
});
const textRect = textEl.getBoundingRect();
const subText = titleModel.get('subtext');
const subTextEl = new graphic.Text({
style: createTextStyle(subtextStyleModel, {
text: subText,
fill: subtextStyleModel.getTextColor(),
y: textRect.height + titleModel.get('itemGap'),
verticalAlign: 'top'
}, {disableBox: true}),
z2: 10
});
const link = titleModel.get('link');
const sublink = titleModel.get('sublink');
const triggerEvent = titleModel.get('triggerEvent', true);
textEl.silent = !link && !triggerEvent;
subTextEl.silent = !sublink && !triggerEvent;
if (link) {
textEl.on('click', function () {
windowOpen(link, '_' + titleModel.get('target'));
});
}
if (sublink) {
subTextEl.on('click', function () {
windowOpen(sublink, '_' + titleModel.get('subtarget'));
});
}
getECData(textEl).eventData = getECData(subTextEl).eventData = triggerEvent
? {
componentType: 'title',
componentIndex: titleModel.componentIndex
}
: null;
group.add(textEl);
subText && group.add(subTextEl);
// If no subText, but add subTextEl, there will be an empty line.
let groupRect = group.getBoundingRect();
const layoutOption = titleModel.getBoxLayoutParams();
layoutOption.width = groupRect.width;
layoutOption.height = groupRect.height;
const layoutRect = getLayoutRect(
layoutOption, {
width: api.getWidth(),
height: api.getHeight()
}, titleModel.get('padding')
);
// Adjust text align based on position
if (!textAlign) {
// Align left if title is on the left. center and right is same
textAlign = (titleModel.get('left') || titleModel.get('right')) as ZRTextAlign;
// @ts-ignore
if (textAlign === 'middle') {
textAlign = 'center';
}
// Adjust layout by text align
if (textAlign === 'right') {
layoutRect.x += layoutRect.width;
}
else if (textAlign === 'center') {
layoutRect.x += layoutRect.width / 2;
}
}
if (!textVerticalAlign) {
textVerticalAlign = (titleModel.get('top') || titleModel.get('bottom')) as ZRTextVerticalAlign;
// @ts-ignore
if (textVerticalAlign === 'center') {
textVerticalAlign = 'middle';
}
if (textVerticalAlign === 'bottom') {
layoutRect.y += layoutRect.height;
}
else if (textVerticalAlign === 'middle') {
layoutRect.y += layoutRect.height / 2;
}
textVerticalAlign = textVerticalAlign || 'top';
}
group.x = layoutRect.x;
group.y = layoutRect.y;
group.markRedraw();
const alignStyle = {
align: textAlign,
verticalAlign: textVerticalAlign
};
textEl.setStyle(alignStyle);
subTextEl.setStyle(alignStyle);
// Render background
// Get groupRect again because textAlign has been changed
groupRect = group.getBoundingRect();
const padding = layoutRect.margin;
const style = titleModel.getItemStyle(['color', 'opacity']);
style.fill = titleModel.get('backgroundColor');
const rect = new graphic.Rect({
shape: {
x: groupRect.x - padding[3],
y: groupRect.y - padding[0],
width: groupRect.width + padding[1] + padding[3],
height: groupRect.height + padding[0] + padding[2],
r: titleModel.get('borderRadius')
},
style: style,
subPixelOptimize: true,
silent: true
});
group.add(rect);
}