@@ -16,6 +16,7 @@ var Drawing = require('../../components/drawing');
1616var svgTextUtils = require ( '../../lib/svg_text_utils' ) ;
1717
1818var helpers = require ( './helpers' ) ;
19+ var eventData = require ( './event_data' ) ;
1920
2021module . exports = function plot ( gd , cdpie ) {
2122 var fullLayout = gd . _fullLayout ;
@@ -69,15 +70,23 @@ module.exports = function plot(gd, cdpie) {
6970 var cy = cd0 . cy ;
7071 var sliceTop = d3 . select ( this ) ;
7172 var slicePath = sliceTop . selectAll ( 'path.surface' ) . data ( [ pt ] ) ;
72- var hasHoverData = false ;
7373
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 ;
7682
83+ function handleMouseOver ( ) {
7784 // in case fullLayout or fullData has changed without a replot
7885 var fullLayout2 = gd . _fullLayout ;
7986 var trace2 = gd . _fullData [ trace . index ] ;
8087
88+ if ( gd . _dragging || fullLayout2 . hovermode === false ) return ;
89+
8190 var hoverinfo = trace2 . hoverinfo ;
8291 if ( Array . isArray ( hoverinfo ) ) {
8392 // super hacky: we need to pull out the *first* hoverinfo from
@@ -95,68 +104,78 @@ module.exports = function plot(gd, cdpie) {
95104
96105 // in case we dragged over the pie from another subplot,
97106 // 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+ } ) ;
109142
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 ;
114144 }
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' ) ;
140145
141- hasHoverData = true ;
146+ gd . emit ( 'plotly_hover' , {
147+ points : [ eventData ( pt , trace2 ) ] ,
148+ event : d3 . event
149+ } ) ;
150+ hasHoverEvent = true ;
142151 }
143152
144153 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+ }
150165
151- if ( hasHoverData ) {
152- Fx . loneUnhover ( fullLayout . _hoverlayer . node ( ) ) ;
153- hasHoverData = false ;
166+ if ( hasHoverLabel ) {
167+ Fx . loneUnhover ( fullLayout2 . _hoverlayer . node ( ) ) ;
168+ hasHoverLabel = false ;
154169 }
155170 }
156171
157172 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 ) ] ;
160179 Fx . click ( gd , d3 . event ) ;
161180 }
162181
0 commit comments