Skip to content

Commit 083d061

Browse files
Allow set legend with in fractions
1 parent 6f0db3e commit 083d061

File tree

6 files changed

+47
-36
lines changed

6 files changed

+47
-36
lines changed

src/components/legend/attributes.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,18 @@ module.exports = {
7474
'Sets the amount of vertical space (in px) between legend groups.'
7575
].join(' ')
7676
},
77-
legendtextwidth: {
77+
entrywidth: {
7878
valType: 'number',
7979
min: 0,
8080
editType: 'legend',
81-
description: 'Sets the width (in px) of the legend.',
81+
description: 'Sets the width (in px or fraction) of the legend.',
82+
},
83+
widthmode: {
84+
valType: 'enumerated',
85+
values: ['fraction', 'pixels'],
86+
dflt: 'pixels',
87+
editType: 'legend',
88+
description: 'Determines what entrywidth means.',
8289
},
8390
itemsizing: {
8491
valType: 'enumerated',

src/components/legend/defaults.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,8 @@ module.exports = function legendDefaults(layoutIn, layoutOut, fullData) {
122122
coerce('traceorder', defaultOrder);
123123
if(helpers.isGrouped(layoutOut.legend)) coerce('tracegroupgap');
124124

125-
coerce('legendtextwidth');
125+
coerce('entrywidth');
126+
coerce('widthmode');
126127
coerce('itemsizing');
127128
coerce('itemwidth');
128129

src/components/legend/draw.js

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -351,17 +351,19 @@ function _draw(gd, legendObj) {
351351
}], gd);
352352
}
353353

