Skip to content

Commit 0c497bb

Browse files
committed
add a few things to legend/constants.js
- set scrollBar enter attrs in constants file - rename textOffsetX -> textGap, add itemGap constants ... and use `bw` for borderwidth and `h` for d[0].height making formula cleaner in computeLegendDimensions
1 parent 82b9769 commit 0c497bb

File tree

2 files changed

+52
-76
lines changed

2 files changed

+52
-76
lines changed

src/components/legend/constants.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,10 @@ module.exports = {
1313
scrollBarMinHeight: 20,
1414
scrollBarColor: '#808BA4',
1515
scrollBarMargin: 4,
16-
textOffsetX: 40
16+
scrollBarEnterAttrs: {rx: 20, ry: 3, width: 0, height: 0},
17+
18+
// number of px between legend symbol and legend text (always in x direction)
19+
textGap: 40,
20+
// number of px between each legend item (x and/or y direction)
21+
itemGap: 5
1722
};

src/components/legend/draw.js

+46-75
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,8 @@ module.exports = function draw(gd) {
6666
var scrollBox = Lib.ensureSingle(legend, 'g', 'scrollbox');
6767

6868
var scrollBar = Lib.ensureSingle(legend, 'rect', 'scrollbar', function(s) {
69-
s.attr({
70-
rx: 20,
71-
ry: 3,
72-
width: 0,
73-
height: 0
74-
})
75-
.call(Color.fill, '#808BA4');
69+
s.attr(constants.scrollBarEnterAttrs)
70+
.call(Color.fill, constants.scrollBarColor);
7671
});
7772

7873
var groups = scrollBox.selectAll('g.groups').data(legendData);
@@ -378,7 +373,7 @@ function drawTexts(g, gd) {
378373
.call(Drawing.font, fullLayout.legend.font)
379374
.text(isEditable ? ensureLength(name, maxNameLength) : name);
380375

381-
svgTextUtils.positionText(textEl, constants.textOffsetX, 0);
376+
svgTextUtils.positionText(textEl, constants.textGap, 0);
382377

383378
function textLayout(s) {
384379
svgTextUtils.convertToTspans(s, gd, function() {
@@ -497,7 +492,7 @@ function computeTextDimensions(g, gd) {
497492
// approximation to height offset to center the font
498493
// to avoid getBoundingClientRect
499494
var textY = lineHeight * (0.3 + (1 - textLines) / 2);
500-
svgTextUtils.positionText(text, constants.textOffsetX, textY);
495+
svgTextUtils.positionText(text, constants.textGap, textY);
501496
}
502497

503498
legendItem.lineHeight = lineHeight;
@@ -508,13 +503,15 @@ function computeTextDimensions(g, gd) {
508503
function computeLegendDimensions(gd, groups, traces) {
509504
var fullLayout = gd._fullLayout;
510505
var opts = fullLayout.legend;
511-
var borderwidth = opts.borderwidth;
512506
var isGrouped = helpers.isGrouped(opts);
513507

514-
var extraWidth = 0;
515-
516-
var traceGap = 5;
508+
var bw = opts.borderwidth;
509+
var bw2 = 2 * bw;
510+
var textGap = constants.textGap;
511+
var itemGap = constants.itemGap;
512+
var endPad = 2 * (bw + itemGap);
517513

514+
var extraWidth = 0;
518515
opts._width = 0;
519516
opts._height = 0;
520517

@@ -526,63 +523,48 @@ function computeLegendDimensions(gd, groups, traces) {
526523
}
527524

528525
traces.each(function(d) {
529-
var legendItem = d[0];
530-
var textHeight = legendItem.height;
531-
var textWidth = legendItem.width;
532-
533-
Drawing.setTranslate(this,
534-
borderwidth,
535-
(5 + borderwidth + opts._height + textHeight / 2));
536-
537-
opts._height += textHeight;
538-
opts._width = Math.max(opts._width, textWidth);
526+
var h = d[0].height;
527+
Drawing.setTranslate(this, bw, itemGap + bw + opts._height + h / 2);
528+
opts._height += h;
529+
opts._width = Math.max(opts._width, d[0].width);
539530
});
540531

541-
opts._width += 45 + borderwidth * 2;
542-
opts._height += 10 + borderwidth * 2;
532+
opts._width += itemGap + textGap + bw2;
533+
opts._height += endPad;
543534

544535
if(isGrouped) {
545536
opts._height += (opts._lgroupsLength - 1) * opts.tracegroupgap;
546537
}
547538

548-
extraWidth = 40;
539+
extraWidth = textGap;
549540
} else if(isGrouped) {
550541
var maxHeight = 0;
551542
var maxWidth = 0;
552-
var groupData = groups.data();
553-
554543
var maxItems = 0;
555-
544+
var groupData = groups.data();
556545
var i;
546+
557547
for(i = 0; i < groupData.length; i++) {
558548
var group = groupData[i];
559-
var groupWidths = group.map(function(legendItemArray) {
560-
return legendItemArray[0].width;
561-
});
562-
563-
var groupWidth = Lib.aggNums(Math.max, null, groupWidths);
564-
var groupHeight = group.reduce(function(a, b) {
565-
return a + b[0].height;
566-
}, 0);
567-
568-
maxWidth = Math.max(maxWidth, groupWidth);
549+
var groupWidths = group.map(function(d) { return d[0].width; });
550+
var groupHeight = group.reduce(function(a, b) { return a + b[0].height; }, 0);
551+
maxWidth = Math.max(maxWidth, Lib.aggNums(Math.max, null, groupWidths));
569552
maxHeight = Math.max(maxHeight, groupHeight);
570553
maxItems = Math.max(maxItems, group.length);
571554
}
572555

573-
maxWidth += traceGap;
574-
maxWidth += 40;
556+
maxWidth += itemGap + textGap;
575557

576558
var groupXOffsets = [opts._width];
577559
var groupYOffsets = [];
578560
var rowNum = 0;
579561
for(i = 0; i < groupData.length; i++) {
580-
if(fullLayout._size.w < (borderwidth + opts._width + traceGap + maxWidth)) {
562+
if(fullLayout._size.w < (bw + opts._width + itemGap + maxWidth)) {
581563
groupXOffsets[groupXOffsets.length - 1] = groupXOffsets[0];
582564
opts._width = maxWidth;
583565
rowNum++;
584566
} else {
585-
opts._width += maxWidth + borderwidth;
567+
opts._width += maxWidth + bw;
586568
}
587569

588570
var rowYOffset = (rowNum * maxHeight);
@@ -602,23 +584,17 @@ function computeLegendDimensions(gd, groups, traces) {
602584
var groupHeight = 0;
603585

604586
groupTraces.each(function(d) {
605-
var legendItem = d[0];
606-
var textHeight = legendItem.height;
607-
608-
Drawing.setTranslate(this,
609-
0,
610-
(5 + borderwidth + groupHeight + textHeight / 2));
611-
612-
groupHeight += textHeight;
587+
var h = d[0].height;
588+
Drawing.setTranslate(this, 0, itemGap + bw + groupHeight + h / 2);
589+
groupHeight += h;
613590
});
614591
});
615592

616593
var maxYLegend = groupYOffsets[groupYOffsets.length - 1] + maxHeight;
617-
opts._height = 10 + (borderwidth * 2) + maxYLegend;
594+
opts._height = maxYLegend + endPad;
618595

619596
var maxOffset = Math.max.apply(null, groupXOffsets);
620-
opts._width = maxOffset + maxWidth + 40;
621-
opts._width += borderwidth * 2;
597+
opts._width = maxOffset + maxWidth + textGap + bw2;
622598
} else {
623599
var rowHeight = 0;
624600
var maxTraceHeight = 0;
@@ -628,34 +604,31 @@ function computeLegendDimensions(gd, groups, traces) {
628604

629605
// calculate largest width for traces and use for width of all legend items
630606
traces.each(function(d) {
631-
maxTraceWidth = Math.max(40 + d[0].width, maxTraceWidth);
632-
fullTracesWidth += 40 + d[0].width + traceGap;
607+
maxTraceWidth = Math.max(maxTraceWidth, textGap + d[0].width);
608+
fullTracesWidth += textGap + d[0].width + itemGap;
633609
});
634610

635611
// check if legend fits in one row
636-
var oneRowLegend = fullLayout._size.w > borderwidth + fullTracesWidth - traceGap;
612+
var oneRowLegend = fullLayout._size.w > bw + fullTracesWidth - itemGap;
637613

638614
traces.each(function(d) {
639-
var legendItem = d[0];
640-
var traceWidth = oneRowLegend ? 40 + d[0].width : maxTraceWidth;
615+
var h = d[0].height;
616+
var traceWidth = oneRowLegend ? textGap + d[0].width : maxTraceWidth;
641617

642-
if((borderwidth + offsetX + traceGap + traceWidth) > fullLayout._size.w) {
618+
if((bw + offsetX + itemGap + traceWidth) > fullLayout._size.w) {
643619
offsetX = 0;
644620
rowHeight += maxTraceHeight;
645621
opts._height += maxTraceHeight;
646622
// reset for next row
647623
maxTraceHeight = 0;
648624
}
649625

650-
Drawing.setTranslate(this,
651-
(borderwidth + offsetX),
652-
(5 + borderwidth + legendItem.height / 2) + rowHeight);
653-
654-
opts._width += traceGap + traceWidth;
626+
Drawing.setTranslate(this, bw + offsetX, itemGap + bw + h / 2 + rowHeight);
627+
opts._width += itemGap + traceWidth;
655628

656629
// keep track of tallest trace in group
657-
offsetX += traceGap + traceWidth;
658-
maxTraceHeight = Math.max(legendItem.height, maxTraceHeight);
630+
offsetX += itemGap + traceWidth;
631+
maxTraceHeight = Math.max(maxTraceHeight, h);
659632
});
660633

661634
if(oneRowLegend) {
@@ -664,8 +637,8 @@ function computeLegendDimensions(gd, groups, traces) {
664637
opts._height += maxTraceHeight;
665638
}
666639

667-
opts._width += borderwidth * 2;
668-
opts._height += 10 + borderwidth * 2;
640+
opts._width += bw2;
641+
opts._height += endPad;
669642
}
670643

671644
// make sure we're only getting full pixels
@@ -678,14 +651,12 @@ function computeLegendDimensions(gd, groups, traces) {
678651
);
679652

680653
traces.each(function(d) {
681-
var legendItem = d[0];
682-
var bg = d3.select(this).select('.legendtoggle');
683-
684-
Drawing.setRect(bg,
654+
var h = d[0].height;
655+
Drawing.setRect(d3.select(this).select('.legendtoggle'),
685656
0,
686-
-legendItem.height / 2,
657+
-h / 2,
687658
(isEditable ? 0 : opts._width) + extraWidth,
688-
legendItem.height
659+
h
689660
);
690661
});
691662
}

0 commit comments

Comments
 (0)