Skip to content

Commit 490ac6d

Browse files
committed
Add support for scriptable options
1 parent f1691fd commit 490ac6d

File tree

5 files changed

+163
-119
lines changed

5 files changed

+163
-119
lines changed

docs/configuration/legend.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,10 @@ Items passed to the legend `onClick` function are the ones returned from `labels
7272
strokeStyle: Color,
7373

7474
// Point style of the legend box (only used if usePointStyle is true)
75-
pointStyle: string
75+
pointStyle: string,
76+
77+
// Rotation of the point in degrees (only used if usePointStyle is true)
78+
rotation: number
7679
}
7780
```
7881

src/controllers/controller.doughnut.js

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,20 +45,14 @@ defaults._set('doughnut', {
4545
if (data.labels.length && data.datasets.length) {
4646
return data.labels.map(function(label, i) {
4747
var meta = chart.getDatasetMeta(0);
48-
var ds = data.datasets[0];
49-
var arc = meta.data[i];
50-
var custom = arc && arc.custom || {};
51-
var arcOpts = chart.options.elements.arc;
52-
var fill = resolve([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i);
53-
var stroke = resolve([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i);
54-
var bw = resolve([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i);
48+
var model = meta.controller._resolveElementOptions(meta.data[i] || {}, i);
5549

5650
return {
5751
text: label,
58-
fillStyle: fill,
59-
strokeStyle: stroke,
60-
lineWidth: bw,
61-
hidden: isNaN(ds.data[i]) || meta.data[i].hidden,
52+
fillStyle: model.backgroundColor,
53+
strokeStyle: model.borderColor,
54+
lineWidth: model.borderWidth,
55+
hidden: isNaN(data.datasets[0].data[i]) || meta.data[i].hidden,
6256

6357
// Extra data used for toggling the correct item
6458
index: i

src/controllers/controller.polarArea.js

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -59,20 +59,14 @@ defaults._set('polarArea', {
5959
if (data.labels.length && data.datasets.length) {
6060
return data.labels.map(function(label, i) {
6161
var meta = chart.getDatasetMeta(0);
62-
var ds = data.datasets[0];
63-
var arc = meta.data[i];
64-
var custom = arc.custom || {};
65-
var arcOpts = chart.options.elements.arc;
66-
var fill = resolve([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i);
67-
var stroke = resolve([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i);
68-
var bw = resolve([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i);
62+
var model = meta.controller._resolveElementOptions(meta.data[i] || {}, i);
6963

7064
return {
7165
text: label,
72-
fillStyle: fill,
73-
strokeStyle: stroke,
74-
lineWidth: bw,
75-
hidden: isNaN(ds.data[i]) || meta.data[i].hidden,
66+
fillStyle: model.backgroundColor,
67+
strokeStyle: model.borderColor,
68+
lineWidth: model.borderWidth,
69+
hidden: isNaN(data.datasets[0].data[i]) || meta.data[i].hidden,
7670

7771
// Extra data used for toggling the correct item
7872
index: i

src/plugins/plugin.legend.js

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ var layouts = require('../core/core.layouts');
77

88
var noop = helpers.noop;
99
var valueOrDefault = helpers.valueOrDefault;
10-
var valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;
1110

1211
defaults._set('global', {
1312
legend: {
@@ -49,34 +48,35 @@ defaults._set('global', {
4948
generateLabels: function(chart) {
5049
var data = chart.data;
5150
return helpers.isArray(data.datasets) ? data.datasets.map(function(dataset, i) {
52-
var type = chart.getDatasetMeta(i).type;
53-
var options = chart.options;
54-
var legendOpts = options.legend;
55-
51+
var meta = chart.getDatasetMeta(i);
52+
var controller = meta.controller;
53+
var legendOpts = chart.options.legend;
5654
var usePointStyle = legendOpts && legendOpts.labels && legendOpts.labels.usePointStyle;
57-
var backgroundColor = usePointStyle ? valueAtIndexOrDefault(dataset.pointBackgroundColor, 0, dataset.backgroundColor) : dataset.backgroundColor;
58-
var borderWidth = usePointStyle ? valueAtIndexOrDefault(dataset.pointBorderWidth, 0, dataset.borderWidth) : dataset.borderWidth;
59-
var borderColor = usePointStyle ? valueAtIndexOrDefault(dataset.pointBorderColor, 0, dataset.borderColor) : dataset.borderColor;
60-
61-
var useLineStyles = (type === 'line' || type === 'radar') && !usePointStyle;
62-
var borderCapStyle = useLineStyles ? dataset.borderCapStyle : 'butt';
63-
var borderDash = useLineStyles ? dataset.borderDash : [];
64-
var borderDashOffset = useLineStyles ? dataset.borderDashOffset : 0;
65-
var borderJoinStyle = useLineStyles ? dataset.borderJoinStyle : 'miter';
66-
67-
var elementOpts = options.elements[useLineStyles ? 'line' : type === 'bar' ? 'rectangle' : 'point'];
55+
var model;
56+
57+
if (controller._resolveLineOptions && !usePointStyle) {
58+
model = controller._resolveLineOptions(meta.dataset || {});
59+
if (model.fill === false || model.fill === null) {
60+
model.backgroundColor = 'rgba(0,0,0,0)';
61+
}
62+
} else if (controller._resolvePointOptions) {
63+
model = controller._resolvePointOptions(meta.data[0] || {}, 0);
64+
} else {
65+
model = controller._resolveElementOptions(meta.data[0] || {}, 0);
66+
}
6867

6968
return {
7069
text: dataset.label,
71-
fillStyle: valueAtIndexOrDefault(backgroundColor, 0, elementOpts.backgroundColor),
70+
fillStyle: model.backgroundColor,
7271
hidden: !chart.isDatasetVisible(i),
73-
lineCap: valueOrDefault(borderCapStyle, elementOpts.borderCapStyle),
74-
lineDash: valueOrDefault(borderDash, elementOpts.borderDash),
75-
lineDashOffset: valueOrDefault(borderDashOffset, elementOpts.borderDashOffset),
76-
lineJoin: valueOrDefault(borderJoinStyle, elementOpts.borderJoinStyle),
77-
lineWidth: valueAtIndexOrDefault(borderWidth, 0, elementOpts.borderWidth),
78-
strokeStyle: valueAtIndexOrDefault(borderColor, 0, elementOpts.borderColor),
79-
pointStyle: valueAtIndexOrDefault(dataset.pointStyle, 0, elementOpts.pointStyle),
72+
lineCap: model.borderCapStyle,
73+
lineDash: model.borderDash,
74+
lineDashOffset: model.borderDashOffset,
75+
lineJoin: model.borderJoinStyle,
76+
lineWidth: model.borderWidth,
77+
strokeStyle: model.borderColor,
78+
pointStyle: model.pointStyle,
79+
rotation: model.rotation,
8080

8181
// Below is extra data used for toggling the datasets
8282
datasetIndex: i
@@ -384,15 +384,15 @@ var Legend = Element.extend({
384384
ctx.setLineDash(valueOrDefault(legendItem.lineDash, lineDefault.borderDash));
385385
}
386386

387-
if (opts.labels && opts.labels.usePointStyle) {
387+
if (labelOpts && labelOpts.usePointStyle) {
388388
// Recalculate x and y for drawPoint() because its expecting
389389
// x and y to be center of figure (instead of top left)
390390
var radius = boxWidth * Math.SQRT2 / 2;
391391
var centerX = x + boxWidth / 2;
392392
var centerY = y + fontSize / 2;
393393

394394
// Draw pointStyle as legend symbol
395-
helpers.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY);
395+
helpers.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY, legendItem.rotation);
396396
} else {
397397
// Draw box as legend symbol
398398
ctx.fillRect(x, y, boxWidth, fontSize);

0 commit comments

Comments
 (0)