22
33var helpers = require ( './helpers' ) ;
44var calcHover = require ( '../scattergl/hover' ) . calcHover ;
5+ var getFromId = require ( '../../plots/cartesian/axes' ) . getFromId ;
6+ var extendFlat = require ( '../../lib/extend' ) . extendFlat ;
57
6- function hoverPoints ( pointData , xval , yval ) {
8+ function hoverPoints ( pointData , xval , yval , hovermode , opts ) {
9+ if ( ! opts ) opts = { } ;
10+
11+ var hovermodeHasX = ( hovermode || '' ) . charAt ( 0 ) === 'x' ;
12+ var hovermodeHasY = ( hovermode || '' ) . charAt ( 0 ) === 'y' ;
13+
14+ var xpx = pointData . xa . c2p ( xval ) ;
15+ var ypx = pointData . ya . c2p ( yval ) ;
16+
17+ var points = _hoverPoints ( pointData , xpx , ypx ) ;
18+
19+ if ( opts . hoversameaxis && ( hovermodeHasX || hovermodeHasY ) ) {
20+ var _xpx = points [ 0 ] . _xpx ;
21+ var _ypx = points [ 0 ] . _ypx ;
22+
23+ if (
24+ ( hovermodeHasX && _xpx !== undefined ) ||
25+ ( hovermodeHasY && _ypx !== undefined )
26+ ) {
27+ var subplotsWith = (
28+ hovermodeHasX ?
29+ pointData . xa :
30+ pointData . ya
31+ ) . _subplotsWith ;
32+
33+ var gd = opts . gd ;
34+
35+ var _pointData = extendFlat ( { } , pointData ) ;
36+
37+ for ( var i = 0 ; i < subplotsWith . length ; i ++ ) {
38+ var spId = subplotsWith [ i ] ;
39+
40+ if ( hovermodeHasY ) {
41+ _pointData . xa = getFromId ( gd , spId , 'x' ) ;
42+ } else { // hovermodeHasX
43+ _pointData . ya = getFromId ( gd , spId , 'y' ) ;
44+ }
45+
46+ var newPoints = _hoverPoints ( _pointData , _xpx , _ypx , hovermodeHasX , hovermodeHasY ) ;
47+
48+ points = points . concat ( newPoints ) ;
49+ }
50+ }
51+ }
52+
53+ return points ;
54+ }
55+
56+ function _hoverPoints ( pointData , xpx , ypx , hoversameaxisX , hoversameaxisY ) {
757 var cd = pointData . cd ;
858 var trace = cd [ 0 ] . trace ;
959 var scene = pointData . scene ;
1060 var cdata = scene . matrixOptions . cdata ;
1161 var xa = pointData . xa ;
1262 var ya = pointData . ya ;
13- var xpx = xa . c2p ( xval ) ;
14- var ypx = ya . c2p ( yval ) ;
1563 var maxDistance = pointData . distance ;
1664
1765 var xi = helpers . getDimIndex ( trace , xa ) ;
@@ -21,19 +69,34 @@ function hoverPoints(pointData, xval, yval) {
2169 var x = cdata [ xi ] ;
2270 var y = cdata [ yi ] ;
2371
24- var id , dxy ;
72+ var id , dxy , _xpx , _ypx ;
2573 var minDist = maxDistance ;
2674
2775 for ( var i = 0 ; i < x . length ; i ++ ) {
2876 var ptx = x [ i ] ;
2977 var pty = y [ i ] ;
30- var dx = xa . c2p ( ptx ) - xpx ;
31- var dy = ya . c2p ( pty ) - ypx ;
32- var dist = Math . sqrt ( dx * dx + dy * dy ) ;
78+ var thisXpx = xa . c2p ( ptx ) ;
79+ var thisYpx = ya . c2p ( pty ) ;
80+
81+ var dx = thisXpx - xpx ;
82+ var dy = thisYpx - ypx ;
83+ var dist = 0 ;
84+
85+ var pick = false ;
86+ if ( hoversameaxisX ) {
87+ if ( dx === 0 ) pick = true ;
88+ } else if ( hoversameaxisY ) {
89+ if ( dy === 0 ) pick = true ;
90+ } else {
91+ dist = Math . sqrt ( dx * dx + dy * dy ) ;
92+ if ( dist < minDist ) pick = true ;
93+ }
3394
34- if ( dist < minDist ) {
95+ if ( pick ) {
3596 minDist = dxy = dist ;
3697 id = i ;
98+ _xpx = thisXpx ;
99+ _ypx = thisYpx ;
37100 }
38101 }
39102
@@ -43,7 +106,10 @@ function hoverPoints(pointData, xval, yval) {
43106
44107 if ( id === undefined ) return [ pointData ] ;
45108
46- return [ calcHover ( pointData , x , y , trace ) ] ;
109+ var out = calcHover ( pointData , x , y , trace ) ;
110+ out . _xpx = _xpx ;
111+ out . _ypx = _ypx ;
112+ return [ out ] ;
47113}
48114
49115module . exports = {
0 commit comments