354-
function getTraceWidth(trace, legendObj, textGap, isGrouped) {
354+
function getTraceWidth(trace, legendObj, textGap) {
355355
var legendItem = trace[0];
356356
var legendWidth = legendItem.width;
357357

358-
if(legendItem.trace.legendtextwidth !== undefined) {
359-
legendWidth = legendItem.trace.legendtextwidth;
360-
} else if(isGrouped && legendItem.trace.legendgroup !== '') {
361-
legendWidth = legendItem.width;
362-
} else if(legendObj.legendtextwidth !== undefined) {
363-
legendWidth = legendObj.legendtextwidth;
364-
}
358+
var traceLegendWidth = legendItem.trace.legendwidth || legendObj.entrywidth
359+
360+
if (traceLegendWidth) {
361+
if (legendObj.widthmode === "pixels") {
362+
return traceLegendWidth + textGap
363+
} else {
364+
return legendObj._maxWidth * traceLegendWidth
365+
}
366+
}
365367

366368
return legendWidth + textGap;
367369
}
@@ -704,7 +706,7 @@ function computeLegendDimensions(gd, groups, traces, legendObj) {
704706
var maxItemWidth = 0;
705707
var combinedItemWidth = 0;
706708
traces.each(function(d) {
707-
var w = getTraceWidth(d, legendObj, textGap, isGrouped);
709+
var w = getTraceWidth(d, legendObj, textGap);
708710
maxItemWidth = Math.max(maxItemWidth, w);
709711
combinedItemWidth += w;
710712
});
@@ -720,7 +722,7 @@ function computeLegendDimensions(gd, groups, traces, legendObj) {
720722
var maxWidthInGroup = 0;
721723
var offsetY = 0;
722724
d3.select(this).selectAll('g.traces').each(function(d) {
723-
var w = getTraceWidth(d, legendObj, textGap, isGrouped);
725+
var w = getTraceWidth(d, legendObj, textGap);
724726
var h = d[0].height;
725727

726728
Drawing.setTranslate(this,
@@ -768,7 +770,11 @@ function computeLegendDimensions(gd, groups, traces, legendObj) {
768770
traces.each(function(d) {
769771
var h = d[0].height;
770772
var w = getTraceWidth(d, legendObj, textGap, isGrouped);
771-
var next = (oneRowLegend ? w : maxItemWidth) + itemGap;
773+
var next = (oneRowLegend ? w : maxItemWidth);
774+
775+
if (legendObj.widthmode !== 'fraction') {
776+
next += itemGap;
777+
}
772778

773779
if((next + bw + offsetX - itemGap) >= legendObj._maxWidth) {
774780
maxRowWidth = Math.max(maxRowWidth, rowWidth);
@@ -825,7 +831,9 @@ function computeLegendDimensions(gd, groups, traces, legendObj) {
825831
traceWidth = legendGroupWidths[legendgroup];
826832
}
827833
var w = isEditable ? textGap : (toggleRectWidth || traceWidth);
828-
if(!isVertical) w += itemGap / 2;
834+
if(!isVertical && legendObj.widthmode !== "fraction") {
835+
w += itemGap / 2;
836+
}
829837
Drawing.setRect(traceToggle, 0, -h / 2, w, h);
830838
});
831839
}

src/plots/attributes.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,11 @@ module.exports = {
7272
'and ranks greater than 1000 to go after all unranked items.'
7373
].join(' ')
7474
},
75-
legendtextwidth: {
75+
legendwidth: {
7676
valType: 'number',
7777
min: 0,
7878
editType: 'style',
79-
description: 'Sets the width (in px) of the legend for this trace.',
79+
description: 'Sets the width (in px or fraction) of the legend for this trace.',
8080
},
8181
opacity: {
8282
valType: 'number',

src/plots/plots.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1320,7 +1320,7 @@ plots.supplyTraceDefaults = function(traceIn, traceOut, colorIndex, layout, trac
13201320
'showlegend'
13211321
);
13221322

1323-
coerce('legendtextwidth');
1323+
coerce('legendwidth');
13241324
coerce('legendgroup');
13251325
coerce('legendgrouptitle.text');
13261326
coerce('legendrank');

test/jasmine/tests/legend_test.js

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2347,7 +2347,7 @@ describe('legend with custom doubleClickDelay', function() {
23472347
}, 3 * jasmine.DEFAULT_TIMEOUT_INTERVAL);
23482348
});
23492349

2350-
describe('legend with custom legendtextwidth', function() {
2350+
describe('legend with custom legendwidth', function() {
23512351
var gd;
23522352

23532353
var data = [
@@ -2379,10 +2379,10 @@ describe('legend with custom legendtextwidth', function() {
23792379
});
23802380
}
23812381

2382-
it('should change width when trace has legendtextwidth', function(done) {
2382+
it('should change width when trace has legendwidth', function(done) {
23832383
var extendedData = Lib.extendDeep([], data);
23842384
extendedData.forEach(function(trace, index) {
2385-
trace.legendtextwidth = (index + 1) * 50;
2385+
trace.legendwidth = (index + 1) * 50;
23862386
});
23872387

23882388
var textGap = 30 + constants.itemGap * 2 + constants.itemGap / 2;
@@ -2392,10 +2392,10 @@ describe('legend with custom legendtextwidth', function() {
23922392
}).then(done);
23932393
});
23942394

2395-
it('should change width when legend has legendtextwidth', function(done) {
2395+
it('should change width when legend has entrywidth', function(done) {
23962396
var extendedLayout = Lib.extendDeep([], layout);
23972397
var width = 50;
2398-
extendedLayout.legend.legendtextwidth = width;
2398+
extendedLayout.legend.entrywidth = width;
23992399

24002400
var textGap = 30 + constants.itemGap * 2 + constants.itemGap / 2;
24012401

@@ -2404,12 +2404,12 @@ describe('legend with custom legendtextwidth', function() {
24042404
}).then(done);
24052405
});
24062406

2407-
it('should change group width when trace has legendtextwidth', function(done) {
2407+
it('should change group width when trace has legendwidth', function(done) {
24082408
var extendedLayout = Lib.extendDeep([], layout);
24092409
extendedLayout.legend.traceorder = 'grouped';
24102410

24112411
var extendedData = Lib.extendDeep([], data);
2412-
extendedData[0].legendtextwidth = 100;
2412+
extendedData[0].legendwidth = 100;
24132413
extendedData[0].legendgroup = 'test';
24142414
extendedData[1].legendgroup = 'test';
24152415

@@ -2420,20 +2420,15 @@ describe('legend with custom legendtextwidth', function() {
24202420
}).then(done);
24212421
});
24222422

2423-
it('should prefer group legendtextwidth to the legend legendtextwidth', function(done) {
2424-
var extendedLayout = Lib.extendDeep([], layout);
2425-
extendedLayout.legend.traceorder = 'grouped';
2426-
extendedLayout.legend.legendtextwidth = 50;
24272423

2428-
var extendedData = Lib.extendDeep([], data);
2429-
extendedData[0].legendtextwidth = 100;
2430-
extendedData[0].legendgroup = 'test';
2431-
extendedData[1].legendgroup = 'test';
24322424

2433-
var textGap = 30 + constants.itemGap * 2 + constants.itemGap / 2;
2425+
it('should change width when legend has entrywidth and widthmode is fraction', function(done) {
2426+
var extendedLayout = Lib.extendDeep([], layout);
2427+
extendedLayout.legend.widthmode = 'fraction';
2428+
extendedLayout.legend.entrywidth = 0.3;
24342429

2435-
Plotly.newPlot(gd, {data: extendedData, layout: extendedLayout}).then(function() {
2436-
assertLegendTextWidth([100 + textGap, 100 + textGap, 50 + textGap]);
2430+
Plotly.newPlot(gd, {data: data, layout: extendedLayout}).then(function() {
2431+
assertLegendTextWidth([162, 162, 162]);
24372432
}).then(done);
24382433
});
24392434
});

0 commit comments

Comments
 (0)