|   | 
| /* | 
| * 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 { isFunction, isObject, retrieve2 } from 'zrender/lib/core/util.js'; | 
| import { makeInner } from '../util/model.js'; | 
| // Stored properties for further transition. | 
| export var transitionStore = makeInner(); | 
| /** | 
|  * Return null if animation is disabled. | 
|  */ | 
| export function getAnimationConfig(animationType, animatableModel, dataIndex, | 
| // Extra opts can override the option in animatable model. | 
| extraOpts, | 
| // TODO It's only for pictorial bar now. | 
| extraDelayParams) { | 
|   var animationPayload; | 
|   // Check if there is global animation configuration from dataZoom/resize can override the config in option. | 
|   // If animation is enabled. Will use this animation config in payload. | 
|   // If animation is disabled. Just ignore it. | 
|   if (animatableModel && animatableModel.ecModel) { | 
|     var updatePayload = animatableModel.ecModel.getUpdatePayload(); | 
|     animationPayload = updatePayload && updatePayload.animation; | 
|   } | 
|   var animationEnabled = animatableModel && animatableModel.isAnimationEnabled(); | 
|   var isUpdate = animationType === 'update'; | 
|   if (animationEnabled) { | 
|     var duration = void 0; | 
|     var easing = void 0; | 
|     var delay = void 0; | 
|     if (extraOpts) { | 
|       duration = retrieve2(extraOpts.duration, 200); | 
|       easing = retrieve2(extraOpts.easing, 'cubicOut'); | 
|       delay = 0; | 
|     } else { | 
|       duration = animatableModel.getShallow(isUpdate ? 'animationDurationUpdate' : 'animationDuration'); | 
|       easing = animatableModel.getShallow(isUpdate ? 'animationEasingUpdate' : 'animationEasing'); | 
|       delay = animatableModel.getShallow(isUpdate ? 'animationDelayUpdate' : 'animationDelay'); | 
|     } | 
|     // animation from payload has highest priority. | 
|     if (animationPayload) { | 
|       animationPayload.duration != null && (duration = animationPayload.duration); | 
|       animationPayload.easing != null && (easing = animationPayload.easing); | 
|       animationPayload.delay != null && (delay = animationPayload.delay); | 
|     } | 
|     if (isFunction(delay)) { | 
|       delay = delay(dataIndex, extraDelayParams); | 
|     } | 
|     if (isFunction(duration)) { | 
|       duration = duration(dataIndex); | 
|     } | 
|     var config = { | 
|       duration: duration || 0, | 
|       delay: delay, | 
|       easing: easing | 
|     }; | 
|     return config; | 
|   } else { | 
|     return null; | 
|   } | 
| } | 
| function animateOrSetProps(animationType, el, props, animatableModel, dataIndex, cb, during) { | 
|   var isFrom = false; | 
|   var removeOpt; | 
|   if (isFunction(dataIndex)) { | 
|     during = cb; | 
|     cb = dataIndex; | 
|     dataIndex = null; | 
|   } else if (isObject(dataIndex)) { | 
|     cb = dataIndex.cb; | 
|     during = dataIndex.during; | 
|     isFrom = dataIndex.isFrom; | 
|     removeOpt = dataIndex.removeOpt; | 
|     dataIndex = dataIndex.dataIndex; | 
|   } | 
|   var isRemove = animationType === 'leave'; | 
|   if (!isRemove) { | 
|     // Must stop the remove animation. | 
|     el.stopAnimation('leave'); | 
|   } | 
|   var animationConfig = getAnimationConfig(animationType, animatableModel, dataIndex, isRemove ? removeOpt || {} : null, animatableModel && animatableModel.getAnimationDelayParams ? animatableModel.getAnimationDelayParams(el, dataIndex) : null); | 
|   if (animationConfig && animationConfig.duration > 0) { | 
|     var duration = animationConfig.duration; | 
|     var animationDelay = animationConfig.delay; | 
|     var animationEasing = animationConfig.easing; | 
|     var animateConfig = { | 
|       duration: duration, | 
|       delay: animationDelay || 0, | 
|       easing: animationEasing, | 
|       done: cb, | 
|       force: !!cb || !!during, | 
|       // Set to final state in update/init animation. | 
|       // So the post processing based on the path shape can be done correctly. | 
|       setToFinal: !isRemove, | 
|       scope: animationType, | 
|       during: during | 
|     }; | 
|     isFrom ? el.animateFrom(props, animateConfig) : el.animateTo(props, animateConfig); | 
|   } else { | 
|     el.stopAnimation(); | 
|     // If `isFrom`, the props is the "from" props. | 
|     !isFrom && el.attr(props); | 
|     // Call during at least once. | 
|     during && during(1); | 
|     cb && cb(); | 
|   } | 
| } | 
| /** | 
|  * Update graphic element properties with or without animation according to the | 
|  * configuration in series. | 
|  * | 
|  * Caution: this method will stop previous animation. | 
|  * So do not use this method to one element twice before | 
|  * animation starts, unless you know what you are doing. | 
|  * @example | 
|  *     graphic.updateProps(el, { | 
|  *         position: [100, 100] | 
|  *     }, seriesModel, dataIndex, function () { console.log('Animation done!'); }); | 
|  *     // Or | 
|  *     graphic.updateProps(el, { | 
|  *         position: [100, 100] | 
|  *     }, seriesModel, function () { console.log('Animation done!'); }); | 
|  */ | 
| function updateProps(el, props, | 
| // TODO: TYPE AnimatableModel | 
| animatableModel, dataIndex, cb, during) { | 
|   animateOrSetProps('update', el, props, animatableModel, dataIndex, cb, during); | 
| } | 
| export { updateProps }; | 
| /** | 
|  * Init graphic element properties with or without animation according to the | 
|  * configuration in series. | 
|  * | 
|  * Caution: this method will stop previous animation. | 
|  * So do not use this method to one element twice before | 
|  * animation starts, unless you know what you are doing. | 
|  */ | 
| export function initProps(el, props, animatableModel, dataIndex, cb, during) { | 
|   animateOrSetProps('enter', el, props, animatableModel, dataIndex, cb, during); | 
| } | 
| /** | 
|  * If element is removed. | 
|  * It can determine if element is having remove animation. | 
|  */ | 
| export function isElementRemoved(el) { | 
|   if (!el.__zr) { | 
|     return true; | 
|   } | 
|   for (var i = 0; i < el.animators.length; i++) { | 
|     var animator = el.animators[i]; | 
|     if (animator.scope === 'leave') { | 
|       return true; | 
|     } | 
|   } | 
|   return false; | 
| } | 
| /** | 
|  * Remove graphic element | 
|  */ | 
| export function removeElement(el, props, animatableModel, dataIndex, cb, during) { | 
|   // Don't do remove animation twice. | 
|   if (isElementRemoved(el)) { | 
|     return; | 
|   } | 
|   animateOrSetProps('leave', el, props, animatableModel, dataIndex, cb, during); | 
| } | 
| function fadeOutDisplayable(el, animatableModel, dataIndex, done) { | 
|   el.removeTextContent(); | 
|   el.removeTextGuideLine(); | 
|   removeElement(el, { | 
|     style: { | 
|       opacity: 0 | 
|     } | 
|   }, animatableModel, dataIndex, done); | 
| } | 
| export function removeElementWithFadeOut(el, animatableModel, dataIndex) { | 
|   function doRemove() { | 
|     el.parent && el.parent.remove(el); | 
|   } | 
|   // Hide label and labelLine first | 
|   // TODO Also use fade out animation? | 
|   if (!el.isGroup) { | 
|     fadeOutDisplayable(el, animatableModel, dataIndex, doRemove); | 
|   } else { | 
|     el.traverse(function (disp) { | 
|       if (!disp.isGroup) { | 
|         // Can invoke doRemove multiple times. | 
|         fadeOutDisplayable(disp, animatableModel, dataIndex, doRemove); | 
|       } | 
|     }); | 
|   } | 
| } | 
| /** | 
|  * Save old style for style transition in universalTransition module. | 
|  * It's used when element will be reused in each render. | 
|  * For chart like map, heatmap, which will always create new element. | 
|  * We don't need to save this because universalTransition can get old style from the old element | 
|  */ | 
| export function saveOldStyle(el) { | 
|   transitionStore(el).oldStyle = el.style; | 
| } | 
| export function getOldStyle(el) { | 
|   return transitionStore(el).oldStyle; | 
| } |