@@ -16,6 +16,7 @@ var Drawing = require('../../components/drawing');
16
16
var svgTextUtils = require ( '../../lib/svg_text_utils' ) ;
17
17
18
18
var helpers = require ( './helpers' ) ;
19
+ var eventData = require ( './event_data' ) ;
19
20
20
21
module . exports = function plot ( gd , cdpie ) {
21
22
var fullLayout = gd . _fullLayout ;
@@ -69,15 +70,23 @@ module.exports = function plot(gd, cdpie) {
69
70
var cy = cd0 . cy ;
70
71
var sliceTop = d3 . select ( this ) ;
71
72
var slicePath = sliceTop . selectAll ( 'path.surface' ) . data ( [ pt ] ) ;
72
- var hasHoverData = false ;
73
73
74
- function handleMouseOver ( evt ) {
75
- evt . originalEvent = d3 . event ;
74
+ // hover state vars
75
+ // have we drawn a hover label, so it should be cleared later
76
+ var hasHoverLabel = false ;
77
+ // have we emitted a hover event, so later an unhover event should be emitted
78
+ // note that click events do not depend on this - you can still get them
79
+ // with hovermode: false or if you were earlier dragging, then clicked
80
+ // in the same slice that you moused up in
81
+ var hasHoverEvent = false ;
76
82
83
+ function handleMouseOver ( ) {
77
84
// in case fullLayout or fullData has changed without a replot
78
85
var fullLayout2 = gd . _fullLayout ;
79
86
var trace2 = gd . _fullData [ trace . index ] ;
80
87
88
+ if ( gd . _dragging || fullLayout2 . hovermode === false ) return ;
89
+
81
90
var hoverinfo = trace2 . hoverinfo ;
82
91
if ( Array . isArray ( hoverinfo ) ) {
83
92
// super hacky: we need to pull out the *first* hoverinfo from
@@ -95,68 +104,78 @@ module.exports = function plot(gd, cdpie) {
95
104
96
105
// in case we dragged over the pie from another subplot,
97
106
// or if hover is turned off
98
- if ( gd . _dragging || fullLayout2 . hovermode === false ||
99
- hoverinfo === 'none' || hoverinfo === 'skip' || ! hoverinfo ) {
100
- Fx . hover ( gd , evt , 'pie' ) ;
101
- return ;
102
- }
103
-
104
- var rInscribed = getInscribedRadiusFraction ( pt , cd0 ) ;
105
- var hoverCenterX = cx + pt . pxmid [ 0 ] * ( 1 - rInscribed ) ;
106
- var hoverCenterY = cy + pt . pxmid [ 1 ] * ( 1 - rInscribed ) ;
107
- var separators = fullLayout . separators ;
108
- var thisText = [ ] ;
107
+ if ( hoverinfo !== 'none' && hoverinfo !== 'skip' && hoverinfo ) {
108
+ var rInscribed = getInscribedRadiusFraction ( pt , cd0 ) ;
109
+ var hoverCenterX = cx + pt . pxmid [ 0 ] * ( 1 - rInscribed ) ;
110
+ var hoverCenterY = cy + pt . pxmid [ 1 ] * ( 1 - rInscribed ) ;
111
+ var separators = fullLayout . separators ;
112
+ var thisText = [ ] ;
113
+
114
+ if ( hoverinfo . indexOf ( 'label' ) !== - 1 ) thisText . push ( pt . label ) ;
115
+ if ( hoverinfo . indexOf ( 'text' ) !== - 1 ) {
116
+ var texti = helpers . castOption ( trace2 . hovertext || trace2 . text , pt . pts ) ;
117
+ if ( texti ) thisText . push ( texti ) ;
118
+ }
119
+ if ( hoverinfo . indexOf ( 'value' ) !== - 1 ) thisText . push ( helpers . formatPieValue ( pt . v , separators ) ) ;
120
+ if ( hoverinfo . indexOf ( 'percent' ) !== - 1 ) thisText . push ( helpers . formatPiePercent ( pt . v / cd0 . vTotal , separators ) ) ;
121
+
122
+ var hoverLabel = trace . hoverlabel ;
123
+ var hoverFont = hoverLabel . font ;
124
+
125
+ Fx . loneHover ( {
126
+ x0 : hoverCenterX - rInscribed * cd0 . r ,
127
+ x1 : hoverCenterX + rInscribed * cd0 . r ,
128
+ y : hoverCenterY ,
129
+ text : thisText . join ( '<br>' ) ,
130
+ name : hoverinfo . indexOf ( 'name' ) !== - 1 ? trace2 . name : undefined ,
131
+ idealAlign : pt . pxmid [ 0 ] < 0 ? 'left' : 'right' ,
132
+ color : helpers . castOption ( hoverLabel . bgcolor , pt . pts ) || pt . color ,
133
+ borderColor : helpers . castOption ( hoverLabel . bordercolor , pt . pts ) ,
134
+ fontFamily : helpers . castOption ( hoverFont . family , pt . pts ) ,
135
+ fontSize : helpers . castOption ( hoverFont . size , pt . pts ) ,
136
+ fontColor : helpers . castOption ( hoverFont . color , pt . pts )
137
+ } , {
138
+ container : fullLayout2 . _hoverlayer . node ( ) ,
139
+ outerContainer : fullLayout2 . _paper . node ( ) ,
140
+ gd : gd
141
+ } ) ;
109
142
110
- if ( hoverinfo . indexOf ( 'label' ) !== - 1 ) thisText . push ( pt . label ) ;
111
- if ( hoverinfo . indexOf ( 'text' ) !== - 1 ) {
112
- var texti = helpers . castOption ( trace2 . hovertext || trace2 . text , pt . pts ) ;
113
- if ( texti ) thisText . push ( texti ) ;
143
+ hasHoverLabel = true ;
114
144
}
115
- if ( hoverinfo . indexOf ( 'value' ) !== - 1 ) thisText . push ( helpers . formatPieValue ( pt . v , separators ) ) ;
116
- if ( hoverinfo . indexOf ( 'percent' ) !== - 1 ) thisText . push ( helpers . formatPiePercent ( pt . v / cd0 . vTotal , separators ) ) ;
117
-
118
- var hoverLabel = trace . hoverlabel ;
119
- var hoverFont = hoverLabel . font ;
120
-
121
- Fx . loneHover ( {
122
- x0 : hoverCenterX - rInscribed * cd0 . r ,
123
- x1 : hoverCenterX + rInscribed * cd0 . r ,
124
- y : hoverCenterY ,
125
- text : thisText . join ( '<br>' ) ,
126
- name : hoverinfo . indexOf ( 'name' ) !== - 1 ? trace2 . name : undefined ,
127
- idealAlign : pt . pxmid [ 0 ] < 0 ? 'left' : 'right' ,
128
- color : helpers . castOption ( hoverLabel . bgcolor , pt . pts ) || pt . color ,
129
- borderColor : helpers . castOption ( hoverLabel . bordercolor , pt . pts ) ,
130
- fontFamily : helpers . castOption ( hoverFont . family , pt . pts ) ,
131
- fontSize : helpers . castOption ( hoverFont . size , pt . pts ) ,
132
- fontColor : helpers . castOption ( hoverFont . color , pt . pts )
133
- } , {
134
- container : fullLayout2 . _hoverlayer . node ( ) ,
135
- outerContainer : fullLayout2 . _paper . node ( ) ,
136
- gd : gd
137
- } ) ;
138
-
139
- Fx . hover ( gd , evt , 'pie' ) ;
140
145
141
- hasHoverData = true ;
146
+ gd . emit ( 'plotly_hover' , {
147
+ points : [ eventData ( pt , trace2 ) ] ,
148
+ event : d3 . event
149
+ } ) ;
150
+ hasHoverEvent = true ;
142
151
}
143
152
144
153
function handleMouseOut ( evt ) {
145
- evt . originalEvent = d3 . event ;
146
- gd . emit ( 'plotly_unhover' , {
147
- event : d3 . event ,
148
- points : [ evt ]
149
- } ) ;
154
+ var fullLayout2 = gd . _fullLayout ;
155
+ var trace2 = gd . _fullData [ trace . index ] ;
156
+
157
+ if ( hasHoverEvent ) {
158
+ evt . originalEvent = d3 . event ;
159
+ gd . emit ( 'plotly_unhover' , {
160
+ points : [ eventData ( pt , trace2 ) ] ,
161
+ event : d3 . event
162
+ } ) ;
163
+ hasHoverEvent = false ;
164
+ }
150
165
151
- if ( hasHoverData ) {
152
- Fx . loneUnhover ( fullLayout . _hoverlayer . node ( ) ) ;
153
- hasHoverData = false ;
166
+ if ( hasHoverLabel ) {
167
+ Fx . loneUnhover ( fullLayout2 . _hoverlayer . node ( ) ) ;
168
+ hasHoverLabel = false ;
154
169
}
155
170
}
156
171
157
172
function handleClick ( ) {
158
- gd . _hoverdata = [ pt ] ;
159
- gd . _hoverdata . trace = cd0 . trace ;
173
+ var fullLayout2 = gd . _fullLayout ;
174
+ var trace2 = gd . _fullData [ trace . index ] ;
175
+
176
+ if ( gd . _dragging || fullLayout2 . hovermode === false ) return ;
177
+
178
+ gd . _hoverdata = [ eventData ( pt , trace2 ) ] ;
160
179
Fx . click ( gd , d3 . event ) ;
161
180
}
162
181
0 commit comments