Skip to content

Commit 40ba2ea

Browse files
committed
make horiz. grouped / non-grouped logic more similar
1 parent 99d6a94 commit 40ba2ea

File tree

1 file changed

+72
-86
lines changed

1 file changed

+72
-86
lines changed

src/components/legend/draw.js

+72-86
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,8 @@ function computeLegendDimensions(gd, groups, traces) {
495495
var itemGap = constants.itemGap;
496496
var endPad = 2 * (bw + itemGap);
497497

498+
opts._maxWidth = fullLayout._size.w;
499+
498500
var extraWidth = 0;
499501
opts._width = 0;
500502
opts._height = 0;
@@ -521,108 +523,92 @@ function computeLegendDimensions(gd, groups, traces) {
521523
}
522524

523525
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+
});
539534

540-
maxWidth += itemGap + textGap;
535+
if(isGrouped) {
536+
var groupData = groups.data();
537+
var i;
541538

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);
552543
}
553544

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+
}
556556

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+
}
560560

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+
});
564564

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;
569569

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+
});
574575
});
575-
});
576576

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;
579581

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+
}
588597

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);
594599

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+
});
597603

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;
608610
}
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;
622611
}
623-
624-
opts._width += bw2;
625-
opts._height += endPad;
626612
}
627613

628614
opts._width = Math.ceil(opts._width);

0 commit comments

Comments
 (0)