cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
334 lines (333 loc) • 11.7 kB
JavaScript
import { makeInner, normalizeToArray } from "../util/model.mjs";
import { keys, reduce, each, extend, hasOwn, indexOf, isArrayLike, bind } from "../../../zrender/lib/core/util.mjs";
import { cloneValue } from "../../../zrender/lib/animation/Animator.mjs";
import Displayable from "../../../zrender/lib/graphic/Displayable.mjs";
import { getAnimationConfig } from "./basicTransition.mjs";
import "../util/graphic.mjs";
import { TRANSFORMABLE_PROPS } from "../../../zrender/lib/core/Transformable.mjs";
import Path from "../../../zrender/lib/graphic/Path.mjs";
var LEGACY_TRANSFORM_PROPS_MAP = {
position: ["x", "y"],
scale: ["scaleX", "scaleY"],
origin: ["originX", "originY"]
};
var LEGACY_TRANSFORM_PROPS = keys(LEGACY_TRANSFORM_PROPS_MAP);
reduce(TRANSFORMABLE_PROPS, function(obj, key) {
obj[key] = 1;
return obj;
}, {});
TRANSFORMABLE_PROPS.join(", ");
var ELEMENT_ANIMATABLE_PROPS = ["", "style", "shape", "extra"];
var transitionInnerStore = makeInner();
function getElementAnimationConfig(animationType, el, elOption, parentModel, dataIndex) {
var animationProp = animationType + "Animation";
var config = getAnimationConfig(animationType, parentModel, dataIndex) || {};
var userDuring = transitionInnerStore(el).userDuring;
if (config.duration > 0) {
config.during = userDuring ? bind(duringCall, {
el,
userDuring
}) : null;
config.setToFinal = true;
config.scope = animationType;
}
extend(config, elOption[animationProp]);
return config;
}
function applyUpdateTransition(el, elOption, animatableModel, opts) {
opts = opts || {};
var dataIndex = opts.dataIndex, isInit = opts.isInit, clearStyle = opts.clearStyle;
var hasAnimation = animatableModel.isAnimationEnabled();
var store = transitionInnerStore(el);
var styleOpt = elOption.style;
store.userDuring = elOption.during;
var transFromProps = {};
var propsToSet = {};
prepareTransformAllPropsFinal(el, elOption, propsToSet);
prepareShapeOrExtraAllPropsFinal("shape", elOption, propsToSet);
prepareShapeOrExtraAllPropsFinal("extra", elOption, propsToSet);
if (!isInit && hasAnimation) {
prepareTransformTransitionFrom(el, elOption, transFromProps);
prepareShapeOrExtraTransitionFrom("shape", el, elOption, transFromProps);
prepareShapeOrExtraTransitionFrom("extra", el, elOption, transFromProps);
prepareStyleTransitionFrom(el, elOption, styleOpt, transFromProps);
}
propsToSet.style = styleOpt;
applyPropsDirectly(el, propsToSet, clearStyle);
applyMiscProps(el, elOption);
if (hasAnimation) {
if (isInit) {
var enterFromProps_1 = {};
each(ELEMENT_ANIMATABLE_PROPS, function(propName) {
var prop = propName ? elOption[propName] : elOption;
if (prop && prop.enterFrom) {
if (propName) {
enterFromProps_1[propName] = enterFromProps_1[propName] || {};
}
extend(propName ? enterFromProps_1[propName] : enterFromProps_1, prop.enterFrom);
}
});
var config = getElementAnimationConfig("enter", el, elOption, animatableModel, dataIndex);
if (config.duration > 0) {
el.animateFrom(enterFromProps_1, config);
}
} else {
applyPropsTransition(el, elOption, dataIndex || 0, animatableModel, transFromProps);
}
}
updateLeaveTo(el, elOption);
styleOpt ? el.dirty() : el.markRedraw();
}
function updateLeaveTo(el, elOption) {
var leaveToProps = transitionInnerStore(el).leaveToProps;
for (var i = 0; i < ELEMENT_ANIMATABLE_PROPS.length; i++) {
var propName = ELEMENT_ANIMATABLE_PROPS[i];
var prop = propName ? elOption[propName] : elOption;
if (prop && prop.leaveTo) {
if (!leaveToProps) {
leaveToProps = transitionInnerStore(el).leaveToProps = {};
}
if (propName) {
leaveToProps[propName] = leaveToProps[propName] || {};
}
extend(propName ? leaveToProps[propName] : leaveToProps, prop.leaveTo);
}
}
}
function applyLeaveTransition(el, elOption, animatableModel, onRemove) {
if (el) {
var parent_1 = el.parent;
var leaveToProps = transitionInnerStore(el).leaveToProps;
if (leaveToProps) {
var config = getElementAnimationConfig("update", el, elOption, animatableModel, 0);
config.done = function() {
parent_1.remove(el);
onRemove && onRemove();
};
el.animateTo(leaveToProps, config);
} else {
parent_1.remove(el);
onRemove && onRemove();
}
}
}
function isTransitionAll(transition) {
return transition === "all";
}
function applyPropsDirectly(el, allPropsFinal, clearStyle) {
var styleOpt = allPropsFinal.style;
if (!el.isGroup && styleOpt) {
if (clearStyle) {
el.useStyle({});
var animators = el.animators;
for (var i = 0; i < animators.length; i++) {
var animator = animators[i];
if (animator.targetName === "style") {
animator.changeTarget(el.style);
}
}
}
el.setStyle(styleOpt);
}
if (allPropsFinal) {
allPropsFinal.style = null;
allPropsFinal && el.attr(allPropsFinal);
allPropsFinal.style = styleOpt;
}
}
function applyPropsTransition(el, elOption, dataIndex, model, transFromProps) {
if (transFromProps) {
var config = getElementAnimationConfig("update", el, elOption, model, dataIndex);
if (config.duration > 0) {
el.animateFrom(transFromProps, config);
}
}
}
function applyMiscProps(el, elOption) {
hasOwn(elOption, "silent") && (el.silent = elOption.silent);
hasOwn(elOption, "ignore") && (el.ignore = elOption.ignore);
if (el instanceof Displayable) {
hasOwn(elOption, "invisible") && (el.invisible = elOption.invisible);
}
if (el instanceof Path) {
hasOwn(elOption, "autoBatch") && (el.autoBatch = elOption.autoBatch);
}
}
var tmpDuringScope = {};
var transitionDuringAPI = {
setTransform: function(key, val) {
tmpDuringScope.el[key] = val;
return this;
},
getTransform: function(key) {
return tmpDuringScope.el[key];
},
setShape: function(key, val) {
var el = tmpDuringScope.el;
var shape = el.shape || (el.shape = {});
shape[key] = val;
el.dirtyShape && el.dirtyShape();
return this;
},
getShape: function(key) {
var shape = tmpDuringScope.el.shape;
if (shape) {
return shape[key];
}
},
setStyle: function(key, val) {
var el = tmpDuringScope.el;
var style = el.style;
if (style) {
style[key] = val;
el.dirtyStyle && el.dirtyStyle();
}
return this;
},
getStyle: function(key) {
var style = tmpDuringScope.el.style;
if (style) {
return style[key];
}
},
setExtra: function(key, val) {
var extra = tmpDuringScope.el.extra || (tmpDuringScope.el.extra = {});
extra[key] = val;
return this;
},
getExtra: function(key) {
var extra = tmpDuringScope.el.extra;
if (extra) {
return extra[key];
}
}
};
function duringCall() {
var scope = this;
var el = scope.el;
if (!el) {
return;
}
var latestUserDuring = transitionInnerStore(el).userDuring;
var scopeUserDuring = scope.userDuring;
if (latestUserDuring !== scopeUserDuring) {
scope.el = scope.userDuring = null;
return;
}
tmpDuringScope.el = el;
scopeUserDuring(transitionDuringAPI);
}
function prepareShapeOrExtraTransitionFrom(mainAttr, fromEl, elOption, transFromProps) {
var attrOpt = elOption[mainAttr];
if (!attrOpt) {
return;
}
var elPropsInAttr = fromEl[mainAttr];
var transFromPropsInAttr;
if (elPropsInAttr) {
var transition = elOption.transition;
var attrTransition = attrOpt.transition;
if (attrTransition) {
!transFromPropsInAttr && (transFromPropsInAttr = transFromProps[mainAttr] = {});
if (isTransitionAll(attrTransition)) {
extend(transFromPropsInAttr, elPropsInAttr);
} else {
var transitionKeys = normalizeToArray(attrTransition);
for (var i = 0; i < transitionKeys.length; i++) {
var key = transitionKeys[i];
var elVal = elPropsInAttr[key];
transFromPropsInAttr[key] = elVal;
}
}
} else if (isTransitionAll(transition) || indexOf(transition, mainAttr) >= 0) {
!transFromPropsInAttr && (transFromPropsInAttr = transFromProps[mainAttr] = {});
var elPropsInAttrKeys = keys(elPropsInAttr);
for (var i = 0; i < elPropsInAttrKeys.length; i++) {
var key = elPropsInAttrKeys[i];
var elVal = elPropsInAttr[key];
if (isNonStyleTransitionEnabled(attrOpt[key], elVal)) {
transFromPropsInAttr[key] = elVal;
}
}
}
}
}
function prepareShapeOrExtraAllPropsFinal(mainAttr, elOption, allProps) {
var attrOpt = elOption[mainAttr];
if (!attrOpt) {
return;
}
var allPropsInAttr = allProps[mainAttr] = {};
var keysInAttr = keys(attrOpt);
for (var i = 0; i < keysInAttr.length; i++) {
var key = keysInAttr[i];
allPropsInAttr[key] = cloneValue(attrOpt[key]);
}
}
function prepareTransformTransitionFrom(el, elOption, transFromProps) {
var transition = elOption.transition;
var transitionKeys = isTransitionAll(transition) ? TRANSFORMABLE_PROPS : normalizeToArray(transition || []);
for (var i = 0; i < transitionKeys.length; i++) {
var key = transitionKeys[i];
if (key === "style" || key === "shape" || key === "extra") {
continue;
}
var elVal = el[key];
transFromProps[key] = elVal;
}
}
function prepareTransformAllPropsFinal(el, elOption, allProps) {
for (var i = 0; i < LEGACY_TRANSFORM_PROPS.length; i++) {
var legacyName = LEGACY_TRANSFORM_PROPS[i];
var xyName = LEGACY_TRANSFORM_PROPS_MAP[legacyName];
var legacyArr = elOption[legacyName];
if (legacyArr) {
allProps[xyName[0]] = legacyArr[0];
allProps[xyName[1]] = legacyArr[1];
}
}
for (var i = 0; i < TRANSFORMABLE_PROPS.length; i++) {
var key = TRANSFORMABLE_PROPS[i];
if (elOption[key] != null) {
allProps[key] = elOption[key];
}
}
}
function prepareStyleTransitionFrom(fromEl, elOption, styleOpt, transFromProps) {
if (!styleOpt) {
return;
}
var fromElStyle = fromEl.style;
var transFromStyleProps;
if (fromElStyle) {
var styleTransition = styleOpt.transition;
var elTransition = elOption.transition;
if (styleTransition && !isTransitionAll(styleTransition)) {
var transitionKeys = normalizeToArray(styleTransition);
!transFromStyleProps && (transFromStyleProps = transFromProps.style = {});
for (var i = 0; i < transitionKeys.length; i++) {
var key = transitionKeys[i];
var elVal = fromElStyle[key];
transFromStyleProps[key] = elVal;
}
} else if (fromEl.getAnimationStyleProps && (isTransitionAll(elTransition) || isTransitionAll(styleTransition) || indexOf(elTransition, "style") >= 0)) {
var animationProps = fromEl.getAnimationStyleProps();
var animationStyleProps = animationProps ? animationProps.style : null;
if (animationStyleProps) {
!transFromStyleProps && (transFromStyleProps = transFromProps.style = {});
var styleKeys = keys(styleOpt);
for (var i = 0; i < styleKeys.length; i++) {
var key = styleKeys[i];
if (animationStyleProps[key]) {
var elVal = fromElStyle[key];
transFromStyleProps[key] = elVal;
}
}
}
}
}
}
function isNonStyleTransitionEnabled(optVal, elVal) {
return !isArrayLike(optVal) ? optVal != null && isFinite(optVal) : optVal !== elVal;
}
export { ELEMENT_ANIMATABLE_PROPS, applyLeaveTransition, applyUpdateTransition, isTransitionAll, updateLeaveTo };