123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 |
- /*
- * 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;
|