@@ -538,64 +538,55 @@ function computeLegendDimensions(gd, groups, traces) {
538538 combinedItemWidth += w ;
539539 } ) ;
540540
541+ toggleRectWidth = null ;
542+ var maxRowWidth = 0 ;
543+
541544 if ( isGrouped ) {
542- var groupData = groups . data ( ) ;
543- var i ;
545+ var maxGroupHeightInRow = 0 ;
546+ var groupOffsetX = 0 ;
547+ var groupOffsetY = 0 ;
548+ groups . each ( function ( ) {
549+ var maxWidthInGroup = 0 ;
550+ var offsetY = 0 ;
551+ d3 . select ( this ) . selectAll ( 'g.traces' ) . each ( function ( d ) {
552+ var h = d [ 0 ] . height ;
553+ Drawing . setTranslate ( this , 0 , itemGap + bw + h / 2 + offsetY ) ;
554+ offsetY += h ;
555+ maxWidthInGroup = Math . max ( maxWidthInGroup , textGap + d [ 0 ] . width ) ;
556+ } ) ;
557+ maxGroupHeightInRow = Math . max ( maxGroupHeightInRow , offsetY ) ;
544558
545- var maxGroupHeight = 0 ;
546- for ( i = 0 ; i < groupData . length ; i ++ ) {
547- var groupHeight = groupData [ i ] . reduce ( function ( a , b ) { return a + b [ 0 ] . height ; } , 0 ) ;
548- maxGroupHeight = Math . max ( maxGroupHeight , groupHeight ) ;
549- }
559+ var next = maxWidthInGroup + itemGap ;
550560
551- var groupXOffsets = [ opts . _width ] ;
552- var groupYOffsets = [ ] ;
553- var rowNum = 0 ;
554- for ( i = 0 ; i < groupData . length ; i ++ ) {
555- if ( ( opts . _width + itemGap + maxItemWidth + bw ) > opts . _maxWidth ) {
556- groupXOffsets [ groupXOffsets . length - 1 ] = groupXOffsets [ 0 ] ;
557- opts . _width = maxItemWidth + itemGap ;
558- rowNum ++ ;
559- } else {
560- opts . _width += maxItemWidth + itemGap ;
561+ if ( ( next + bw + groupOffsetX ) > opts . _maxWidth ) {
562+ maxRowWidth = Math . max ( maxRowWidth , groupOffsetX ) ;
563+ groupOffsetX = 0 ;
564+ groupOffsetY += maxGroupHeightInRow + opts . tracegroupgap ;
565+ maxGroupHeightInRow = offsetY ;
561566 }
562567
563- groupXOffsets . push ( opts . _width ) ;
564- groupYOffsets . push ( rowNum * maxGroupHeight + ( rowNum > 0 ? opts . tracegroupgap : 0 ) ) ;
565- }
566-
567- groups . each ( function ( d , i ) {
568- Drawing . setTranslate ( this , groupXOffsets [ i ] , groupYOffsets [ i ] ) ;
569- } ) ;
568+ Drawing . setTranslate ( this , groupOffsetX , groupOffsetY ) ;
570569
571- groups . each ( function ( ) {
572- var group = d3 . select ( this ) ;
573- var groupTraces = group . selectAll ( 'g.traces' ) ;
574- var groupHeight = 0 ;
575-
576- groupTraces . each ( function ( d ) {
577- var h = d [ 0 ] . height ;
578- Drawing . setTranslate ( this , 0 , itemGap + bw + groupHeight + h / 2 ) ;
579- groupHeight += h ;
580- } ) ;
570+ groupOffsetX += next ;
581571 } ) ;
582572
583- opts . _height = groupYOffsets [ groupYOffsets . length - 1 ] + maxGroupHeight + endPad ;
584- opts . _width = Math . max . apply ( null , groupXOffsets ) + maxItemWidth + textGap + bw2 ;
585- toggleRectWidth = maxItemWidth ;
573+ opts . _width = Math . max ( maxRowWidth , groupOffsetX ) + bw ;
574+ opts . _height = groupOffsetY + maxGroupHeightInRow + endPad ;
586575 } else {
587- var oneRowLegend = ( combinedItemWidth + bw2 + ( traces . size ( ) - 1 ) * itemGap ) < opts . _maxWidth ;
576+ var nTraces = traces . size ( ) ;
577+ var oneRowLegend = ( combinedItemWidth + bw2 + ( nTraces - 1 ) * itemGap ) < opts . _maxWidth ;
588578
589- var maxRowWidth = 0 ;
590579 var maxItemHeightInRow = 0 ;
591580 var offsetX = 0 ;
592581 var offsetY = 0 ;
582+ var rowWidth = 0 ;
593583 traces . each ( function ( d ) {
594584 var h = d [ 0 ] . height ;
595- var next = ( oneRowLegend ? textGap + d [ 0 ] . width : maxItemWidth ) + itemGap ;
585+ var w = textGap + d [ 0 ] . width ;
586+ var next = ( oneRowLegend ? w : maxItemWidth ) + itemGap ;
596587
597588 if ( ( next + bw + offsetX ) > opts . _maxWidth ) {
598- maxRowWidth = Math . max ( maxRowWidth , offsetX ) ;
589+ maxRowWidth = Math . max ( maxRowWidth , rowWidth ) ;
599590 offsetX = 0 ;
600591 offsetY += maxItemHeightInRow ;
601592 opts . _height += maxItemHeightInRow ;
@@ -604,18 +595,17 @@ function computeLegendDimensions(gd, groups, traces) {
604595
605596 Drawing . setTranslate ( this , bw + offsetX , itemGap + bw + h / 2 + offsetY ) ;
606597
598+ rowWidth = offsetX + w + itemGap ;
607599 offsetX += next ;
608600 maxItemHeightInRow = Math . max ( maxItemHeightInRow , h ) ;
609601 } ) ;
610602
611603 if ( oneRowLegend ) {
612604 opts . _width = offsetX + bw2 ;
613605 opts . _height = maxItemHeightInRow + endPad ;
614- toggleRectWidth = null ;
615606 } else {
616- opts . _width = Math . max ( maxRowWidth , offsetX ) + bw ;
607+ opts . _width = Math . max ( maxRowWidth , rowWidth ) + bw2 ;
617608 opts . _height += maxItemHeightInRow + endPad ;
618- toggleRectWidth = maxItemWidth ;
619609 }
620610 }
621611 }
0 commit comments