/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ /** * AUTO-GENERATED FILE. DO NOT MODIFY. */ /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import { __extends } from "tslib"; import { extend, retrieve3 } from 'zrender/lib/core/util.js'; import * as graphic from '../../util/graphic.js'; import { setStatesStylesFromModel, toggleHoverEmphasis } from '../../util/states.js'; import ChartView from '../../view/Chart.js'; import labelLayout from './labelLayout.js'; import { setLabelLineStyle, getLabelLineStatesModels } from '../../label/labelGuideHelper.js'; import { setLabelStyle, getLabelStatesModels } from '../../label/labelStyle.js'; import { getSectorCornerRadius } from '../helper/sectorHelper.js'; import { saveOldStyle } from '../../animation/basicTransition.js'; import { getBasicPieLayout, getSeriesLayoutData } from './pieLayout.js'; /** * Piece of pie including Sector, Label, LabelLine */ var PiePiece = /** @class */function (_super) { __extends(PiePiece, _super); function PiePiece(data, idx, startAngle) { var _this = _super.call(this) || this; _this.z2 = 2; var text = new graphic.Text(); _this.setTextContent(text); _this.updateData(data, idx, startAngle, true); return _this; } PiePiece.prototype.updateData = function (data, idx, startAngle, firstCreate) { var sector = this; var seriesModel = data.hostModel; var itemModel = data.getItemModel(idx); var emphasisModel = itemModel.getModel('emphasis'); var layout = data.getItemLayout(idx); // cornerRadius & innerCornerRadius doesn't exist in the item layout. Use `0` if null value is specified. // see `setItemLayout` in `pieLayout.ts`. var sectorShape = extend(getSectorCornerRadius(itemModel.getModel('itemStyle'), layout, true), layout); // Ignore NaN data. if (isNaN(sectorShape.startAngle)) { // Use NaN shape to avoid drawing shape. sector.setShape(sectorShape); return; } if (firstCreate) { sector.setShape(sectorShape); var animationType = seriesModel.getShallow('animationType'); if (seriesModel.ecModel.ssr) { // Use scale animation in SSR mode(opacity?) // Because CSS SVG animation doesn't support very customized shape animation. graphic.initProps(sector, { scaleX: 0, scaleY: 0 }, seriesModel, { dataIndex: idx, isFrom: true }); sector.originX = sectorShape.cx; sector.originY = sectorShape.cy; } else if (animationType === 'scale') { sector.shape.r = layout.r0; graphic.initProps(sector, { shape: { r: layout.r } }, seriesModel, idx); } // Expansion else { if (startAngle != null) { sector.setShape({ startAngle: startAngle, endAngle: startAngle }); graphic.initProps(sector, { shape: { startAngle: layout.startAngle, endAngle: layout.endAngle } }, seriesModel, idx); } else { sector.shape.endAngle = layout.startAngle; graphic.updateProps(sector, { shape: { endAngle: layout.endAngle } }, seriesModel, idx); } } } else { saveOldStyle(sector); // Transition animation from the old shape graphic.updateProps(sector, { shape: sectorShape }, seriesModel, idx); } sector.useStyle(data.getItemVisual(idx, 'style')); setStatesStylesFromModel(sector, itemModel); var midAngle = (layout.startAngle + layout.endAngle) / 2; var offset = seriesModel.get('selectedOffset'); var dx = Math.cos(midAngle) * offset; var dy = Math.sin(midAngle) * offset; var cursorStyle = itemModel.getShallow('cursor'); cursorStyle && sector.attr('cursor', cursorStyle); this._updateLabel(seriesModel, data, idx); sector.ensureState('emphasis').shape = extend({ r: layout.r + (emphasisModel.get('scale') ? emphasisModel.get('scaleSize') || 0 : 0) }, getSectorCornerRadius(emphasisModel.getModel('itemStyle'), layout)); extend(sector.ensureState('select'), { x: dx, y: dy, shape: getSectorCornerRadius(itemModel.getModel(['select', 'itemStyle']), layout) }); extend(sector.ensureState('blur'), { shape: getSectorCornerRadius(itemModel.getModel(['blur', 'itemStyle']), layout) }); var labelLine = sector.getTextGuideLine(); var labelText = sector.getTextContent(); labelLine && extend(labelLine.ensureState('select'), { x: dx, y: dy }); // TODO: needs dx, dy in zrender? extend(labelText.ensureState('select'), { x: dx, y: dy }); toggleHoverEmphasis(this, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled')); }; PiePiece.prototype._updateLabel = function (seriesModel, data, idx) { var sector = this; var itemModel = data.getItemModel(idx); var labelLineModel = itemModel.getModel('labelLine'); var style = data.getItemVisual(idx, 'style'); var visualColor = style && style.fill; var visualOpacity = style && style.opacity; setLabelStyle(sector, getLabelStatesModels(itemModel), { labelFetcher: data.hostModel, labelDataIndex: idx, inheritColor: visualColor, defaultOpacity: visualOpacity, defaultText: seriesModel.getFormattedLabel(idx, 'normal') || data.getName(idx) }); var labelText = sector.getTextContent(); // Set textConfig on sector. sector.setTextConfig({ // reset position, rotation position: null, rotation: null }); // Make sure update style on labelText after setLabelStyle. // Because setLabelStyle will replace a new style on it. labelText.attr({ z2: 10 }); var labelPosition = seriesModel.get(['label', 'position']); if (labelPosition !== 'outside' && labelPosition !== 'outer') { sector.removeTextGuideLine(); } else { var polyline = this.getTextGuideLine(); if (!polyline) { polyline = new graphic.Polyline(); this.setTextGuideLine(polyline); } // Default use item visual color setLabelLineStyle(this, getLabelLineStatesModels(itemModel), { stroke: visualColor, opacity: retrieve3(labelLineModel.get(['lineStyle', 'opacity']), visualOpacity, 1) }); } }; return PiePiece; }(graphic.Sector); // Pie view var PieView = /** @class */function (_super) { __extends(PieView, _super); function PieView() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.ignoreLabelLineUpdate = true; return _this; } PieView.prototype.render = function (seriesModel, ecModel, api, payload) { var data = seriesModel.getData(); var oldData = this._data; var group = this.group; var startAngle; // First render if (!oldData && data.count() > 0) { var shape = data.getItemLayout(0); for (var s = 1; isNaN(shape && shape.startAngle) && s < data.count(); ++s) { shape = data.getItemLayout(s); } if (shape) { startAngle = shape.startAngle; } } // remove empty-circle if it exists if (this._emptyCircleSector) { group.remove(this._emptyCircleSector); } // when all data are filtered, show lightgray empty circle if (data.count() === 0 && seriesModel.get('showEmptyCircle')) { var layoutData = getSeriesLayoutData(seriesModel); var sector = new graphic.Sector({ shape: extend(getBasicPieLayout(seriesModel, api), layoutData) }); sector.useStyle(seriesModel.getModel('emptyCircleStyle').getItemStyle()); this._emptyCircleSector = sector; group.add(sector); } data.diff(oldData).add(function (idx) { var piePiece = new PiePiece(data, idx, startAngle); data.setItemGraphicEl(idx, piePiece); group.add(piePiece); }).update(function (newIdx, oldIdx) { var piePiece = oldData.getItemGraphicEl(oldIdx); piePiece.updateData(data, newIdx, startAngle); piePiece.off('click'); group.add(piePiece); data.setItemGraphicEl(newIdx, piePiece); }).remove(function (idx) { var piePiece = oldData.getItemGraphicEl(idx); graphic.removeElementWithFadeOut(piePiece, seriesModel, idx); }).execute(); labelLayout(seriesModel); // Always use initial animation. if (seriesModel.get('animationTypeUpdate') !== 'expansion') { this._data = data; } }; PieView.prototype.dispose = function () {}; PieView.prototype.containPoint = function (point, seriesModel) { var data = seriesModel.getData(); var itemLayout = data.getItemLayout(0); if (itemLayout) { var dx = point[0] - itemLayout.cx; var dy = point[1] - itemLayout.cy; var radius = Math.sqrt(dx * dx + dy * dy); return radius <= itemLayout.r && radius >= itemLayout.r0; } }; PieView.type = 'pie'; return PieView; }(ChartView); export default PieView;