Skip to content

Commit b6359ef

Browse files
committed
Fold hover calc
1 parent eab3768 commit b6359ef

File tree

2 files changed

+42
-100
lines changed

2 files changed

+42
-100
lines changed

src/traces/scattergl/index.js

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -620,12 +620,13 @@ function hoverPoints(pointData, xval, yval, hovermode) {
620620
// note that point possibly may not be found
621621
var id, ptx, pty, i, dx, dy, dist, dxy;
622622

623+
var minDist = maxDistance;
623624
if(hovermode === 'x') {
624625
for(i = 0; i < ids.length; i++) {
625626
ptx = x[ids[i]];
626627
dx = Math.abs(xa.c2p(ptx) - xpx);
627-
if(dx < maxDistance) {
628-
maxDistance = dx;
628+
if(dx < minDist) {
629+
minDist = dx;
629630
dy = ya.c2p(y[ids[i]]) - ypx;
630631
dxy = Math.sqrt(dx * dx + dy * dy);
631632
id = ids[i];
@@ -640,17 +641,32 @@ function hoverPoints(pointData, xval, yval, hovermode) {
640641
dy = ya.c2p(pty) - ypx;
641642

642643
dist = Math.sqrt(dx * dx + dy * dy);
643-
if(dist < maxDistance) {
644-
maxDistance = dxy = dist;
644+
if(dist < minDist) {
645+
minDist = dxy = dist;
645646
id = ids[i];
646647
}
647648
}
648649
}
649650

650651
pointData.index = id;
652+
pointData.distance = minDist;
653+
pointData.dxy = dxy;
651654

652655
if(id === undefined) return [pointData];
653656

657+
calcHover(pointData, x, y, trace);
658+
659+
return [pointData];
660+
}
661+
662+
663+
function calcHover(pointData, x, y, trace) {
664+
var xa = pointData.xa;
665+
var ya = pointData.ya;
666+
var minDist = pointData.distance;
667+
var dxy = pointData.dxy;
668+
var id = pointData.index;
669+
654670
// the closest data point
655671
var di = {
656672
pointNumber: id,
@@ -725,7 +741,7 @@ function hoverPoints(pointData, xval, yval, hovermode) {
725741
yLabelVal: di.y,
726742

727743
cd: fakeCd,
728-
distance: maxDistance,
744+
distance: minDist,
729745
spikeDistance: dxy
730746
});
731747

@@ -736,9 +752,10 @@ function hoverPoints(pointData, xval, yval, hovermode) {
736752
fillHoverText(di, trace, pointData);
737753
Registry.getComponentMethod('errorbars', 'hoverInfo')(di, trace, pointData);
738754

739-
return [pointData];
755+
return pointData;
740756
}
741757

758+
742759
function selectPoints(searchInfo, polygon) {
743760
var cd = searchInfo.cd;
744761
var selection = [];
@@ -827,6 +844,8 @@ module.exports = {
827844
sceneOptions: sceneOptions,
828845
sceneUpdate: sceneUpdate,
829846

847+
calcHover: calcHover,
848+
830849
meta: {
831850
hrName: 'scatter_gl',
832851
description: [

src/traces/splom/index.js

Lines changed: 17 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ var calcMarkerSize = require('../scatter/calc').calcMarkerSize;
1717
var calcAxisExpansion = require('../scatter/calc').calcAxisExpansion;
1818
var calcColorscales = require('../scatter/colorscale_calc');
1919
var convertMarkerStyle = require('../scattergl/convert').convertMarkerStyle;
20-
var getTraceColor = require('../scatter/get_trace_color');
20+
var calcHover = require('../scattergl').calcHover;
2121

2222
var BADNUM = require('../../constants/numerical').BADNUM;
2323
var TOO_MANY_POINTS = require('../scattergl/constants').TOO_MANY_POINTS;
@@ -214,123 +214,46 @@ function hoverPoints(pointData, xval, yval, hovermode) {
214214
if(trace.yaxes[i] === ya._id) yi = i;
215215
}
216216

217-
var xData = dimensions[xi].values;
218-
var yData = dimensions[yi].values;
217+
var x = dimensions[xi].values;
218+
var y = dimensions[yi].values;
219219

220220
var id, ptx, pty, dx, dy, dist, dxy;
221+
var minDist = maxDistance;
221222

222223
if(hovermode === 'x') {
223-
for(i = 0; i < xData.length; i++) {
224-
ptx = xData[i];
224+
for(i = 0; i < x.length; i++) {
225+
ptx = x[i];
225226
dx = Math.abs(xa.c2p(ptx) - xpx);
226-
if(dx < maxDistance) {
227-
maxDistance = dx;
228-
dy = ya.c2p(yData[i]) - ypx;
227+
if(dx < minDist) {
228+
minDist = dx;
229+
dy = ya.c2p(y[i]) - ypx;
229230
dxy = Math.sqrt(dx * dx + dy * dy);
230231
id = i;
231232
}
232233
}
233234
}
234235
else {
235-
for(i = 0; i < xData.length; i++) {
236-
ptx = xData[i];
237-
pty = yData[i];
236+
for(i = 0; i < x.length; i++) {
237+
ptx = x[i];
238+
pty = y[i];
238239
dx = xa.c2p(ptx) - xpx;
239240
dy = ya.c2p(pty) - ypx;
240241

241242
dist = Math.sqrt(dx * dx + dy * dy);
242-
if(dist < maxDistance) {
243-
maxDistance = dxy = dist;
243+
if(dist < minDist) {
244+
minDist = dxy = dist;
244245
id = i;
245246
}
246247
}
247248
}
248249

249250
pointData.index = id;
250-
251+
pointData.distance = minDist;
252+
pointData.dxy = dxy;
251253

252254
if(id === undefined) return [pointData];
253255

254-
// the closest data point
255-
var di = {
256-
pointNumber: id,
257-
x: xData[id],
258-
y: yData[id]
259-
};
260-
261-
262-
// that is single-item arrays_to_calcdata excerpt, since we are doing it for a single point and we don't have to do it beforehead for 1e6 points
263-
// FIXME: combine with scattergl hover di calc
264-
di.tx = Array.isArray(trace.text) ? trace.text[id] : trace.text;
265-
di.htx = Array.isArray(trace.hovertext) ? trace.hovertext[id] : trace.hovertext;
266-
di.data = Array.isArray(trace.customdata) ? trace.customdata[id] : trace.customdata;
267-
di.tp = Array.isArray(trace.textposition) ? trace.textposition[id] : trace.textposition;
268-
269-
var font = trace.textfont;
270-
if(font) {
271-
di.ts = Array.isArray(font.size) ? font.size[id] : font.size;
272-
di.tc = Array.isArray(font.color) ? font.color[id] : font.color;
273-
di.tf = Array.isArray(font.family) ? font.family[id] : font.family;
274-
}
275-
276-
var marker = trace.marker;
277-
if(marker) {
278-
di.ms = Lib.isArrayOrTypedArray(marker.size) ? marker.size[id] : marker.size;
279-
di.mo = Lib.isArrayOrTypedArray(marker.opacity) ? marker.opacity[id] : marker.opacity;
280-
di.mx = Array.isArray(marker.symbol) ? marker.symbol[id] : marker.symbol;
281-
di.mc = Lib.isArrayOrTypedArray(marker.color) ? marker.color[id] : marker.color;
282-
}
283-
284-
var line = marker && marker.line;
285-
if(line) {
286-
di.mlc = Array.isArray(line.color) ? line.color[id] : line.color;
287-
di.mlw = Lib.isArrayOrTypedArray(line.width) ? line.width[id] : line.width;
288-
}
289-
290-
var grad = marker && marker.gradient;
291-
if(grad && grad.type !== 'none') {
292-
di.mgt = Array.isArray(grad.type) ? grad.type[id] : grad.type;
293-
di.mgc = Array.isArray(grad.color) ? grad.color[id] : grad.color;
294-
}
295-
296-
var xp = xa.c2p(di.x, true);
297-
var yp = ya.c2p(di.y, true);
298-
var rad = di.mrc || 1;
299-
300-
var hoverlabel = trace.hoverlabel;
301-
302-
if(hoverlabel) {
303-
di.hbg = Array.isArray(hoverlabel.bgcolor) ? hoverlabel.bgcolor[id] : hoverlabel.bgcolor;
304-
di.hbc = Array.isArray(hoverlabel.bordercolor) ? hoverlabel.bordercolor[id] : hoverlabel.bordercolor;
305-
di.hts = Array.isArray(hoverlabel.font.size) ? hoverlabel.font.size[id] : hoverlabel.font.size;
306-
di.htc = Array.isArray(hoverlabel.font.color) ? hoverlabel.font.color[id] : hoverlabel.font.color;
307-
di.htf = Array.isArray(hoverlabel.font.family) ? hoverlabel.font.family[id] : hoverlabel.font.family;
308-
di.hnl = Array.isArray(hoverlabel.namelength) ? hoverlabel.namelength[id] : hoverlabel.namelength;
309-
}
310-
var hoverinfo = trace.hoverinfo;
311-
if(hoverinfo) {
312-
di.hi = Array.isArray(hoverinfo) ? hoverinfo[id] : hoverinfo;
313-
}
314-
315-
316-
var fakeCd = {};
317-
fakeCd[pointData.index] = di;
318-
319-
Lib.extendFlat(pointData, {
320-
color: getTraceColor(trace, di),
321-
322-
x0: xp - rad,
323-
x1: xp + rad,
324-
xLabelVal: di.x,
325-
326-
y0: yp - rad,
327-
y1: yp + rad,
328-
yLabelVal: di.y,
329-
330-
cd: fakeCd,
331-
distance: maxDistance,
332-
spikeDistance: dxy
333-
});
256+
calcHover(pointData, x, y, trace);
334257

335258
return [pointData];
336259
}

0 commit comments

Comments
 (0)