Skip to content

Commit fe912ae

Browse files
committed
5291: recalculation of transforms on hover
1 parent f7baf5d commit fe912ae

File tree

4 files changed

+34
-6
lines changed

4 files changed

+34
-6
lines changed

src/components/fx/hover.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ var Color = require('../color');
2323
var dragElement = require('../dragelement');
2424
var Axes = require('../../plots/cartesian/axes');
2525
var Registry = require('../../registry');
26+
var plotApi = require('../../plot_api/plot_api');
2627

2728
var helpers = require('./helpers');
2829
var constants = require('./constants');
@@ -339,7 +340,8 @@ function _hover(gd, evt, subplot, noHoverEvent) {
339340

340341
xpx = evt.clientX - dbb.left;
341342
ypx = evt.clientY - dbb.top;
342-
343+
344+
plotApi.recalculateTransformInverseIfNecessary(gd);
343345
var transformedCoords = Lib.apply3DTransform(fullLayout._inverseTransform)(xpx, ypx);
344346

345347
xpx = transformedCoords[0];

src/lib/dom.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,16 @@ function isTransformableElement(element) {
150150
return element && (element instanceof Element || element instanceof HTMLElement);
151151
}
152152

153+
function domRectsAreEqual(a, b) {
154+
return a && b
155+
&& a.left === b.left
156+
&& a.top === b.top
157+
&& a.right === b.right
158+
&& a.bottom === b.bottom
159+
&& a.x === b.x
160+
&& a.y === b.y;
161+
}
162+
153163
module.exports = {
154164
getGraphDiv: getGraphDiv,
155165
isPlotDiv: isPlotDiv,
@@ -160,4 +170,5 @@ module.exports = {
160170
getFullTransformMatrix: getFullTransformMatrix,
161171
getElementTransformMatrix: getElementTransformMatrix,
162172
getElementAndAncestors: getElementAndAncestors,
173+
domRectsAreEqual: domRectsAreEqual
163174
};

src/lib/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ lib.deleteRelatedStyleRule = domModule.deleteRelatedStyleRule;
151151
lib.getFullTransformMatrix = domModule.getFullTransformMatrix;
152152
lib.getElementTransformMatrix = domModule.getElementTransformMatrix;
153153
lib.getElementAndAncestors = domModule.getElementAndAncestors;
154+
lib.domRectsAreEqual = domModule.domRectsAreEqual;
154155

155156
lib.clearResponsive = require('./clear_responsive');
156157

src/plot_api/plot_api.js

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3712,11 +3712,7 @@ function purge(gd) {
37123712
function makePlotFramework(gd) {
37133713
var gd3 = d3.select(gd);
37143714
var fullLayout = gd._fullLayout;
3715-
if(fullLayout._inverseTransform === undefined) {
3716-
var m = fullLayout._inverseTransform = Lib.inverseTransformMatrix(Lib.getFullTransformMatrix(gd));
3717-
fullLayout._inverseScaleX = Math.sqrt(m[0][0] * m[0][0] + m[0][1] * m[0][1] + m[0][2] * m[0][2]);
3718-
fullLayout._inverseScaleY = Math.sqrt(m[1][0] * m[1][0] + m[1][1] * m[1][1] + m[1][2] * m[1][2]);
3719-
}
3715+
recalculateTransformInverseIfNecessary(gd);
37203716

37213717
// Plot container
37223718
fullLayout._container = gd3.selectAll('.plot-container').data([0]);
@@ -3856,9 +3852,25 @@ function makePlotFramework(gd) {
38563852
.style('top', '0px')
38573853
.style('right', '0px');
38583854

3855+
fullLayout._lastBBox = gd.getBoundingClientRect();
3856+
38593857
gd.emit('plotly_framework');
38603858
}
38613859

3860+
// determines if the graph div requires a recalculation of its inverse matrix transforms by comparing old + new bounding boxes.
3861+
function recalculateTransformInverseIfNecessary(gd, newBBox = null) {
3862+
gd = Lib.getGraphDiv(gd);
3863+
var fullLayout = gd._fullLayout;
3864+
if (!newBBox)
3865+
newBBox = gd.getBoundingClientRect();
3866+
if (Lib.domRectsAreEqual(newBBox, fullLayout._lastBBox))
3867+
return;
3868+
var m = fullLayout._inverseTransform = Lib.inverseTransformMatrix(Lib.getFullTransformMatrix(gd));
3869+
fullLayout._inverseScaleX = Math.sqrt(m[0][0] * m[0][0] + m[0][1] * m[0][1] + m[0][2] * m[0][2]);
3870+
fullLayout._inverseScaleY = Math.sqrt(m[1][0] * m[1][0] + m[1][1] * m[1][1] + m[1][2] * m[1][2]);
3871+
fullLayout._lastBBox = gd.getBoundingClientRect();
3872+
}
3873+
38623874
exports.animate = animate;
38633875
exports.addFrames = addFrames;
38643876
exports.deleteFrames = deleteFrames;
@@ -3886,4 +3898,6 @@ exports._guiRelayout = guiEdit(relayout);
38863898
exports._guiRestyle = guiEdit(restyle);
38873899
exports._guiUpdate = guiEdit(update);
38883900

3901+
exports.recalculateTransformInverseIfNecessary = recalculateTransformInverseIfNecessary;
3902+
38893903
exports._storeDirectGUIEdit = _storeDirectGUIEdit;

0 commit comments

Comments
 (0)