2
2
3
3
var helpers = require ( './helpers' ) ;
4
4
var calcHover = require ( '../scattergl/hover' ) . calcHover ;
5
+ var getFromId = require ( '../../plots/cartesian/axes' ) . getFromId ;
6
+ var extendFlat = require ( '../../lib/extend' ) . extendFlat ;
5
7
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 ) {
7
57
var cd = pointData . cd ;
8
58
var trace = cd [ 0 ] . trace ;
9
59
var scene = pointData . scene ;
10
60
var cdata = scene . matrixOptions . cdata ;
11
61
var xa = pointData . xa ;
12
62
var ya = pointData . ya ;
13
- var xpx = xa . c2p ( xval ) ;
14
- var ypx = ya . c2p ( yval ) ;
15
63
var maxDistance = pointData . distance ;
16
64
17
65
var xi = helpers . getDimIndex ( trace , xa ) ;
@@ -21,19 +69,34 @@ function hoverPoints(pointData, xval, yval) {
21
69
var x = cdata [ xi ] ;
22
70
var y = cdata [ yi ] ;
23
71
24
- var id , dxy ;
72
+ var id , dxy , _xpx , _ypx ;
25
73
var minDist = maxDistance ;
26
74
27
75
for ( var i = 0 ; i < x . length ; i ++ ) {
28
76
var ptx = x [ i ] ;
29
77
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
+ }
33
94
34
- if ( dist < minDist ) {
95
+ if ( pick ) {
35
96
minDist = dxy = dist ;
36
97
id = i ;
98
+ _xpx = thisXpx ;
99
+ _ypx = thisYpx ;
37
100
}
38
101
}
39
102
@@ -43,7 +106,10 @@ function hoverPoints(pointData, xval, yval) {
43
106
44
107
if ( id === undefined ) return [ pointData ] ;
45
108
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 ] ;
47
113
}
48
114
49
115
module . exports = {
0 commit comments