kapellmeister
Version:
Orchestration For Animated Transitions
351 lines (280 loc) • 10.9 kB
JavaScript
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; }
import { now, timer, timeout } from 'd3-timer';
import { timingDefaults, extend, getTransitionId, isNamespace } from './utils';
import Events from './Events';
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') {
extend(this.state, update(this.state));
} else {
extend(this.state, update);
}
}
}, {
key: "parse",
value: function parse(config) {
var _this = this;
var clone = _objectSpread({}, config);
var events = new Events(clone);
if (clone.events) {
delete clone.events;
}
var timing = _objectSpread({}, timingDefaults, clone.timing || {}, {
time: now()
});
if (clone.timing) {
delete clone.timing;
}
Object.keys(clone).forEach(function (stateKey) {
var tweens = [];
var next = clone[stateKey];
if (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(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 = 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 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];
}
}
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;
}();
export default BaseNode;