@@ -540,64 +540,55 @@ function computeLegendDimensions(gd, groups, traces) {
540
540
combinedItemWidth += w ;
541
541
} ) ;
542
542
543
+ toggleRectWidth = null ;
544
+ var maxRowWidth = 0 ;
545
+
543
546
if ( isGrouped ) {
544
- var groupData = groups . data ( ) ;
545
- var i ;
547
+ var maxGroupHeightInRow = 0 ;
548
+ var groupOffsetX = 0 ;
549
+ var groupOffsetY = 0 ;
550
+ groups . each ( function ( ) {
551
+ var maxWidthInGroup = 0 ;
552
+ var offsetY = 0 ;
553
+ d3 . select ( this ) . selectAll ( 'g.traces' ) . each ( function ( d ) {
554
+ var h = d [ 0 ] . height ;
555
+ Drawing . setTranslate ( this , 0 , itemGap + bw + h / 2 + offsetY ) ;
556
+ offsetY += h ;
557
+ maxWidthInGroup = Math . max ( maxWidthInGroup , textGap + d [ 0 ] . width ) ;
558
+ } ) ;
559
+ maxGroupHeightInRow = Math . max ( maxGroupHeightInRow , offsetY ) ;
546
560
547
- var maxGroupHeight = 0 ;
548
- for ( i = 0 ; i < groupData . length ; i ++ ) {
549
- var groupHeight = groupData [ i ] . reduce ( function ( a , b ) { return a + b [ 0 ] . height ; } , 0 ) ;
550
- maxGroupHeight = Math . max ( maxGroupHeight , groupHeight ) ;
551
- }
561
+ var next = maxWidthInGroup + itemGap ;
552
562
553
- var groupXOffsets = [ opts . _width ] ;
554
- var groupYOffsets = [ ] ;
555
- var rowNum = 0 ;
556
- for ( i = 0 ; i < groupData . length ; i ++ ) {
557
- if ( ( opts . _width + itemGap + maxItemWidth + bw ) > opts . _maxWidth ) {
558
- groupXOffsets [ groupXOffsets . length - 1 ] = groupXOffsets [ 0 ] ;
559
- opts . _width = maxItemWidth + itemGap ;
560
- rowNum ++ ;
561
- } else {
562
- opts . _width += maxItemWidth + itemGap ;
563
+ if ( ( next + bw + groupOffsetX ) > opts . _maxWidth ) {
564
+ maxRowWidth = Math . max ( maxRowWidth , groupOffsetX ) ;
565
+ groupOffsetX = 0 ;
566
+ groupOffsetY += maxGroupHeightInRow + opts . tracegroupgap ;
567
+ maxGroupHeightInRow = offsetY ;
563
568
}
564
569
565
- groupXOffsets . push ( opts . _width ) ;
566
- groupYOffsets . push ( rowNum * maxGroupHeight + ( rowNum > 0 ? opts . tracegroupgap : 0 ) ) ;
567
- }
568
-
569
- groups . each ( function ( d , i ) {
570
- Drawing . setTranslate ( this , groupXOffsets [ i ] , groupYOffsets [ i ] ) ;
571
- } ) ;
570
+ Drawing . setTranslate ( this , groupOffsetX , groupOffsetY ) ;
572
571
573
- groups . each ( function ( ) {
574
- var group = d3 . select ( this ) ;
575
- var groupTraces = group . selectAll ( 'g.traces' ) ;
576
- var groupHeight = 0 ;
577
-
578
- groupTraces . each ( function ( d ) {
579
- var h = d [ 0 ] . height ;
580
- Drawing . setTranslate ( this , 0 , itemGap + bw + groupHeight + h / 2 ) ;
581
- groupHeight += h ;
582
- } ) ;
572
+ groupOffsetX += next ;
583
573
} ) ;
584
574
585
- opts . _height = groupYOffsets [ groupYOffsets . length - 1 ] + maxGroupHeight + endPad ;
586
- opts . _width = Math . max . apply ( null , groupXOffsets ) + maxItemWidth + textGap + bw2 ;
587
- toggleRectWidth = maxItemWidth ;
575
+ opts . _width = Math . max ( maxRowWidth , groupOffsetX ) + bw ;
576
+ opts . _height = groupOffsetY + maxGroupHeightInRow + endPad ;
588
577
} else {
589
- var oneRowLegend = ( combinedItemWidth + bw2 + ( traces . size ( ) - 1 ) * itemGap ) < opts . _maxWidth ;
578
+ var nTraces = traces . size ( ) ;
579
+ var oneRowLegend = ( combinedItemWidth + bw2 + ( nTraces - 1 ) * itemGap ) < opts . _maxWidth ;
590
580
591
- var maxRowWidth = 0 ;
592
581
var maxItemHeightInRow = 0 ;
593
582
var offsetX = 0 ;
594
583
var offsetY = 0 ;
584
+ var rowWidth = 0 ;
595
585
traces . each ( function ( d ) {
596
586
var h = d [ 0 ] . height ;
597
- var next = ( oneRowLegend ? textGap + d [ 0 ] . width : maxItemWidth ) + itemGap ;
587
+ var w = textGap + d [ 0 ] . width ;
588
+ var next = ( oneRowLegend ? w : maxItemWidth ) + itemGap ;
598
589
599
590
if ( ( next + bw + offsetX ) > opts . _maxWidth ) {
600
- maxRowWidth = Math . max ( maxRowWidth , offsetX ) ;
591
+ maxRowWidth = Math . max ( maxRowWidth , rowWidth ) ;
601
592
offsetX = 0 ;
602
593
offsetY += maxItemHeightInRow ;
603
594
opts . _height += maxItemHeightInRow ;
@@ -606,18 +597,17 @@ function computeLegendDimensions(gd, groups, traces) {
606
597
607
598
Drawing . setTranslate ( this , bw + offsetX , itemGap + bw + h / 2 + offsetY ) ;
608
599
600
+ rowWidth = offsetX + w + itemGap ;
609
601
offsetX += next ;
610
602
maxItemHeightInRow = Math . max ( maxItemHeightInRow , h ) ;
611
603
} ) ;
612
604
613
605
if ( oneRowLegend ) {
614
606
opts . _width = offsetX + bw2 ;
615
607
opts . _height = maxItemHeightInRow + endPad ;
616
- toggleRectWidth = null ;
617
608
} else {
618
- opts . _width = Math . max ( maxRowWidth , offsetX ) + bw ;
609
+ opts . _width = Math . max ( maxRowWidth , rowWidth ) + bw2 ;
619
610
opts . _height += maxItemHeightInRow + endPad ;
620
- toggleRectWidth = maxItemWidth ;
621
611
}
622
612
}
623
613
}
0 commit comments