UNPKG

kapellmeister

Version:

Orchestration For Animated Transitions

363 lines (287 loc) 11.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _d3Timer = require("d3-timer"); var _utils = require("./utils"); var _Events = _interopRequireDefault(require("./Events")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var BaseNode = function () { function BaseNode(state) { _classCallCheck(this, BaseNode); this.state = state || {}; } _createClass(BaseNode, [{ key: "transition", value: function transition(config) { if (Array.isArray(config)) { var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = config[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var item = _step.value; this.parse(item); } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } } else { this.parse(config); } } }, { key: "isTransitioning", value: function isTransitioning() { return !!this.transitionData; } }, { key: "stopTransitions", value: function stopTransitions() { var transitions = this.transitionData; if (transitions) { Object.keys(transitions).forEach(function (t) { transitions[t].timer.stop(); }); } } }, { key: "setState", value: function setState(update) { if (typeof update === 'function') { (0, _utils.extend)(this.state, update(this.state)); } else { (0, _utils.extend)(this.state, update); } } }, { key: "parse", value: function parse(config) { var _this = this; var clone = _objectSpread({}, config); var events = new _Events.default(clone); if (clone.events) { delete clone.events; } var timing = _objectSpread({}, _utils.timingDefaults, clone.timing || {}, { time: (0, _d3Timer.now)() }); if (clone.timing) { delete clone.timing; } Object.keys(clone).forEach(function (stateKey) { var tweens = []; var next = clone[stateKey]; if ((0, _utils.isNamespace)(next)) { Object.keys(next).forEach(function (attr) { var val = next[attr]; if (Array.isArray(val)) { if (val.length === 1) { tweens.push(_this.getTween(attr, val[0], stateKey)); } else { _this.setState(function (state) { var _objectSpread2, _ref; return _ref = {}, _ref[stateKey] = _objectSpread({}, state[stateKey], (_objectSpread2 = {}, _objectSpread2[attr] = val[0], _objectSpread2)), _ref; }); tweens.push(_this.getTween(attr, val[1], stateKey)); } } else if (typeof val === 'function') { var getNameSpacedCustomTween = function getNameSpacedCustomTween() { var kapellmeisterNamespacedTween = function kapellmeisterNamespacedTween(t) { _this.setState(function (state) { var _objectSpread3, _ref2; return _ref2 = {}, _ref2[stateKey] = _objectSpread({}, state[stateKey], (_objectSpread3 = {}, _objectSpread3[attr] = val(t), _objectSpread3)), _ref2; }); }; return kapellmeisterNamespacedTween; }; tweens.push(getNameSpacedCustomTween); } else { _this.setState(function (state) { var _objectSpread4, _ref3; return _ref3 = {}, _ref3[stateKey] = _objectSpread({}, state[stateKey], (_objectSpread4 = {}, _objectSpread4[attr] = val, _objectSpread4)), _ref3; }); tweens.push(_this.getTween(attr, val, stateKey)); } }); } else { if (Array.isArray(next)) { if (next.length === 1) { tweens.push(_this.getTween(stateKey, next[0], null)); } else { var _this$setState; _this.setState((_this$setState = {}, _this$setState[stateKey] = next[0], _this$setState)); tweens.push(_this.getTween(stateKey, next[1], null)); } } else if (typeof next === 'function') { var getCustomTween = function getCustomTween() { var kapellmeisterTween = function kapellmeisterTween(t) { var _this$setState2; _this.setState((_this$setState2 = {}, _this$setState2[stateKey] = next(t), _this$setState2)); }; return kapellmeisterTween; }; tweens.push(getCustomTween); } else { var _this$setState3; _this.setState((_this$setState3 = {}, _this$setState3[stateKey] = next, _this$setState3)); tweens.push(_this.getTween(stateKey, next, null)); } } _this.update({ stateKey: stateKey, timing: timing, tweens: tweens, events: events, status: 0 }); }); } }, { key: "getTween", value: function getTween(attr, endValue, nameSpace) { var _this2 = this; return function () { var begValue = nameSpace ? _this2.state[nameSpace][attr] : _this2.state[attr]; if (begValue === endValue) { return null; } var i = _this2.getInterpolator(begValue, endValue, attr, nameSpace); var stateTween; if (nameSpace === null) { stateTween = function stateTween(t) { var _this2$setState; _this2.setState((_this2$setState = {}, _this2$setState[attr] = i(t), _this2$setState)); }; } else { stateTween = function stateTween(t) { _this2.setState(function (state) { var _objectSpread5, _ref4; return _ref4 = {}, _ref4[nameSpace] = _objectSpread({}, state[nameSpace], (_objectSpread5 = {}, _objectSpread5[attr] = i(t), _objectSpread5)), _ref4; }); }; } return stateTween; }; } }, { key: "update", value: function update(transition) { if (!this.transitionData) { this.transitionData = {}; } this.init((0, _utils.getTransitionId)(), transition); } }, { key: "init", value: function init(id, transition) { var _this3 = this; var n = transition.tweens.length; var tweens = new Array(n); var queue = function queue(elapsed) { transition.status = 1; transition.timer.restart(start, transition.timing.delay, transition.timing.time); if (transition.timing.delay <= elapsed) { start(elapsed - transition.timing.delay); } }; this.transitionData[id] = transition; transition.timer = (0, _d3Timer.timer)(queue, 0, transition.timing.time); var start = function start(elapsed) { if (transition.status !== 1) return stop(); for (var tid in _this3.transitionData) { var t = _this3.transitionData[tid]; if (t.stateKey !== transition.stateKey) { continue; } if (t.status === 3) { return (0, _d3Timer.timeout)(start); } if (t.status === 4) { t.status = 6; t.timer.stop(); if (t.events.interrupt) { t.events.interrupt.call(_this3); } delete _this3.transitionData[tid]; } else if (+tid < id) { t.status = 6; t.timer.stop(); delete _this3.transitionData[tid]; } } (0, _d3Timer.timeout)(function () { if (transition.status === 3) { transition.status = 4; transition.timer.restart(tick, transition.timing.delay, transition.timing.time); tick(elapsed); } }); transition.status = 2; if (transition.events.start) { transition.events.start.call(_this3); } if (transition.status !== 2) { return; } transition.status = 3; var j = -1; for (var i = 0; i < n; ++i) { var res = transition.tweens[i](); if (res) { tweens[++j] = res; } } tweens.length = j + 1; }; var tick = function tick(elapsed) { var t = 1; if (elapsed < transition.timing.duration) { t = transition.timing.ease(elapsed / transition.timing.duration); } else { transition.timer.restart(stop); transition.status = 5; } var i = -1; while (++i < tweens.length) { tweens[i](t); } if (transition.status === 5) { if (transition.events.end) { transition.events.end.call(_this3); } stop(); } }; var stop = function stop() { transition.status = 6; transition.timer.stop(); delete _this3.transitionData[id]; for (var _ in _this3.transitionData) { return; } delete _this3.transitionData; }; } }]); return BaseNode; }(); var _default = BaseNode; exports.default = _default;