@@ -17,7 +17,7 @@ var calcMarkerSize = require('../scatter/calc').calcMarkerSize;
17
17
var calcAxisExpansion = require ( '../scatter/calc' ) . calcAxisExpansion ;
18
18
var calcColorscales = require ( '../scatter/colorscale_calc' ) ;
19
19
var convertMarkerStyle = require ( '../scattergl/convert' ) . convertMarkerStyle ;
20
- var getTraceColor = require ( '../scatter/get_trace_color' ) ;
20
+ var calcHover = require ( '../scattergl' ) . calcHover ;
21
21
22
22
var BADNUM = require ( '../../constants/numerical' ) . BADNUM ;
23
23
var TOO_MANY_POINTS = require ( '../scattergl/constants' ) . TOO_MANY_POINTS ;
@@ -214,123 +214,46 @@ function hoverPoints(pointData, xval, yval, hovermode) {
214
214
if ( trace . yaxes [ i ] === ya . _id ) yi = i ;
215
215
}
216
216
217
- var xData = dimensions [ xi ] . values ;
218
- var yData = dimensions [ yi ] . values ;
217
+ var x = dimensions [ xi ] . values ;
218
+ var y = dimensions [ yi ] . values ;
219
219
220
220
var id , ptx , pty , dx , dy , dist , dxy ;
221
+ var minDist = maxDistance ;
221
222
222
223
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 ] ;
225
226
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 ;
229
230
dxy = Math . sqrt ( dx * dx + dy * dy ) ;
230
231
id = i ;
231
232
}
232
233
}
233
234
}
234
235
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 ] ;
238
239
dx = xa . c2p ( ptx ) - xpx ;
239
240
dy = ya . c2p ( pty ) - ypx ;
240
241
241
242
dist = Math . sqrt ( dx * dx + dy * dy ) ;
242
- if ( dist < maxDistance ) {
243
- maxDistance = dxy = dist ;
243
+ if ( dist < minDist ) {
244
+ minDist = dxy = dist ;
244
245
id = i ;
245
246
}
246
247
}
247
248
}
248
249
249
250
pointData . index = id ;
250
-
251
+ pointData . distance = minDist ;
252
+ pointData . dxy = dxy ;
251
253
252
254
if ( id === undefined ) return [ pointData ] ;
253
255
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 ) ;
334
257
335
258
return [ pointData ] ;
336
259
}
0 commit comments