From 4e47c178e42fe84e40d39f9e2b7e26030cc0fc23 Mon Sep 17 00:00:00 2001 From: jcopperfield <33193571+jcopperfield@users.noreply.github.com> Date: Wed, 13 Dec 2017 00:43:17 +0100 Subject: [PATCH] Fix tooltip animation when target changes while animating (#5005) * Fix issue #4989 - tooltip in 'index' mode doesn't animate smoothly. * Change: different approach for smooth tooltip animation in 'index' mode, when target doesn't change. * Fix: jslint error * Fix: remove spyOn pivot from test * Add: setAnimating-flag in transition used to set on tooltip.transition to keep track of tooltip animation. * Decrease code complexity * Revert transition and complexity changes Add: use 'tooltip._start' as workaround check for tooltip animation status --- src/core/core.controller.js | 10 +++++++++- src/core/core.tooltip.js | 32 +++++++++++++------------------- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/core/core.controller.js b/src/core/core.controller.js index 17e6c3bfa67..6026e8620fb 100644 --- a/src/core/core.controller.js +++ b/src/core/core.controller.js @@ -849,7 +849,15 @@ module.exports = function(Chart) { me._bufferedRequest = null; var changed = me.handleEvent(e); - changed |= tooltip && tooltip.handleEvent(e); + // for smooth tooltip animations issue #4989 + // the tooltip should be the source of change + // Animation check workaround: + // tooltip._start will be null when tooltip isn't animating + if (tooltip) { + changed = tooltip._start + ? tooltip.handleEvent(e) + : changed | tooltip.handleEvent(e); + } plugins.notify(me, 'afterEvent', [e]); diff --git a/src/core/core.tooltip.js b/src/core/core.tooltip.js index 0072580dfbf..9b09d760443 100644 --- a/src/core/core.tooltip.js +++ b/src/core/core.tooltip.js @@ -852,25 +852,19 @@ module.exports = function(Chart) { // Remember Last Actives changed = !helpers.arrayEquals(me._active, me._lastActive); - // If tooltip didn't change, do not handle the target event - if (!changed) { - return false; - } - - me._lastActive = me._active; - - if (options.enabled || options.custom) { - me._eventPosition = { - x: e.x, - y: e.y - }; - - var model = me._model; - me.update(true); - me.pivot(); - - // See if our tooltip position changed - changed |= (model.x !== me._model.x) || (model.y !== me._model.y); + // Only handle target event on tooltip change + if (changed) { + me._lastActive = me._active; + + if (options.enabled || options.custom) { + me._eventPosition = { + x: e.x, + y: e.y + }; + + me.update(true); + me.pivot(); + } } return changed;