@@ -18,37 +18,13 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) {
18
18
var cd = pointData . cd ;
19
19
var trace = cd [ 0 ] . trace ;
20
20
var t = cd [ 0 ] . t ;
21
- var xa = pointData . xa ;
22
- var ya = pointData . ya ;
23
21
24
- var posVal , thisBarMinPos , thisBarMaxPos , minPos , maxPos , dx , dy ;
22
+ var posVal , sizeVal , posLetter , sizeLetter , dx , dy ;
25
23
26
- var positionFn = function ( di ) {
27
- return Fx . inbox ( minPos ( di ) - posVal , maxPos ( di ) - posVal ) ;
28
- } ;
24
+ function thisBarMinPos ( di ) { return di [ posLetter ] - di . w / 2 ; }
25
+ function thisBarMaxPos ( di ) { return di [ posLetter ] + di . w / 2 ; }
29
26
30
- if ( trace . orientation === 'h' ) {
31
- posVal = yval ;
32
- thisBarMinPos = function ( di ) { return di . y - di . w / 2 ; } ;
33
- thisBarMaxPos = function ( di ) { return di . y + di . w / 2 ; } ;
34
- dx = function ( di ) {
35
- // add a gradient so hovering near the end of a
36
- // bar makes it a little closer match
37
- return Fx . inbox ( di . b - xval , di . x - xval ) + ( di . x - xval ) / ( di . x - di . b ) ;
38
- } ;
39
- dy = positionFn ;
40
- }
41
- else {
42
- posVal = xval ;
43
- thisBarMinPos = function ( di ) { return di . x - di . w / 2 ; } ;
44
- thisBarMaxPos = function ( di ) { return di . x + di . w / 2 ; } ;
45
- dy = function ( di ) {
46
- return Fx . inbox ( di . b - yval , di . y - yval ) + ( di . y - yval ) / ( di . y - di . b ) ;
47
- } ;
48
- dx = positionFn ;
49
- }
50
-
51
- minPos = ( hovermode === 'closest' ) ?
27
+ var minPos = ( hovermode === 'closest' ) ?
52
28
thisBarMinPos :
53
29
function ( di ) {
54
30
/*
@@ -60,44 +36,66 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) {
60
36
return Math . min ( thisBarMinPos ( di ) , di . p - t . bargroupwidth / 2 ) ;
61
37
} ;
62
38
63
- maxPos = ( hovermode === 'closest' ) ?
39
+ var maxPos = ( hovermode === 'closest' ) ?
64
40
thisBarMaxPos :
65
41
function ( di ) {
66
42
return Math . max ( thisBarMaxPos ( di ) , di . p + t . bargroupwidth / 2 ) ;
67
43
} ;
68
44
45
+ function positionFn ( di ) {
46
+ return Fx . inbox ( minPos ( di ) - posVal , maxPos ( di ) - posVal ) ;
47
+ }
48
+
49
+ function sizeFn ( di ) {
50
+ // add a gradient so hovering near the end of a
51
+ // bar makes it a little closer match
52
+ return Fx . inbox ( di . b - sizeVal , di [ sizeLetter ] - sizeVal ) +
53
+ ( di [ sizeLetter ] - sizeVal ) / ( di [ sizeLetter ] - di . b ) ;
54
+ }
55
+
56
+ if ( trace . orientation === 'h' ) {
57
+ posVal = yval ;
58
+ sizeVal = xval ;
59
+ posLetter = 'y' ;
60
+ sizeLetter = 'x' ;
61
+ dx = sizeFn ;
62
+ dy = positionFn ;
63
+ }
64
+ else {
65
+ posVal = xval ;
66
+ sizeVal = yval ;
67
+ posLetter = 'x' ;
68
+ sizeLetter = 'y' ;
69
+ dy = sizeFn ;
70
+ dx = positionFn ;
71
+ }
72
+
73
+ var pa = pointData [ posLetter + 'a' ] ;
74
+ var sa = pointData [ sizeLetter + 'a' ] ;
75
+
69
76
var distfn = Fx . getDistanceFunction ( hovermode , dx , dy ) ;
70
77
Fx . getClosest ( cd , distfn , pointData ) ;
71
78
72
79
// skip the rest (for this trace) if we didn't find a close point
73
80
if ( pointData . index === false ) return ;
74
81
75
82
// the closest data point
76
- var index = pointData . index ,
77
- di = cd [ index ] ,
78
- mc = di . mcc || trace . marker . color ,
79
- mlc = di . mlcc || trace . marker . line . color ,
80
- mlw = di . mlw || trace . marker . line . width ;
83
+ var index = pointData . index ;
84
+ var di = cd [ index ] ;
85
+ var mc = di . mcc || trace . marker . color ;
86
+ var mlc = di . mlcc || trace . marker . line . color ;
87
+ var mlw = di . mlw || trace . marker . line . width ;
88
+
81
89
if ( Color . opacity ( mc ) ) pointData . color = mc ;
82
90
else if ( Color . opacity ( mlc ) && mlw ) pointData . color = mlc ;
83
91
84
92
var size = ( trace . base ) ? di . b + di . s : di . s ;
85
- if ( trace . orientation === 'h' ) {
86
- pointData . x0 = pointData . x1 = xa . c2p ( di . x , true ) ;
87
- pointData . xLabelVal = size ;
93
+ pointData [ sizeLetter + '0' ] = pointData [ sizeLetter + '1' ] = sa . c2p ( di [ sizeLetter ] , true ) ;
94
+ pointData [ sizeLetter + 'LabelVal' ] = size ;
88
95
89
- pointData . y0 = ya . c2p ( minPos ( di ) , true ) ;
90
- pointData . y1 = ya . c2p ( maxPos ( di ) , true ) ;
91
- pointData . yLabelVal = di . p ;
92
- }
93
- else {
94
- pointData . y0 = pointData . y1 = ya . c2p ( di . y , true ) ;
95
- pointData . yLabelVal = size ;
96
-
97
- pointData . x0 = xa . c2p ( minPos ( di ) , true ) ;
98
- pointData . x1 = xa . c2p ( maxPos ( di ) , true ) ;
99
- pointData . xLabelVal = di . p ;
100
- }
96
+ pointData [ posLetter + '0' ] = pa . c2p ( minPos ( di ) , true ) ;
97
+ pointData [ posLetter + '1' ] = pa . c2p ( maxPos ( di ) , true ) ;
98
+ pointData [ posLetter + 'LabelVal' ] = di . p ;
101
99
102
100
fillHoverText ( di , trace , pointData ) ;
103
101
ErrorBars . hoverInfo ( di , trace , pointData ) ;
0 commit comments