@@ -559,30 +559,8 @@ function hover(gd, evt, subplot) {
559
559
// nothing left: remove all labels and quit
560
560
if ( hoverData . length === 0 ) return dragElement . unhoverRaw ( gd , evt ) ;
561
561
562
- // if there's more than one horz bar trace,
563
- // rotate the labels so they don't overlap
564
- var rotateLabels = hovermode === 'y' && searchData . length > 1 ;
565
-
566
562
hoverData . sort ( function ( d1 , d2 ) { return d1 . distance - d2 . distance ; } ) ;
567
563
568
- var bgColor = Color . combine (
569
- fullLayout . plot_bgcolor || Color . background ,
570
- fullLayout . paper_bgcolor
571
- ) ;
572
-
573
- var labelOpts = {
574
- hovermode : hovermode ,
575
- rotateLabels : rotateLabels ,
576
- bgColor : bgColor ,
577
- container : fullLayout . _hoverlayer ,
578
- outerContainer : fullLayout . _paperdiv
579
- } ;
580
- var hoverLabels = createHoverText ( hoverData , labelOpts ) ;
581
-
582
- hoverAvoidOverlaps ( hoverData , rotateLabels ? 'xa' : 'ya' ) ;
583
-
584
- alignHoverText ( hoverLabels , rotateLabels ) ;
585
-
586
564
// lastly, emit custom hover/unhover events
587
565
var oldhoverdata = gd . _hoverdata ,
588
566
newhoverdata = [ ] ;
@@ -614,6 +592,38 @@ function hover(gd, evt, subplot) {
614
592
615
593
gd . _hoverdata = newhoverdata ;
616
594
595
+ if ( gd . _context . showDroplines && hoverChanged ( gd , evt , oldhoverdata ) ) {
596
+ var droplineOpts = {
597
+ hovermode : hovermode ,
598
+ container : fullLayout . _hoverlayer ,
599
+ outerContainer : fullLayout . _paperdiv
600
+ } ;
601
+ createDroplines ( hoverData , droplineOpts ) ;
602
+ }
603
+
604
+ // if there's more than one horz bar trace,
605
+ // rotate the labels so they don't overlap
606
+ var rotateLabels = hovermode === 'y' && searchData . length > 1 ;
607
+
608
+ var bgColor = Color . combine (
609
+ fullLayout . plot_bgcolor || Color . background ,
610
+ fullLayout . paper_bgcolor
611
+ ) ;
612
+
613
+ var labelOpts = {
614
+ hovermode : hovermode ,
615
+ rotateLabels : rotateLabels ,
616
+ bgColor : bgColor ,
617
+ container : fullLayout . _hoverlayer ,
618
+ outerContainer : fullLayout . _paperdiv
619
+ } ;
620
+
621
+ var hoverLabels = createHoverText ( hoverData , labelOpts ) ;
622
+
623
+ hoverAvoidOverlaps ( hoverData , rotateLabels ? 'xa' : 'ya' ) ;
624
+
625
+ alignHoverText ( hoverLabels , rotateLabels ) ;
626
+
617
627
// TODO: tagName hack is needed to appease geo.js's hack of using evt.target=true
618
628
// we should improve the "fx" API so other plots can use it without these hack.
619
629
if ( evt . target && evt . target . tagName ) {
@@ -818,8 +828,41 @@ fx.loneUnhover = function(containerOrSelection) {
818
828
d3 . select ( containerOrSelection ) ;
819
829
820
830
selection . selectAll ( 'g.hovertext' ) . remove ( ) ;
831
+ selection . selectAll ( 'line.dropline' ) . remove ( ) ;
821
832
} ;
822
833
834
+ function createDroplines ( hoverData , opts ) {
835
+ var hovermode = opts . hovermode ,
836
+ container = opts . container ;
837
+
838
+ if ( hovermode !== 'closest' ) return ;
839
+ var c0 = hoverData [ 0 ] ;
840
+ var x = ( c0 . x0 + c0 . x1 ) / 2 ;
841
+ var y = ( c0 . y0 + c0 . y1 ) / 2 ;
842
+ var xOffset = c0 . xa . _offset ;
843
+ var yOffset = c0 . ya . _offset ;
844
+ container . selectAll ( 'line.dropline' ) . remove ( ) ;
845
+ container . append ( 'line' )
846
+ . attr ( 'x1' , xOffset + ( c0 . ya . side === 'right' ? c0 . xa . _length : 0 ) )
847
+ . attr ( 'x2' , xOffset + x )
848
+ . attr ( 'y1' , yOffset + y )
849
+ . attr ( 'y2' , yOffset + y )
850
+ . attr ( 'stroke-width' , 3 )
851
+ . attr ( 'stroke' , c0 . color )
852
+ . attr ( 'stroke-dasharray' , '5,5' )
853
+ . attr ( 'class' , 'dropline' ) ;
854
+
855
+ container . append ( 'line' )
856
+ . attr ( 'x1' , xOffset + x )
857
+ . attr ( 'x2' , xOffset + x )
858
+ . attr ( 'y1' , yOffset + y )
859
+ . attr ( 'y2' , yOffset + c0 . ya . _length )
860
+ . attr ( 'stroke-width' , 3 )
861
+ . attr ( 'stroke' , c0 . color )
862
+ . attr ( 'stroke-dasharray' , '5,5' )
863
+ . attr ( 'class' , 'dropline' ) ;
864
+ }
865
+
823
866
function createHoverText ( hoverData , opts ) {
824
867
var hovermode = opts . hovermode ,
825
868
rotateLabels = opts . rotateLabels ,
0 commit comments