@visactor/vgrammar-core
Version:
VGrammar is a visual grammar library
88 lines (84 loc) • 4.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: !0
}), exports.morph = void 0;
const vrender_core_1 = require("@visactor/vrender-core"), vutils_1 = require("@visactor/vutils"), util_1 = require("../../parse/util"), differ_1 = require("../mark/differ"), doMorph = (prev, next, runningConfig, onEnd, parameters) => {
var _a, _b;
const morphData = {
prev: prev.map((element => element.getDatum())),
next: next.map((element => element.getDatum()))
}, morphElements = {
prev: prev.slice(),
next: next.slice()
}, easing = runningConfig.animation.easing, delay = (0, util_1.invokeFunctionType)(runningConfig.animation.delay, parameters, morphData, morphElements), duration = (0,
util_1.invokeFunctionType)(runningConfig.animation.duration, parameters, morphData, morphElements), oneByOne = (0,
util_1.invokeFunctionType)(runningConfig.animation.oneByOne, parameters, morphData, morphElements), splitPath = (0,
util_1.invokeFunctionType)(runningConfig.animation.splitPath, parameters, morphData, morphElements), individualDelay = (0,
vutils_1.isValidNumber)(oneByOne) && oneByOne > 0 ? index => (0, vutils_1.isNumber)(oneByOne) ? index * oneByOne : !0 === oneByOne ? index * duration : 0 : void 0;
1 !== prev.length && 0 !== prev.length || 1 !== next.length ? 1 === prev.length && next.length > 1 ? (0,
vrender_core_1.oneToMultiMorph)(prev[0].getGraphicItem(), next.map((element => element.getGraphicItem())), {
delay: delay,
duration: duration,
easing: easing,
onEnd: onEnd,
individualDelay: individualDelay,
splitPath: splitPath
}) : prev.length > 1 && 1 === next.length && (0, vrender_core_1.multiToOneMorph)(prev.map((element => element.getGraphicItem())), next[0].getGraphicItem(), {
delay: delay,
duration: duration,
easing: easing,
onEnd: onEnd,
individualDelay: individualDelay,
splitPath: splitPath
}) : (0, vrender_core_1.morphPath)(null === (_b = null === (_a = prev[0]) || void 0 === _a ? void 0 : _a.getGraphicItem) || void 0 === _b ? void 0 : _b.call(_a), next[0].getGraphicItem(), {
delay: delay,
duration: duration,
easing: easing,
onEnd: onEnd
});
}, divideElements = (elements, count) => {
const divideLength = Math.floor(elements.length / count);
return new Array(count).fill(0).map(((i, index) => elements.slice(divideLength * index, index === count - 1 ? elements.length : divideLength * (index + 1))));
}, appendMorphKeyToElements = mark => {
const config = mark.getMorphConfig();
if (!(0, vutils_1.isNil)(config.morphElementKey)) {
const getter = (0, util_1.parseField)(config.morphElementKey);
mark.elements && mark.elements.forEach((el => {
el.morphKey = getter(el.getDatum());
}));
}
}, morph = (prevMarks, nextMarks, runningConfig) => {
const prevElements = prevMarks.reduce(((elements, mark) => (appendMorphKeyToElements(mark),
elements.concat(mark.elements))), []), nextElements = nextMarks.reduce(((elements, mark) => (appendMorphKeyToElements(mark),
elements.concat(mark.elements))), []), diffResult = (0, differ_1.diffMultiple)(prevElements, nextElements, (element => {
var _a;
return null !== (_a = element.morphKey) && void 0 !== _a ? _a : element.key;
}));
prevMarks.forEach((mark => {
var _a, _b;
return null === (_b = null === (_a = mark.animate) || void 0 === _a ? void 0 : _a.disable) || void 0 === _b ? void 0 : _b.call(_a);
})), nextMarks.forEach((mark => {
var _a, _b;
return null === (_b = null === (_a = mark.animate) || void 0 === _a ? void 0 : _a.disable) || void 0 === _b ? void 0 : _b.call(_a);
}));
const parameters = prevMarks.concat(nextMarks).reduce(((parameters, mark) => (Object.assign(parameters, mark.parameters()),
parameters)), {});
let morphCount = 0;
const onMorphEnd = () => {
morphCount -= 1, 0 === morphCount && nextMarks.forEach((mark => {
var _a, _b;
null === (_b = null === (_a = mark.animate) || void 0 === _a ? void 0 : _a.enable) || void 0 === _b || _b.call(_a);
}));
};
diffResult.enter.forEach((diff => {
diff.next.forEach((element => {
doMorph([], [ element ], runningConfig, onMorphEnd, parameters);
})), morphCount += 1;
})), diffResult.update.forEach((diff => {
const divideCount = Math.min(diff.prev.length, diff.next.length), prevDivide = divideElements(diff.prev, divideCount), nextDivide = divideElements(diff.next, divideCount);
for (let i = 0; i < divideCount; i++) doMorph(prevDivide[i], nextDivide[i], runningConfig, onMorphEnd, parameters),
morphCount += 1;
}));
};
exports.morph = morph;
//# sourceMappingURL=morph.js.map