Skip to content

Commit

Permalink
Do not redraw endlessly on mouse move (#8898)
Browse files Browse the repository at this point in the history
* Do not redraw endlessly on mouse move

The tooltip incorrectly determined that the position changed leading to many redraws

* Code review feedback
  • Loading branch information
etimberg committed Apr 15, 2021
1 parent 768bd38 commit cc4ce7a
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 11 deletions.
17 changes: 7 additions & 10 deletions src/plugins/plugin.tooltip.js
Expand Up @@ -14,9 +14,6 @@ import {drawPoint} from '../helpers';
const positioners = {
/**
* Average mode places the tooltip at the average position of the elements shown
* @function Chart.Tooltip.positioners.average
* @param items {object[]} the items being displayed in the tooltip
* @returns {object} tooltip position
*/
average(items) {
if (!items.length) {
Expand Down Expand Up @@ -46,12 +43,12 @@ const positioners = {

/**
* Gets the tooltip position nearest of the item nearest to the event position
* @function Chart.Tooltip.positioners.nearest
* @param items {object[]} the tooltip items
* @param eventPosition {object} the position of the event in canvas coordinates
* @returns {object} the tooltip position
*/
nearest(items, eventPosition) {
if (!items.length) {
return false;
}

let x = eventPosition.x;
let y = eventPosition.y;
let minDistance = Number.POSITIVE_INFINITY;
Expand Down Expand Up @@ -1073,9 +1070,9 @@ export class Tooltip extends Element {
* @returns {boolean} True if the position has changed
*/
_positionChanged(active, e) {
const me = this;
const position = positioners[me.options.position].call(me, active, e);
return me.caretX !== position.x || me.caretY !== position.y;
const {caretX, caretY, options} = this;
const position = positioners[options.position].call(this, active, e);
return position !== false && (caretX !== position.x || caretY !== position.y);
}
}

Expand Down
2 changes: 1 addition & 1 deletion types/index.esm.d.ts
Expand Up @@ -2331,7 +2331,7 @@ export interface TooltipModel<TType extends ChartType> {

export const Tooltip: Plugin & {
readonly positioners: {
[key: string]: (items: readonly Element[], eventPosition: { x: number; y: number }) => { x: number; y: number };
[key: string]: (items: readonly Element[], eventPosition: { x: number; y: number }) => { x: number; y: number } | false;
};

getActiveElements(): ActiveElement[];
Expand Down

0 comments on commit cc4ce7a

Please sign in to comment.