|   | 
| /* | 
| * 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 { createSymbol, normalizeSymbolOffset, normalizeSymbolSize } from '../../util/symbol.js'; | 
| import * as graphic from '../../util/graphic.js'; | 
| import { getECData } from '../../util/innerStore.js'; | 
| import { enterEmphasis, leaveEmphasis, toggleHoverEmphasis } from '../../util/states.js'; | 
| import { getDefaultLabel } from './labelHelper.js'; | 
| import { extend } from 'zrender/lib/core/util.js'; | 
| import { setLabelStyle, getLabelStatesModels } from '../../label/labelStyle.js'; | 
| import ZRImage from 'zrender/lib/graphic/Image.js'; | 
| import { saveOldStyle } from '../../animation/basicTransition.js'; | 
| var Symbol = /** @class */function (_super) { | 
|   __extends(Symbol, _super); | 
|   function Symbol(data, idx, seriesScope, opts) { | 
|     var _this = _super.call(this) || this; | 
|     _this.updateData(data, idx, seriesScope, opts); | 
|     return _this; | 
|   } | 
|   Symbol.prototype._createSymbol = function (symbolType, data, idx, symbolSize, keepAspect) { | 
|     // Remove paths created before | 
|     this.removeAll(); | 
|     // let symbolPath = createSymbol( | 
|     //     symbolType, -0.5, -0.5, 1, 1, color | 
|     // ); | 
|     // If width/height are set too small (e.g., set to 1) on ios10 | 
|     // and macOS Sierra, a circle stroke become a rect, no matter what | 
|     // the scale is set. So we set width/height as 2. See #4150. | 
|     var symbolPath = createSymbol(symbolType, -1, -1, 2, 2, null, keepAspect); | 
|     symbolPath.attr({ | 
|       z2: 100, | 
|       culling: true, | 
|       scaleX: symbolSize[0] / 2, | 
|       scaleY: symbolSize[1] / 2 | 
|     }); | 
|     // Rewrite drift method | 
|     symbolPath.drift = driftSymbol; | 
|     this._symbolType = symbolType; | 
|     this.add(symbolPath); | 
|   }; | 
|   /** | 
|    * Stop animation | 
|    * @param {boolean} toLastFrame | 
|    */ | 
|   Symbol.prototype.stopSymbolAnimation = function (toLastFrame) { | 
|     this.childAt(0).stopAnimation(null, toLastFrame); | 
|   }; | 
|   Symbol.prototype.getSymbolType = function () { | 
|     return this._symbolType; | 
|   }; | 
|   /** | 
|    * FIXME: | 
|    * Caution: This method breaks the encapsulation of this module, | 
|    * but it indeed brings convenience. So do not use the method | 
|    * unless you detailedly know all the implements of `Symbol`, | 
|    * especially animation. | 
|    * | 
|    * Get symbol path element. | 
|    */ | 
|   Symbol.prototype.getSymbolPath = function () { | 
|     return this.childAt(0); | 
|   }; | 
|   /** | 
|    * Highlight symbol | 
|    */ | 
|   Symbol.prototype.highlight = function () { | 
|     enterEmphasis(this.childAt(0)); | 
|   }; | 
|   /** | 
|    * Downplay symbol | 
|    */ | 
|   Symbol.prototype.downplay = function () { | 
|     leaveEmphasis(this.childAt(0)); | 
|   }; | 
|   /** | 
|    * @param {number} zlevel | 
|    * @param {number} z | 
|    */ | 
|   Symbol.prototype.setZ = function (zlevel, z) { | 
|     var symbolPath = this.childAt(0); | 
|     symbolPath.zlevel = zlevel; | 
|     symbolPath.z = z; | 
|   }; | 
|   Symbol.prototype.setDraggable = function (draggable, hasCursorOption) { | 
|     var symbolPath = this.childAt(0); | 
|     symbolPath.draggable = draggable; | 
|     symbolPath.cursor = !hasCursorOption && draggable ? 'move' : symbolPath.cursor; | 
|   }; | 
|   /** | 
|    * Update symbol properties | 
|    */ | 
|   Symbol.prototype.updateData = function (data, idx, seriesScope, opts) { | 
|     this.silent = false; | 
|     var symbolType = data.getItemVisual(idx, 'symbol') || 'circle'; | 
|     var seriesModel = data.hostModel; | 
|     var symbolSize = Symbol.getSymbolSize(data, idx); | 
|     var isInit = symbolType !== this._symbolType; | 
|     var disableAnimation = opts && opts.disableAnimation; | 
|     if (isInit) { | 
|       var keepAspect = data.getItemVisual(idx, 'symbolKeepAspect'); | 
|       this._createSymbol(symbolType, data, idx, symbolSize, keepAspect); | 
|     } else { | 
|       var symbolPath = this.childAt(0); | 
|       symbolPath.silent = false; | 
|       var target = { | 
|         scaleX: symbolSize[0] / 2, | 
|         scaleY: symbolSize[1] / 2 | 
|       }; | 
|       disableAnimation ? symbolPath.attr(target) : graphic.updateProps(symbolPath, target, seriesModel, idx); | 
|       saveOldStyle(symbolPath); | 
|     } | 
|     this._updateCommon(data, idx, symbolSize, seriesScope, opts); | 
|     if (isInit) { | 
|       var symbolPath = this.childAt(0); | 
|       if (!disableAnimation) { | 
|         var target = { | 
|           scaleX: this._sizeX, | 
|           scaleY: this._sizeY, | 
|           style: { | 
|             // Always fadeIn. Because it has fadeOut animation when symbol is removed.. | 
|             opacity: symbolPath.style.opacity | 
|           } | 
|         }; | 
|         symbolPath.scaleX = symbolPath.scaleY = 0; | 
|         symbolPath.style.opacity = 0; | 
|         graphic.initProps(symbolPath, target, seriesModel, idx); | 
|       } | 
|     } | 
|     if (disableAnimation) { | 
|       // Must stop leave transition manually if don't call initProps or updateProps. | 
|       this.childAt(0).stopAnimation('leave'); | 
|     } | 
|   }; | 
|   Symbol.prototype._updateCommon = function (data, idx, symbolSize, seriesScope, opts) { | 
|     var symbolPath = this.childAt(0); | 
|     var seriesModel = data.hostModel; | 
|     var emphasisItemStyle; | 
|     var blurItemStyle; | 
|     var selectItemStyle; | 
|     var focus; | 
|     var blurScope; | 
|     var emphasisDisabled; | 
|     var labelStatesModels; | 
|     var hoverScale; | 
|     var cursorStyle; | 
|     if (seriesScope) { | 
|       emphasisItemStyle = seriesScope.emphasisItemStyle; | 
|       blurItemStyle = seriesScope.blurItemStyle; | 
|       selectItemStyle = seriesScope.selectItemStyle; | 
|       focus = seriesScope.focus; | 
|       blurScope = seriesScope.blurScope; | 
|       labelStatesModels = seriesScope.labelStatesModels; | 
|       hoverScale = seriesScope.hoverScale; | 
|       cursorStyle = seriesScope.cursorStyle; | 
|       emphasisDisabled = seriesScope.emphasisDisabled; | 
|     } | 
|     if (!seriesScope || data.hasItemOption) { | 
|       var itemModel = seriesScope && seriesScope.itemModel ? seriesScope.itemModel : data.getItemModel(idx); | 
|       var emphasisModel = itemModel.getModel('emphasis'); | 
|       emphasisItemStyle = emphasisModel.getModel('itemStyle').getItemStyle(); | 
|       selectItemStyle = itemModel.getModel(['select', 'itemStyle']).getItemStyle(); | 
|       blurItemStyle = itemModel.getModel(['blur', 'itemStyle']).getItemStyle(); | 
|       focus = emphasisModel.get('focus'); | 
|       blurScope = emphasisModel.get('blurScope'); | 
|       emphasisDisabled = emphasisModel.get('disabled'); | 
|       labelStatesModels = getLabelStatesModels(itemModel); | 
|       hoverScale = emphasisModel.getShallow('scale'); | 
|       cursorStyle = itemModel.getShallow('cursor'); | 
|     } | 
|     var symbolRotate = data.getItemVisual(idx, 'symbolRotate'); | 
|     symbolPath.attr('rotation', (symbolRotate || 0) * Math.PI / 180 || 0); | 
|     var symbolOffset = normalizeSymbolOffset(data.getItemVisual(idx, 'symbolOffset'), symbolSize); | 
|     if (symbolOffset) { | 
|       symbolPath.x = symbolOffset[0]; | 
|       symbolPath.y = symbolOffset[1]; | 
|     } | 
|     cursorStyle && symbolPath.attr('cursor', cursorStyle); | 
|     var symbolStyle = data.getItemVisual(idx, 'style'); | 
|     var visualColor = symbolStyle.fill; | 
|     if (symbolPath instanceof ZRImage) { | 
|       var pathStyle = symbolPath.style; | 
|       symbolPath.useStyle(extend({ | 
|         // TODO other properties like x, y ? | 
|         image: pathStyle.image, | 
|         x: pathStyle.x, | 
|         y: pathStyle.y, | 
|         width: pathStyle.width, | 
|         height: pathStyle.height | 
|       }, symbolStyle)); | 
|     } else { | 
|       if (symbolPath.__isEmptyBrush) { | 
|         // fill and stroke will be swapped if it's empty. | 
|         // So we cloned a new style to avoid it affecting the original style in visual storage. | 
|         // TODO Better implementation. No empty logic! | 
|         symbolPath.useStyle(extend({}, symbolStyle)); | 
|       } else { | 
|         symbolPath.useStyle(symbolStyle); | 
|       } | 
|       // Disable decal because symbol scale will been applied on the decal. | 
|       symbolPath.style.decal = null; | 
|       symbolPath.setColor(visualColor, opts && opts.symbolInnerColor); | 
|       symbolPath.style.strokeNoScale = true; | 
|     } | 
|     var liftZ = data.getItemVisual(idx, 'liftZ'); | 
|     var z2Origin = this._z2; | 
|     if (liftZ != null) { | 
|       if (z2Origin == null) { | 
|         this._z2 = symbolPath.z2; | 
|         symbolPath.z2 += liftZ; | 
|       } | 
|     } else if (z2Origin != null) { | 
|       symbolPath.z2 = z2Origin; | 
|       this._z2 = null; | 
|     } | 
|     var useNameLabel = opts && opts.useNameLabel; | 
|     setLabelStyle(symbolPath, labelStatesModels, { | 
|       labelFetcher: seriesModel, | 
|       labelDataIndex: idx, | 
|       defaultText: getLabelDefaultText, | 
|       inheritColor: visualColor, | 
|       defaultOpacity: symbolStyle.opacity | 
|     }); | 
|     // Do not execute util needed. | 
|     function getLabelDefaultText(idx) { | 
|       return useNameLabel ? data.getName(idx) : getDefaultLabel(data, idx); | 
|     } | 
|     this._sizeX = symbolSize[0] / 2; | 
|     this._sizeY = symbolSize[1] / 2; | 
|     var emphasisState = symbolPath.ensureState('emphasis'); | 
|     emphasisState.style = emphasisItemStyle; | 
|     symbolPath.ensureState('select').style = selectItemStyle; | 
|     symbolPath.ensureState('blur').style = blurItemStyle; | 
|     // null / undefined / true means to use default strategy. | 
|     // 0 / false / negative number / NaN / Infinity means no scale. | 
|     var scaleRatio = hoverScale == null || hoverScale === true ? Math.max(1.1, 3 / this._sizeY) | 
|     // PENDING: restrict hoverScale > 1? It seems unreasonable to scale down | 
|     : isFinite(hoverScale) && hoverScale > 0 ? +hoverScale : 1; | 
|     // always set scale to allow resetting | 
|     emphasisState.scaleX = this._sizeX * scaleRatio; | 
|     emphasisState.scaleY = this._sizeY * scaleRatio; | 
|     this.setSymbolScale(1); | 
|     toggleHoverEmphasis(this, focus, blurScope, emphasisDisabled); | 
|   }; | 
|   Symbol.prototype.setSymbolScale = function (scale) { | 
|     this.scaleX = this.scaleY = scale; | 
|   }; | 
|   Symbol.prototype.fadeOut = function (cb, seriesModel, opt) { | 
|     var symbolPath = this.childAt(0); | 
|     var dataIndex = getECData(this).dataIndex; | 
|     var animationOpt = opt && opt.animation; | 
|     // Avoid mistaken hover when fading out | 
|     this.silent = symbolPath.silent = true; | 
|     // Not show text when animating | 
|     if (opt && opt.fadeLabel) { | 
|       var textContent = symbolPath.getTextContent(); | 
|       if (textContent) { | 
|         graphic.removeElement(textContent, { | 
|           style: { | 
|             opacity: 0 | 
|           } | 
|         }, seriesModel, { | 
|           dataIndex: dataIndex, | 
|           removeOpt: animationOpt, | 
|           cb: function () { | 
|             symbolPath.removeTextContent(); | 
|           } | 
|         }); | 
|       } | 
|     } else { | 
|       symbolPath.removeTextContent(); | 
|     } | 
|     graphic.removeElement(symbolPath, { | 
|       style: { | 
|         opacity: 0 | 
|       }, | 
|       scaleX: 0, | 
|       scaleY: 0 | 
|     }, seriesModel, { | 
|       dataIndex: dataIndex, | 
|       cb: cb, | 
|       removeOpt: animationOpt | 
|     }); | 
|   }; | 
|   Symbol.getSymbolSize = function (data, idx) { | 
|     return normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize')); | 
|   }; | 
|   return Symbol; | 
| }(graphic.Group); | 
| function driftSymbol(dx, dy) { | 
|   this.parent.drift(dx, dy); | 
| } | 
| export default Symbol; |