@@ -495,6 +495,8 @@ function computeLegendDimensions(gd, groups, traces) {
495
495
var itemGap = constants . itemGap ;
496
496
var endPad = 2 * ( bw + itemGap ) ;
497
497
498
+ opts . _maxWidth = fullLayout . _size . w ;
499
+
498
500
var extraWidth = 0 ;
499
501
opts . _width = 0 ;
500
502
opts . _height = 0 ;
@@ -521,108 +523,92 @@ function computeLegendDimensions(gd, groups, traces) {
521
523
}
522
524
523
525
extraWidth = textGap ;
524
- } else if ( isGrouped ) {
525
- var maxHeight = 0 ;
526
- var maxWidth = 0 ;
527
- var maxItems = 0 ;
528
- var groupData = groups . data ( ) ;
529
- var i ;
530
-
531
- for ( i = 0 ; i < groupData . length ; i ++ ) {
532
- var group = groupData [ i ] ;
533
- var groupWidths = group . map ( function ( d ) { return d [ 0 ] . width ; } ) ;
534
- var groupHeight = group . reduce ( function ( a , b ) { return a + b [ 0 ] . height ; } , 0 ) ;
535
- maxWidth = Math . max ( maxWidth , Lib . aggNums ( Math . max , null , groupWidths ) ) ;
536
- maxHeight = Math . max ( maxHeight , groupHeight ) ;
537
- maxItems = Math . max ( maxItems , group . length ) ;
538
- }
526
+ } else {
527
+ var maxItemWidth = 0 ;
528
+ var combinedItemWidth = 0 ;
529
+ traces . each ( function ( d ) {
530
+ var w = d [ 0 ] . width + textGap ;
531
+ maxItemWidth = Math . max ( maxItemWidth , w ) ;
532
+ combinedItemWidth += w ;
533
+ } ) ;
539
534
540
- maxWidth += itemGap + textGap ;
535
+ if ( isGrouped ) {
536
+ var groupData = groups . data ( ) ;
537
+ var i ;
541
538
542
- var groupXOffsets = [ opts . _width ] ;
543
- var groupYOffsets = [ ] ;
544
- var rowNum = 0 ;
545
- for ( i = 0 ; i < groupData . length ; i ++ ) {
546
- if ( fullLayout . _size . w < ( bw + opts . _width + itemGap + maxWidth ) ) {
547
- groupXOffsets [ groupXOffsets . length - 1 ] = groupXOffsets [ 0 ] ;
548
- opts . _width = maxWidth ;
549
- rowNum ++ ;
550
- } else {
551
- opts . _width += maxWidth + bw ;
539
+ var maxGroupHeight = 0 ;
540
+ for ( i = 0 ; i < groupData . length ; i ++ ) {
541
+ var groupHeight = groupData [ i ] . reduce ( function ( a , b ) { return a + b [ 0 ] . height ; } , 0 ) ;
542
+ maxGroupHeight = Math . max ( maxGroupHeight , groupHeight ) ;
552
543
}
553
544
554
- var rowYOffset = ( rowNum * maxHeight ) ;
555
- rowYOffset += rowNum > 0 ? opts . tracegroupgap : 0 ;
545
+ var groupXOffsets = [ opts . _width ] ;
546
+ var groupYOffsets = [ ] ;
547
+ var rowNum = 0 ;
548
+ for ( i = 0 ; i < groupData . length ; i ++ ) {
549
+ if ( ( opts . _width + itemGap + maxItemWidth + bw ) > opts . _maxWidth ) {
550
+ groupXOffsets [ groupXOffsets . length - 1 ] = groupXOffsets [ 0 ] ;
551
+ opts . _width = maxItemWidth + itemGap ;
552
+ rowNum ++ ;
553
+ } else {
554
+ opts . _width += maxItemWidth + itemGap ;
555
+ }
556
556
557
- groupYOffsets . push ( rowYOffset ) ;
558
- groupXOffsets . push ( opts . _width ) ;
559
- }
557
+ groupXOffsets . push ( opts . _width ) ;
558
+ groupYOffsets . push ( rowNum * maxGroupHeight + ( rowNum > 0 ? opts . tracegroupgap : 0 ) ) ;
559
+ }
560
560
561
- groups . each ( function ( d , i ) {
562
- Drawing . setTranslate ( this , groupXOffsets [ i ] , groupYOffsets [ i ] ) ;
563
- } ) ;
561
+ groups . each ( function ( d , i ) {
562
+ Drawing . setTranslate ( this , groupXOffsets [ i ] , groupYOffsets [ i ] ) ;
563
+ } ) ;
564
564
565
- groups . each ( function ( ) {
566
- var group = d3 . select ( this ) ;
567
- var groupTraces = group . selectAll ( 'g.traces' ) ;
568
- var groupHeight = 0 ;
565
+ groups . each ( function ( ) {
566
+ var group = d3 . select ( this ) ;
567
+ var groupTraces = group . selectAll ( 'g.traces' ) ;
568
+ var groupHeight = 0 ;
569
569
570
- groupTraces . each ( function ( d ) {
571
- var h = d [ 0 ] . height ;
572
- Drawing . setTranslate ( this , 0 , itemGap + bw + groupHeight + h / 2 ) ;
573
- groupHeight += h ;
570
+ groupTraces . each ( function ( d ) {
571
+ var h = d [ 0 ] . height ;
572
+ Drawing . setTranslate ( this , 0 , itemGap + bw + groupHeight + h / 2 ) ;
573
+ groupHeight += h ;
574
+ } ) ;
574
575
} ) ;
575
- } ) ;
576
576
577
- var maxYLegend = groupYOffsets [ groupYOffsets . length - 1 ] + maxHeight ;
578
- opts . _height = maxYLegend + endPad ;
577
+ opts . _height = groupYOffsets [ groupYOffsets . length - 1 ] + maxGroupHeight + endPad ;
578
+ opts . _width = Math . max . apply ( null , groupXOffsets ) + maxItemWidth + textGap + bw2 ;
579
+ } else {
580
+ var oneRowLegend = ( combinedItemWidth + bw2 + ( traces . size ( ) - 1 ) * itemGap ) < opts . _maxWidth ;
579
581
580
- var maxOffset = Math . max . apply ( null , groupXOffsets ) ;
581
- opts . _width = maxOffset + maxWidth + textGap + bw2 ;
582
- } else {
583
- var rowHeight = 0 ;
584
- var maxTraceHeight = 0 ;
585
- var maxTraceWidth = 0 ;
586
- var offsetX = 0 ;
587
- var fullTracesWidth = 0 ;
582
+ var maxRowWidth = 0 ;
583
+ var maxItemHeightInRow = 0 ;
584
+ var offsetX = 0 ;
585
+ var offsetY = 0 ;
586
+ traces . each ( function ( d ) {
587
+ var h = d [ 0 ] . height ;
588
+ var next = ( oneRowLegend ? textGap + d [ 0 ] . width : maxItemWidth ) + itemGap ;
589
+
590
+ if ( ( next + bw + offsetX ) > opts . _maxWidth ) {
591
+ maxRowWidth = Math . max ( maxRowWidth , offsetX ) ;
592
+ offsetX = 0 ;
593
+ offsetY += maxItemHeightInRow ;
594
+ opts . _height += maxItemHeightInRow ;
595
+ maxItemHeightInRow = 0 ;
596
+ }
588
597
589
- // calculate largest width for traces and use for width of all legend items
590
- traces . each ( function ( d ) {
591
- maxTraceWidth = Math . max ( maxTraceWidth , textGap + d [ 0 ] . width ) ;
592
- fullTracesWidth += textGap + d [ 0 ] . width + itemGap ;
593
- } ) ;
598
+ Drawing . setTranslate ( this , bw + offsetX , itemGap + bw + h / 2 + offsetY ) ;
594
599
595
- // check if legend fits in one row
596
- var oneRowLegend = fullLayout . _size . w > bw + fullTracesWidth - itemGap ;
600
+ offsetX += next ;
601
+ maxItemHeightInRow = Math . max ( maxItemHeightInRow , h ) ;
602
+ } ) ;
597
603
598
- traces . each ( function ( d ) {
599
- var h = d [ 0 ] . height ;
600
- var traceWidth = oneRowLegend ? textGap + d [ 0 ] . width : maxTraceWidth ;
601
-
602
- if ( ( bw + offsetX + itemGap + traceWidth ) > fullLayout . _size . w ) {
603
- offsetX = 0 ;
604
- rowHeight += maxTraceHeight ;
605
- opts . _height += maxTraceHeight ;
606
- // reset for next row
607
- maxTraceHeight = 0 ;
604
+ if ( oneRowLegend ) {
605
+ opts . _width = offsetX + bw2 ;
606
+ opts . _height = maxItemHeightInRow + endPad ;
607
+ } else {
608
+ opts . _width = Math . max ( maxRowWidth , offsetX ) + bw ;
609
+ opts . _height += maxItemHeightInRow + endPad ;
608
610
}
609
-
610
- Drawing . setTranslate ( this , bw + offsetX , itemGap + bw + h / 2 + rowHeight ) ;
611
- opts . _width += itemGap + traceWidth ;
612
-
613
- // keep track of tallest trace in group
614
- offsetX += itemGap + traceWidth ;
615
- maxTraceHeight = Math . max ( maxTraceHeight , h ) ;
616
- } ) ;
617
-
618
- if ( oneRowLegend ) {
619
- opts . _height = maxTraceHeight ;
620
- } else {
621
- opts . _height += maxTraceHeight ;
622
611
}
623
-
624
- opts . _width += bw2 ;
625
- opts . _height += endPad ;
626
612
}
627
613
628
614
opts . _width = Math . ceil ( opts . _width ) ;
0 commit comments