From 2a96d83c2c459a19cc5a366c3e90c488dad8fc8e Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Thu, 9 May 2019 16:54:05 +0300 Subject: [PATCH] Implement layers (z-index) for layout items (#6241) --- docs/axes/styling.md | 2 + src/core/core.controller.js | 34 +- src/core/core.layouts.js | 8 + src/core/core.scale.js | 302 ++++++++++++------ src/scales/scale.radialLinear.js | 186 ++++++----- .../scale.radialLinear/gridlines-no-z.json | 33 ++ .../scale.radialLinear/gridlines-no-z.png | Bin 0 -> 39115 bytes .../scale.radialLinear/gridlines-z.json | 34 ++ .../scale.radialLinear/gridlines-z.png | Bin 0 -> 52534 bytes test/specs/core.scale.tests.js | 133 ++++++++ 10 files changed, 544 insertions(+), 188 deletions(-) create mode 100644 test/fixtures/scale.radialLinear/gridlines-no-z.json create mode 100644 test/fixtures/scale.radialLinear/gridlines-no-z.png create mode 100644 test/fixtures/scale.radialLinear/gridlines-z.json create mode 100644 test/fixtures/scale.radialLinear/gridlines-z.png diff --git a/docs/axes/styling.md b/docs/axes/styling.md index 23b212348da..b058498b652 100644 --- a/docs/axes/styling.md +++ b/docs/axes/styling.md @@ -23,6 +23,7 @@ The grid line configuration is nested under the scale configuration in the `grid | `zeroLineBorderDash` | `number[]` | `[]` | Length and spacing of dashes of the grid line for the first index (index 0). See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash). | `zeroLineBorderDashOffset` | `number` | `0.0` | Offset for line dashes of the grid line for the first index (index 0). See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineDashOffset). | `offsetGridLines` | `boolean` | `false` | If true, grid lines will be shifted to be between labels. This is set to `true` for a category scale in a bar chart by default. +| `z` | `number` | `0` | z-index of gridline layer. Values <= 0 are drawn under datasets, > 0 on top. ## Tick Configuration The tick configuration is nested under the scale configuration in the `ticks` key. It defines options for the tick marks that are generated by the axis. @@ -40,6 +41,7 @@ The tick configuration is nested under the scale configuration in the `ticks` ke | `minor` | `object` | `{}` | Minor ticks configuration. Omitted options are inherited from options above. | `major` | `object` | `{}` | Major ticks configuration. Omitted options are inherited from options above. | `padding` | `number` | `0` | Sets the offset of the tick labels from the axis +| `z` | `number` | `0` | z-index of tick layer. Useful when ticks are drawn on chart area. Values <= 0 are drawn under datasets, > 0 on top. ## Minor Tick Configuration The minorTick configuration is nested under the ticks configuration in the `minor` key. It defines options for the minor tick marks that are generated by the axis. Omitted options are inherited from `ticks` configuration. diff --git a/src/core/core.controller.js b/src/core/core.controller.js index 8abe3978e1a..168d40b4940 100644 --- a/src/core/core.controller.js +++ b/src/core/core.controller.js @@ -169,6 +169,7 @@ helpers.extend(Chart.prototype, /** @lends Chart */ { me.aspectRatio = height ? width / height : null; me.options = config.options; me._bufferedRender = false; + me._layers = []; /** * Provided for backward compatibility, Chart and Chart.Controller have been merged, @@ -495,6 +496,12 @@ helpers.extend(Chart.prototype, /** @lends Chart */ { // Do this before render so that any plugins that need final scale updates can use it plugins.notify(me, 'afterUpdate'); + me._layers.sort(function(a, b) { + return a.z === b.z + ? a._idx - b._idx + : a.z - b.z; + }); + if (me._bufferedRender) { me._bufferedRequest = { duration: config.duration, @@ -520,6 +527,15 @@ helpers.extend(Chart.prototype, /** @lends Chart */ { layouts.update(this, this.width, this.height); + me._layers = []; + helpers.each(me.boxes, function(box) { + me._layers.push.apply(me._layers, box._layers()); + }, me); + + me._layers.forEach(function(item, index) { + item._idx = index; + }); + /** * Provided for backward compatibility, use `afterLayout` instead. * @method IPlugin#afterScaleUpdate @@ -626,6 +642,7 @@ helpers.extend(Chart.prototype, /** @lends Chart */ { draw: function(easingValue) { var me = this; + var i, layers; me.clear(); @@ -643,12 +660,21 @@ helpers.extend(Chart.prototype, /** @lends Chart */ { return; } - // Draw all the scales - helpers.each(me.boxes, function(box) { - box.draw(me.chartArea); - }, me); + // Because of plugin hooks (before/afterDatasetsDraw), datasets can't + // currently be part of layers. Instead, we draw + // layers <= 0 before(default, backward compat), and the rest after + layers = me._layers; + for (i = 0; i < layers.length && layers[i].z <= 0; ++i) { + layers[i].draw(me.chartArea); + } me.drawDatasets(easingValue); + + // Rest of layers + for (; i < layers.length; ++i) { + layers[i].draw(me.chartArea); + } + me._drawTooltip(easingValue); plugins.notify(me, 'afterDraw', [easingValue]); diff --git a/src/core/core.layouts.js b/src/core/core.layouts.js index fbaf96a952d..4a0969f62ba 100644 --- a/src/core/core.layouts.js +++ b/src/core/core.layouts.js @@ -103,6 +103,14 @@ module.exports = { item.fullWidth = item.fullWidth || false; item.position = item.position || 'top'; item.weight = item.weight || 0; + item._layers = item._layers || function() { + return [{ + z: 0, + draw: function() { + item.draw.apply(item, arguments); + } + }]; + }; chart.boxes.push(item); }, diff --git a/src/core/core.scale.js b/src/core/core.scale.js index a4cd62317cc..cf1fb281e88 100644 --- a/src/core/core.scale.js +++ b/src/core/core.scale.js @@ -189,7 +189,7 @@ function parseTickFontOptions(options) { return {minor: minor, major: major}; } -module.exports = Element.extend({ +var Scale = Element.extend({ /** * Get the padding needed for the scale * @method getPadding @@ -252,6 +252,7 @@ module.exports = Element.extend({ me._maxLabelLines = 0; me.longestLabelWidth = 0; me.longestTextCache = me.longestTextCache || {}; + me._itemsToDraw = null; // Dimensions me.beforeSetDimensions(); @@ -780,22 +781,14 @@ module.exports = Element.extend({ }, /** - * Actually draw the scale on the canvas - * @param {object} chartArea - the area of the chart to draw full grid lines on + * @private */ - draw: function(chartArea) { + _computeItemsToDraw: function(chartArea) { var me = this; - var options = me.options; - - if (!me._isVisible()) { - return; - } - var chart = me.chart; - var context = me.ctx; + var options = me.options; var optionTicks = options.ticks; var gridLines = options.gridLines; - var scaleLabel = options.scaleLabel; var position = options.position; var isRotated = me.labelRotation !== 0; @@ -809,12 +802,11 @@ module.exports = Element.extend({ var tl = getTickMarkLength(gridLines); - var scaleLabelFontColor = valueOrDefault(scaleLabel.fontColor, defaults.global.defaultFontColor); - var scaleLabelFont = helpers.options._parseFont(scaleLabel); - var scaleLabelPadding = helpers.options.toPadding(scaleLabel.padding); var labelRotationRadians = helpers.toRadians(me.labelRotation); - var itemsToDraw = []; + var items = []; + + var epsilon = 0.0000001; // 0.0000001 is margin in pixels for Accumulated error. var axisWidth = gridLines.drawBorder ? valueAtIndexOrDefault(gridLines.lineWidth, 0, 0) : 0; var alignPixel = helpers._alignPixel; @@ -838,8 +830,6 @@ module.exports = Element.extend({ tickEnd = me.left + tl; } - var epsilon = 0.0000001; // 0.0000001 is margin in pixels for Accumulated error. - helpers.each(ticks, function(tick, index) { // autoskipper skipped this tick (#4635) if (helpers.isNullOrUndef(tick.label)) { @@ -919,7 +909,7 @@ module.exports = Element.extend({ } } - itemsToDraw.push({ + items.push({ tx1: tx1, ty1: ty1, tx2: tx2, @@ -937,107 +927,74 @@ module.exports = Element.extend({ rotation: -1 * labelRotationRadians, label: label, major: tick.major, + font: tick.major ? tickFonts.major : tickFonts.minor, textOffset: textOffset, textAlign: textAlign }); }); - // Draw all of the tick labels, tick marks, and grid lines at the correct places - helpers.each(itemsToDraw, function(itemToDraw) { - var glWidth = itemToDraw.glWidth; - var glColor = itemToDraw.glColor; - - if (gridLines.display && glWidth && glColor) { - context.save(); - context.lineWidth = glWidth; - context.strokeStyle = glColor; - if (context.setLineDash) { - context.setLineDash(itemToDraw.glBorderDash); - context.lineDashOffset = itemToDraw.glBorderDashOffset; + items.ticksLength = ticks.length; + items.borderValue = borderValue; + + return items; + }, + + /** + * @private + */ + _drawGrid: function(chartArea) { + var me = this; + var ctx = me.ctx; + var chart = me.chart; + var gridLines = me.options.gridLines; + + if (!gridLines.display) { + return; + } + + var alignPixel = helpers._alignPixel; + var axisWidth = gridLines.drawBorder ? valueAtIndexOrDefault(gridLines.lineWidth, 0, 0) : 0; + var items = me._itemsToDraw || (me._itemsToDraw = me._computeItemsToDraw(chartArea)); + var glWidth, glColor; + + helpers.each(items, function(item) { + glWidth = item.glWidth; + glColor = item.glColor; + + if (glWidth && glColor) { + ctx.save(); + ctx.lineWidth = glWidth; + ctx.strokeStyle = glColor; + if (ctx.setLineDash) { + ctx.setLineDash(item.glBorderDash); + ctx.lineDashOffset = item.glBorderDashOffset; } - context.beginPath(); + ctx.beginPath(); if (gridLines.drawTicks) { - context.moveTo(itemToDraw.tx1, itemToDraw.ty1); - context.lineTo(itemToDraw.tx2, itemToDraw.ty2); + ctx.moveTo(item.tx1, item.ty1); + ctx.lineTo(item.tx2, item.ty2); } if (gridLines.drawOnChartArea) { - context.moveTo(itemToDraw.x1, itemToDraw.y1); - context.lineTo(itemToDraw.x2, itemToDraw.y2); + ctx.moveTo(item.x1, item.y1); + ctx.lineTo(item.x2, item.y2); } - context.stroke(); - context.restore(); - } - - if (optionTicks.display) { - var tickFont = itemToDraw.major ? tickFonts.major : tickFonts.minor; - - // Make sure we draw text in the correct color and font - context.save(); - context.translate(itemToDraw.labelX, itemToDraw.labelY); - context.rotate(itemToDraw.rotation); - context.font = tickFont.string; - context.fillStyle = tickFont.color; - context.textBaseline = 'middle'; - context.textAlign = itemToDraw.textAlign; - - var label = itemToDraw.label; - var y = itemToDraw.textOffset; - if (helpers.isArray(label)) { - for (var i = 0; i < label.length; ++i) { - // We just make sure the multiline element is a string here.. - context.fillText('' + label[i], 0, y); - y += tickFont.lineHeight; - } - } else { - context.fillText(label, 0, y); - } - context.restore(); + ctx.stroke(); + ctx.restore(); } }); - if (scaleLabel.display) { - // Draw the scale label - var scaleLabelX; - var scaleLabelY; - var rotation = 0; - var halfLineHeight = scaleLabelFont.lineHeight / 2; - - if (isHorizontal) { - scaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width - scaleLabelY = position === 'bottom' - ? me.bottom - halfLineHeight - scaleLabelPadding.bottom - : me.top + halfLineHeight + scaleLabelPadding.top; - } else { - var isLeft = position === 'left'; - scaleLabelX = isLeft - ? me.left + halfLineHeight + scaleLabelPadding.top - : me.right - halfLineHeight - scaleLabelPadding.top; - scaleLabelY = me.top + ((me.bottom - me.top) / 2); - rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI; - } - - context.save(); - context.translate(scaleLabelX, scaleLabelY); - context.rotate(rotation); - context.textAlign = 'center'; - context.textBaseline = 'middle'; - context.fillStyle = scaleLabelFontColor; // render in correct colour - context.font = scaleLabelFont.string; - context.fillText(scaleLabel.labelString, 0, 0); - context.restore(); - } - if (axisWidth) { // Draw the line at the edge of the axis var firstLineWidth = axisWidth; - var lastLineWidth = valueAtIndexOrDefault(gridLines.lineWidth, ticks.length - 1, 0); + var lastLineWidth = valueAtIndexOrDefault(gridLines.lineWidth, items.ticksLength - 1, 0); + var borderValue = items.borderValue; var x1, x2, y1, y2; - if (isHorizontal) { + if (me.isHorizontal()) { x1 = alignPixel(chart, me.left, firstLineWidth) - firstLineWidth / 2; x2 = alignPixel(chart, me.right, lastLineWidth) + lastLineWidth / 2; y1 = y2 = borderValue; @@ -1047,12 +1004,149 @@ module.exports = Element.extend({ x1 = x2 = borderValue; } - context.lineWidth = axisWidth; - context.strokeStyle = valueAtIndexOrDefault(gridLines.color, 0); - context.beginPath(); - context.moveTo(x1, y1); - context.lineTo(x2, y2); - context.stroke(); + ctx.lineWidth = axisWidth; + ctx.strokeStyle = valueAtIndexOrDefault(gridLines.color, 0); + ctx.beginPath(); + ctx.moveTo(x1, y1); + ctx.lineTo(x2, y2); + ctx.stroke(); + } + }, + + /** + * @private + */ + _drawLabels: function(chartArea) { + var me = this; + var ctx = me.ctx; + var optionTicks = me.options.ticks; + + if (!optionTicks.display) { + return; + } + + var items = me._itemsToDraw || (me._itemsToDraw = me._computeItemsToDraw(chartArea)); + var tickFont; + + helpers.each(items, function(item) { + tickFont = item.font; + + // Make sure we draw text in the correct color and font + ctx.save(); + ctx.translate(item.labelX, item.labelY); + ctx.rotate(item.rotation); + ctx.font = tickFont.string; + ctx.fillStyle = tickFont.color; + ctx.textBaseline = 'middle'; + ctx.textAlign = item.textAlign; + + var label = item.label; + var y = item.textOffset; + if (helpers.isArray(label)) { + for (var i = 0; i < label.length; ++i) { + // We just make sure the multiline element is a string here.. + ctx.fillText('' + label[i], 0, y); + y += tickFont.lineHeight; + } + } else { + ctx.fillText(label, 0, y); + } + ctx.restore(); + }); + }, + + /** + * @private + */ + _drawTitle: function() { + var me = this; + var ctx = me.ctx; + var options = me.options; + var scaleLabel = options.scaleLabel; + + if (!scaleLabel.display) { + return; } + + var scaleLabelFontColor = valueOrDefault(scaleLabel.fontColor, defaults.global.defaultFontColor); + var scaleLabelFont = helpers.options._parseFont(scaleLabel); + var scaleLabelPadding = helpers.options.toPadding(scaleLabel.padding); + var halfLineHeight = scaleLabelFont.lineHeight / 2; + var position = options.position; + var rotation = 0; + var scaleLabelX, scaleLabelY; + + if (me.isHorizontal()) { + scaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width + scaleLabelY = position === 'bottom' + ? me.bottom - halfLineHeight - scaleLabelPadding.bottom + : me.top + halfLineHeight + scaleLabelPadding.top; + } else { + var isLeft = position === 'left'; + scaleLabelX = isLeft + ? me.left + halfLineHeight + scaleLabelPadding.top + : me.right - halfLineHeight - scaleLabelPadding.top; + scaleLabelY = me.top + ((me.bottom - me.top) / 2); + rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI; + } + + ctx.save(); + ctx.translate(scaleLabelX, scaleLabelY); + ctx.rotate(rotation); + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + ctx.fillStyle = scaleLabelFontColor; // render in correct colour + ctx.font = scaleLabelFont.string; + ctx.fillText(scaleLabel.labelString, 0, 0); + ctx.restore(); + }, + + draw: function(chartArea) { + var me = this; + + if (!me._isVisible()) { + return; + } + + me._drawGrid(chartArea); + me._drawTitle(chartArea); + me._drawLabels(chartArea); + }, + + /** + * @private + */ + _layers: function() { + var me = this; + var opts = me.options; + var tz = opts.ticks && opts.ticks.z || 0; + var gz = opts.gridLines && opts.gridLines.z || 0; + + if (!me._isVisible() || tz === gz || me.draw !== me._draw) { + // backward compatibility: draw has been overridden by custom scale + return [{ + z: tz, + draw: function() { + me.draw.apply(me, arguments); + } + }]; + } + + return [{ + z: gz, + draw: function() { + me._drawGrid.apply(me, arguments); + me._drawTitle.apply(me, arguments); + } + }, { + z: tz, + draw: function() { + me._drawLabels.apply(me, arguments); + } + }]; } }); + +Scale.prototype._draw = Scale.prototype.draw; + +module.exports = Scale; diff --git a/src/scales/scale.radialLinear.js b/src/scales/scale.radialLinear.js index f75e594ad7f..47b1089d93d 100644 --- a/src/scales/scale.radialLinear.js +++ b/src/scales/scale.radialLinear.js @@ -224,53 +224,30 @@ function adjustPointPositionForLabelHeight(angle, textSize, position) { function drawPointLabels(scale) { var ctx = scale.ctx; var opts = scale.options; - var angleLineOpts = opts.angleLines; - var gridLineOpts = opts.gridLines; var pointLabelOpts = opts.pointLabels; - var lineWidth = valueOrDefault(angleLineOpts.lineWidth, gridLineOpts.lineWidth); - var lineColor = valueOrDefault(angleLineOpts.color, gridLineOpts.color); var tickBackdropHeight = getTickBackdropHeight(opts); - - ctx.save(); - ctx.lineWidth = lineWidth; - ctx.strokeStyle = lineColor; - if (ctx.setLineDash) { - ctx.setLineDash(resolve([angleLineOpts.borderDash, gridLineOpts.borderDash, []])); - ctx.lineDashOffset = resolve([angleLineOpts.borderDashOffset, gridLineOpts.borderDashOffset, 0.0]); - } - var outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max); - - // Point Label Font var plFont = helpers.options._parseFont(pointLabelOpts); + ctx.save(); + ctx.font = plFont.string; ctx.textBaseline = 'middle'; for (var i = getValueCount(scale) - 1; i >= 0; i--) { - if (angleLineOpts.display && lineWidth && lineColor) { - var outerPosition = scale.getPointPosition(i, outerDistance); - ctx.beginPath(); - ctx.moveTo(scale.xCenter, scale.yCenter); - ctx.lineTo(outerPosition.x, outerPosition.y); - ctx.stroke(); - } - - if (pointLabelOpts.display) { - // Extra pixels out for some label spacing - var extra = (i === 0 ? tickBackdropHeight / 2 : 0); - var pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + 5); + // Extra pixels out for some label spacing + var extra = (i === 0 ? tickBackdropHeight / 2 : 0); + var pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + 5); - // Keep this in loop since we may support array properties here - var pointLabelFontColor = valueAtIndexOrDefault(pointLabelOpts.fontColor, i, defaults.global.defaultFontColor); - ctx.fillStyle = pointLabelFontColor; + // Keep this in loop since we may support array properties here + var pointLabelFontColor = valueAtIndexOrDefault(pointLabelOpts.fontColor, i, defaults.global.defaultFontColor); + ctx.fillStyle = pointLabelFontColor; - var angleRadians = scale.getIndexAngle(i); - var angle = helpers.toDegrees(angleRadians); - ctx.textAlign = getTextAlignForAngle(angle); - adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition); - fillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.lineHeight); - } + var angleRadians = scale.getIndexAngle(i); + var angle = helpers.toDegrees(angleRadians); + ctx.textAlign = getTextAlignForAngle(angle); + adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition); + fillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.lineHeight); } ctx.restore(); } @@ -473,60 +450,109 @@ module.exports = LinearScaleBase.extend({ 0); }, - draw: function() { + /** + * @private + */ + _drawGrid: function() { var me = this; + var ctx = me.ctx; var opts = me.options; var gridLineOpts = opts.gridLines; - var tickOpts = opts.ticks; + var angleLineOpts = opts.angleLines; + var lineWidth = valueOrDefault(angleLineOpts.lineWidth, gridLineOpts.lineWidth); + var lineColor = valueOrDefault(angleLineOpts.color, gridLineOpts.color); + var i, offset, position; + + if (opts.pointLabels.display) { + drawPointLabels(me); + } - if (opts.display) { - var ctx = me.ctx; - var startAngle = this.getIndexAngle(0); - var tickFont = helpers.options._parseFont(tickOpts); + if (gridLineOpts.display) { + helpers.each(me.ticks, function(label, index) { + if (index !== 0) { + offset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]); + drawRadiusLine(me, gridLineOpts, offset, index); + } + }); + } - if (opts.angleLines.display || opts.pointLabels.display) { - drawPointLabels(me); + if (angleLineOpts.display && lineWidth && lineColor) { + ctx.save(); + ctx.lineWidth = lineWidth; + ctx.strokeStyle = lineColor; + if (ctx.setLineDash) { + ctx.setLineDash(resolve([angleLineOpts.borderDash, gridLineOpts.borderDash, []])); + ctx.lineDashOffset = resolve([angleLineOpts.borderDashOffset, gridLineOpts.borderDashOffset, 0.0]); } - helpers.each(me.ticks, function(label, index) { - // Don't draw a centre value (if it is minimum) - if (index > 0 || tickOpts.reverse) { - var yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]); + for (i = getValueCount(me) - 1; i >= 0; i--) { + offset = me.getDistanceFromCenterForValue(opts.ticks.reverse ? me.min : me.max); + position = me.getPointPosition(i, offset); + ctx.beginPath(); + ctx.moveTo(me.xCenter, me.yCenter); + ctx.lineTo(position.x, position.y); + ctx.stroke(); + } - // Draw circular lines around the scale - if (gridLineOpts.display && index !== 0) { - drawRadiusLine(me, gridLineOpts, yCenterOffset, index); - } + ctx.restore(); + } + }, - if (tickOpts.display) { - var tickFontColor = valueOrDefault(tickOpts.fontColor, defaults.global.defaultFontColor); - ctx.font = tickFont.string; - - ctx.save(); - ctx.translate(me.xCenter, me.yCenter); - ctx.rotate(startAngle); - - if (tickOpts.showLabelBackdrop) { - var labelWidth = ctx.measureText(label).width; - ctx.fillStyle = tickOpts.backdropColor; - ctx.fillRect( - -labelWidth / 2 - tickOpts.backdropPaddingX, - -yCenterOffset - tickFont.size / 2 - tickOpts.backdropPaddingY, - labelWidth + tickOpts.backdropPaddingX * 2, - tickFont.size + tickOpts.backdropPaddingY * 2 - ); - } - - ctx.textAlign = 'center'; - ctx.textBaseline = 'middle'; - ctx.fillStyle = tickFontColor; - ctx.fillText(label, 0, -yCenterOffset); - ctx.restore(); - } - } - }); + /** + * @private + */ + _drawLabels: function() { + var me = this; + var ctx = me.ctx; + var opts = me.options; + var tickOpts = opts.ticks; + + if (!tickOpts.display) { + return; } - } + + var startAngle = me.getIndexAngle(0); + var tickFont = helpers.options._parseFont(tickOpts); + var tickFontColor = valueOrDefault(tickOpts.fontColor, defaults.global.defaultFontColor); + var offset, width; + + ctx.save(); + ctx.font = tickFont.string; + ctx.translate(me.xCenter, me.yCenter); + ctx.rotate(startAngle); + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + + helpers.each(me.ticks, function(label, index) { + if (index === 0 && !tickOpts.reverse) { + return; + } + + offset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]); + + if (tickOpts.showLabelBackdrop) { + width = ctx.measureText(label).width; + ctx.fillStyle = tickOpts.backdropColor; + + ctx.fillRect( + -width / 2 - tickOpts.backdropPaddingX, + -offset - tickFont.size / 2 - tickOpts.backdropPaddingY, + width + tickOpts.backdropPaddingX * 2, + tickFont.size + tickOpts.backdropPaddingY * 2 + ); + } + + ctx.fillStyle = tickFontColor; + ctx.fillText(label, 0, -offset); + }); + + ctx.restore(); + }, + + /** + * @private + */ + _drawTitle: helpers.noop }); // INTERNAL: static default options, registered in src/index.js diff --git a/test/fixtures/scale.radialLinear/gridlines-no-z.json b/test/fixtures/scale.radialLinear/gridlines-no-z.json new file mode 100644 index 00000000000..362c519048d --- /dev/null +++ b/test/fixtures/scale.radialLinear/gridlines-no-z.json @@ -0,0 +1,33 @@ +{ + "config": { + "type": "radar", + "data": { + "labels": ["A", "B", "C", "D", "E"], + "datasets": [{ + "backgroundColor": "rgba(255, 0, 0, 1)", + "data": [1,2,3,3,3] + }] + }, + "options": { + "responsive": false, + "legend": false, + "title": false, + "scale": { + "gridLines": { + "color": "rgba(0, 0, 0, 1)", + "lineWidth": 1 + }, + "angleLines": { + "color": "rgba(0, 0, 255, 1)", + "lineWidth": 1 + }, + "pointLabels": { + "display": false + }, + "ticks": { + "display": false + } + } + } + } +} diff --git a/test/fixtures/scale.radialLinear/gridlines-no-z.png b/test/fixtures/scale.radialLinear/gridlines-no-z.png new file mode 100644 index 0000000000000000000000000000000000000000..c545c564d53b657c60a52f2ab9fe38a20f79cf2b GIT binary patch literal 39115 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 LB3&hE8uotxof8wt literal 0 HcmV?d00001 diff --git a/test/specs/core.scale.tests.js b/test/specs/core.scale.tests.js index 2f2c3b1dece..605707eb3c1 100644 --- a/test/specs/core.scale.tests.js +++ b/test/specs/core.scale.tests.js @@ -473,4 +473,137 @@ describe('Core.scale', function() { expect(scale.ticks.length).toBe(0); }); }); + + describe('_layers', function() { + it('should default to one layer', function() { + var chart = window.acquireChart({ + type: 'line', + options: { + scales: { + xAxes: [{ + id: 'x', + type: 'linear', + }] + } + } + }); + + var scale = chart.scales.x; + expect(scale._layers().length).toEqual(1); + }); + + it('should default to one layer for custom scales', function() { + var customScale = Chart.Scale.extend({ + draw: function() {}, + convertTicksToLabels: function() { + return ['tick']; + } + }); + Chart.scaleService.registerScaleType('customScale', customScale, {}); + + var chart = window.acquireChart({ + type: 'line', + options: { + scales: { + xAxes: [{ + id: 'x', + type: 'customScale', + gridLines: { + z: 10 + }, + ticks: { + z: 20 + } + }] + } + } + }); + + var scale = chart.scales.x; + expect(scale._layers().length).toEqual(1); + expect(scale._layers()[0].z).toEqual(20); + }); + + it('should default to one layer when z is equal between ticks and grid', function() { + var chart = window.acquireChart({ + type: 'line', + options: { + scales: { + xAxes: [{ + id: 'x', + type: 'linear', + ticks: { + z: 10 + }, + gridLines: { + z: 10 + } + }] + } + } + }); + + var scale = chart.scales.x; + expect(scale._layers().length).toEqual(1); + }); + + + it('should return 2 layers when z is not equal between ticks and grid', function() { + var chart = window.acquireChart({ + type: 'line', + options: { + scales: { + xAxes: [{ + id: 'x', + type: 'linear', + ticks: { + z: 10 + } + }] + } + } + }); + + expect(chart.scales.x._layers().length).toEqual(2); + + chart = window.acquireChart({ + type: 'line', + options: { + scales: { + xAxes: [{ + id: 'x', + type: 'linear', + gridLines: { + z: 11 + } + }] + } + } + }); + + expect(chart.scales.x._layers().length).toEqual(2); + + chart = window.acquireChart({ + type: 'line', + options: { + scales: { + xAxes: [{ + id: 'x', + type: 'linear', + ticks: { + z: 10 + }, + gridLines: { + z: 11 + } + }] + } + } + }); + + expect(chart.scales.x._layers().length).toEqual(2); + + }); + + }); });