mirror of
https://github.com/chartjs/Chart.js.git
synced 2026-03-07 00:36:50 +01:00
If a value is set on the model after `pivot()` has been called, the view wasn't initialized and the animation started from 0. Now, `_start` and incomplete `_view` are initialized to the model value during the transition (no initial implicit transition). Also remove exception handling when animating a string (color), which is faster when string are not valid colors (e.g. tooltip position). It requires to update `chartjs-color` to version 2.1.0.
120 lines
2.2 KiB
JavaScript
120 lines
2.2 KiB
JavaScript
'use strict';
|
|
|
|
var color = require('chartjs-color');
|
|
|
|
module.exports = function(Chart) {
|
|
|
|
var helpers = Chart.helpers;
|
|
|
|
function interpolate(start, view, model, ease) {
|
|
var keys = Object.keys(model);
|
|
var i, ilen, key, actual, origin, target, type, c0, c1;
|
|
|
|
for (i=0, ilen=keys.length; i<ilen; ++i) {
|
|
key = keys[i];
|
|
|
|
target = model[key];
|
|
|
|
// if a value is added to the model after pivot() has been called, the view
|
|
// doesn't contain it, so let's initialize the view to the target value.
|
|
if (!view.hasOwnProperty(key)) {
|
|
view[key] = target;
|
|
}
|
|
|
|
actual = view[key];
|
|
|
|
if (actual === target || key[0] === '_') {
|
|
continue;
|
|
}
|
|
|
|
if (!start.hasOwnProperty(key)) {
|
|
start[key] = actual;
|
|
}
|
|
|
|
origin = start[key];
|
|
|
|
type = typeof(target);
|
|
|
|
if (type === typeof(origin)) {
|
|
if (type === 'string') {
|
|
c0 = color(origin);
|
|
if (c0.valid) {
|
|
c1 = color(target);
|
|
if (c1.valid) {
|
|
view[key] = c1.mix(c0, ease).rgbString();
|
|
continue;
|
|
}
|
|
}
|
|
} else if (type === 'number' && isFinite(origin) && isFinite(target)) {
|
|
view[key] = origin + (target - origin) * ease;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
view[key] = target;
|
|
}
|
|
}
|
|
|
|
Chart.elements = {};
|
|
|
|
Chart.Element = function(configuration) {
|
|
helpers.extend(this, configuration);
|
|
this.initialize.apply(this, arguments);
|
|
};
|
|
|
|
helpers.extend(Chart.Element.prototype, {
|
|
|
|
initialize: function() {
|
|
this.hidden = false;
|
|
},
|
|
|
|
pivot: function() {
|
|
var me = this;
|
|
if (!me._view) {
|
|
me._view = helpers.clone(me._model);
|
|
}
|
|
me._start = {};
|
|
return me;
|
|
},
|
|
|
|
transition: function(ease) {
|
|
var me = this;
|
|
var model = me._model;
|
|
var start = me._start;
|
|
var view = me._view;
|
|
|
|
// No animation -> No Transition
|
|
if (!model || ease === 1) {
|
|
me._view = model;
|
|
me._start = null;
|
|
return me;
|
|
}
|
|
|
|
if (!view) {
|
|
view = me._view = {};
|
|
}
|
|
|
|
if (!start) {
|
|
start = me._start = {};
|
|
}
|
|
|
|
interpolate(start, view, model, ease);
|
|
|
|
return me;
|
|
},
|
|
|
|
tooltipPosition: function() {
|
|
return {
|
|
x: this._model.x,
|
|
y: this._model.y
|
|
};
|
|
},
|
|
|
|
hasValue: function() {
|
|
return helpers.isNumber(this._model.x) && helpers.isNumber(this._model.y);
|
|
}
|
|
});
|
|
|
|
Chart.Element.extend = helpers.inherits;
|
|
};
|