// after update.
me.tooltip.initialize();
- // Last active contains items that were previously in the tooltip.
- // When we reset the tooltip, we need to clear it
+ // Last active contains items that were previously hovered.
me.lastActive = [];
// Do this before render so that any plugins that need final scale updates can use it
} else {
me.render(config);
}
+
+ // Replay last event from before update
+ if (me._lastEvent) {
+ me.eventHandler(me._lastEvent);
+ }
},
/**
*/
transition: function(easingValue) {
var me = this;
+ var i, ilen;
- for (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) {
+ for (i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) {
if (me.isDatasetVisible(i)) {
me.getDatasetMeta(i).controller.transition(easingValue);
}
}
me.tooltip.transition(easingValue);
+
+ if (me._lastEvent && me.animating) {
+ // If, during animation, element under mouse changes, let's react to that.
+ me.handleEvent(me._lastEvent);
+ }
},
/**
}
},
+ /**
+ * @private
+ */
+ _updateHoverStyles: function() {
+ var me = this;
+ var options = me.options || {};
+ var hoverOptions = options.hover;
+
+ // Remove styling for last active (even if it may still be active)
+ if (me.lastActive.length) {
+ me.updateHoverStyle(me.lastActive, hoverOptions.mode, false);
+ }
+
+ // Built-in hover styling
+ if (me.active.length && hoverOptions.mode) {
+ me.updateHoverStyle(me.active, hoverOptions.mode, true);
+ }
+ },
+
/**
* @private
*/
// Find Active Elements for hover and tooltips
if (e.type === 'mouseout') {
me.active = [];
+ me._lastEvent = null;
} else {
me.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions);
+ me._lastEvent = e.type === 'click' ? null : e;
}
// Invoke onHover hook
}
}
- // Remove styling for last active (even if it may still be active)
- if (me.lastActive.length) {
- me.updateHoverStyle(me.lastActive, hoverOptions.mode, false);
- }
-
- // Built in hover styling
- if (me.active.length && hoverOptions.mode) {
- me.updateHoverStyle(me.active, hoverOptions.mode, true);
- }
-
+ me._updateHoverStyles();
changed = !helpers.arrayEquals(me.active, me.lastActive);
// Remember Last Actives
labelColor: function(tooltipItem, chart) {
var meta = chart.getDatasetMeta(tooltipItem.datasetIndex);
var activeElement = meta.data[tooltipItem.index];
- var view = activeElement._view;
+ var view = activeElement.$previousStyle || activeElement._view;
return {
borderColor: view.borderColor,
backgroundColor: view.backgroundColor
var exports = Element.extend({
initialize: function() {
- this._model = getBaseModel(this._options);
- this._lastActive = [];
+ var me = this;
+ me._model = getBaseModel(me._options);
+ me._view = {};
+ me._lastActive = [];
+ },
+
+ transition: function(easingValue) {
+ var me = this;
+ var options = me._options;
+
+ if (me._lastEvent && me._chart.animating) {
+ // Let's react to changes during animation
+ me._active = me._chart.getElementsAtEventForMode(me._lastEvent, options.mode, options);
+ me.update(true);
+ me.pivot();
+ me._lastActive = me.active;
+ }
+
+ Element.prototype.transition.call(me, easingValue);
},
// Get the title
// Find Active Elements for tooltips
if (e.type === 'mouseout') {
me._active = [];
+ me._lastEvent = null;
} else {
me._active = me._chart.getElementsAtEventForMode(e, options.mode, options);
+ if (e.type !== 'click') {
+ me._lastEvent = e.type === 'click' ? null : e;
+ }
if (options.reverse) {
me._active.reverse();
}
expect(chart.tooltip._options).toEqual(jasmine.objectContaining(newTooltipConfig));
});
- it ('should reset the tooltip on update', function() {
+ it ('should update the tooltip on update', function() {
var chart = acquireChart({
type: 'line',
data: {
expect(chart.lastActive).toEqual([point]);
expect(tooltip._lastActive).toEqual([point]);
- // Update and confirm tooltip is reset
+ // Update and confirm tooltip is updated
chart.update();
- expect(chart.lastActive).toEqual([]);
- expect(tooltip._lastActive).toEqual([]);
+ expect(chart.lastActive).toEqual([point]);
+ expect(tooltip._lastActive).toEqual([point]);
});
it ('should update the metadata', function() {