From f7ebedc367c3e6dabd7b4a65a26706620d2df430 Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Tue, 9 Mar 2021 15:35:43 +0200 Subject: [PATCH] Scale: refactor drawTitle, add tests (#8598) * Scale: refactor drawTitle, add tests * CC, lint * update --- src/core/core.scale.js | 98 ++++++++---------- test/fixtures/core.scale/title-multi-line.js | 32 ------ test/fixtures/core.scale/title-multi-line.png | Bin 17753 -> 0 bytes test/fixtures/core.scale/title/align-end.js | 77 ++++++++++++++ test/fixtures/core.scale/title/align-end.png | Bin 0 -> 4939 bytes test/fixtures/core.scale/title/align-start.js | 77 ++++++++++++++ .../fixtures/core.scale/title/align-start.png | Bin 0 -> 4930 bytes test/fixtures/core.scale/title/default.js | 73 +++++++++++++ test/fixtures/core.scale/title/default.png | Bin 0 -> 4543 bytes .../core.scale/title/multi-line/align-end.js | 77 ++++++++++++++ .../core.scale/title/multi-line/align-end.png | Bin 0 -> 8758 bytes .../title/multi-line/align-start.js | 77 ++++++++++++++ .../title/multi-line/align-start.png | Bin 0 -> 8818 bytes .../core.scale/title/multi-line/default.js | 73 +++++++++++++ .../core.scale/title/multi-line/default.png | Bin 0 -> 8572 bytes 15 files changed, 500 insertions(+), 84 deletions(-) delete mode 100644 test/fixtures/core.scale/title-multi-line.js delete mode 100644 test/fixtures/core.scale/title-multi-line.png create mode 100644 test/fixtures/core.scale/title/align-end.js create mode 100644 test/fixtures/core.scale/title/align-end.png create mode 100644 test/fixtures/core.scale/title/align-start.js create mode 100644 test/fixtures/core.scale/title/align-start.png create mode 100644 test/fixtures/core.scale/title/default.js create mode 100644 test/fixtures/core.scale/title/default.png create mode 100644 test/fixtures/core.scale/title/multi-line/align-end.js create mode 100644 test/fixtures/core.scale/title/multi-line/align-end.png create mode 100644 test/fixtures/core.scale/title/multi-line/align-start.js create mode 100644 test/fixtures/core.scale/title/multi-line/align-start.png create mode 100644 test/fixtures/core.scale/title/multi-line/default.js create mode 100644 test/fixtures/core.scale/title/multi-line/default.png diff --git a/src/core/core.scale.js b/src/core/core.scale.js index ca7b278dd..684916e7f 100644 --- a/src/core/core.scale.js +++ b/src/core/core.scale.js @@ -2,10 +2,14 @@ import defaults from './core.defaults'; import Element from './core.element'; import {_alignPixel, _measureText, renderText, clipArea, unclipArea} from '../helpers/helpers.canvas'; import {callback as call, each, finiteOrDefault, isArray, isFinite, isNullOrUndef, isObject, valueOrDefault} from '../helpers/helpers.core'; -import {_factorize, toDegrees, toRadians, _int16Range, HALF_PI, _limitValue} from '../helpers/helpers.math'; +import {_factorize, toDegrees, toRadians, _int16Range, _limitValue, HALF_PI} from '../helpers/helpers.math'; +import {_alignStartEnd, _toLeftRightCenter} from '../helpers/helpers.extras'; import {toFont, toPadding} from '../helpers/helpers.options'; import Ticks from './core.ticks'; +const reverseAlign = (align) => align === 'left' ? 'right' : align === 'right' ? 'left' : align; +const offsetFromEdge = (scale, edge, offset) => edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset; + /** * @typedef { import("./core.controller").default } Chart * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick @@ -317,6 +321,31 @@ function createTickContext(parent, index, tick) { }); } +function titleAlign(align, position, reverse) { + let ret = _toLeftRightCenter(align); + if ((reverse && position !== 'right') || (!reverse && position === 'right')) { + ret = reverseAlign(ret); + } + return ret; +} + +function titleArgs(scale, offset, position, align) { + const {top, left, bottom, right} = scale; + let rotation = 0; + let maxWidth, titleX, titleY; + + if (scale.isHorizontal()) { + titleX = _alignStartEnd(align, left, right); + titleY = offsetFromEdge(scale, position, offset); + maxWidth = right - left; + } else { + titleX = offsetFromEdge(scale, position, offset); + titleY = _alignStartEnd(align, bottom, top); + rotation = position === 'left' ? -HALF_PI : HALF_PI; + } + return {titleX, titleY, maxWidth, rotation}; +} + export default class Scale extends Element { // eslint-disable-next-line max-statements @@ -1661,69 +1690,34 @@ export default class Scale extends Element { /** * @protected */ - drawTitle(chartArea) { // eslint-disable-line no-unused-vars - const me = this; - const ctx = me.ctx; - const options = me.options; - const title = options.title; + drawTitle() { + const {ctx, options: {position, title, reverse}} = this; if (!title.display) { return; } - const titleFont = toFont(title.font); - const titlePadding = toPadding(title.padding); - const halfLineHeight = titleFont.lineHeight / 2; - const titleAlign = title.align; - const position = options.position; - const isReverse = me.options.reverse; - let rotation = 0; - /** @type CanvasTextAlign */ - let textAlign; - let titleX, titleY; + const font = toFont(title.font); + const padding = toPadding(title.padding); + const align = title.align; + let offset = font.lineHeight / 2; - if (me.isHorizontal()) { - switch (titleAlign) { - case 'start': - titleX = me.left + (isReverse ? me.width : 0); - textAlign = isReverse ? 'right' : 'left'; - break; - case 'end': - titleX = me.left + (isReverse ? 0 : me.width); - textAlign = isReverse ? 'left' : 'right'; - break; - default: - titleX = me.left + me.width / 2; - textAlign = 'center'; + if (position === 'bottom') { + offset += padding.bottom; + if (isArray(title.text)) { + offset += font.lineHeight * (title.text.length - 1); } - titleY = position === 'top' - ? me.top + halfLineHeight + titlePadding.top - : me.bottom - halfLineHeight - titlePadding.bottom; } else { - const isLeft = position === 'left'; - titleX = isLeft - ? me.left + halfLineHeight + titlePadding.top - : me.right - halfLineHeight - titlePadding.top; - switch (titleAlign) { - case 'start': - titleY = me.top + (isReverse ? 0 : me.height); - textAlign = isReverse === isLeft ? 'right' : 'left'; - break; - case 'end': - titleY = me.top + (isReverse ? me.height : 0); - textAlign = isReverse === isLeft ? 'left' : 'right'; - break; - default: - titleY = me.top + me.height / 2; - textAlign = 'center'; - } - rotation = isLeft ? -HALF_PI : HALF_PI; + offset += padding.top; } - renderText(ctx, title.text, 0, 0, titleFont, { + const {titleX, titleY, maxWidth, rotation} = titleArgs(this, offset, position, align); + + renderText(ctx, title.text, 0, 0, font, { color: title.color, + maxWidth, rotation, - textAlign, + textAlign: titleAlign(align, position, reverse), textBaseline: 'middle', translation: [titleX, titleY], }); diff --git a/test/fixtures/core.scale/title-multi-line.js b/test/fixtures/core.scale/title-multi-line.js deleted file mode 100644 index d116254f8..000000000 --- a/test/fixtures/core.scale/title-multi-line.js +++ /dev/null @@ -1,32 +0,0 @@ -module.exports = { - config: { - type: 'line', - data: { - datasets: [{ - data: [1, -1, 3], - }], - labels: ['Label1', 'Label2', 'Label3'] - }, - options: { - scales: { - y: { - title: { - display: true, - text: [ - 'Line 1', - 'Line 2', - 'Line 3', - ] - } - } - } - } - }, - options: { - spriteText: true, - canvas: { - height: 256, - width: 512 - } - } -}; diff --git a/test/fixtures/core.scale/title-multi-line.png b/test/fixtures/core.scale/title-multi-line.png deleted file mode 100644 index 291bb286514d62b0294d484aa4bc6a2cbcd8c71b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17753 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 diff --git a/test/fixtures/core.scale/title/align-end.js b/test/fixtures/core.scale/title/align-end.js new file mode 100644 index 000000000..81059cf94 --- /dev/null +++ b/test/fixtures/core.scale/title/align-end.js @@ -0,0 +1,77 @@ +module.exports = { + config: { + type: 'line', + options: { + events: [], + scales: { + top: { + type: 'linear', + position: 'top', + ticks: { + display: false + }, + gridLines: { + display: false + }, + title: { + display: true, + align: 'end', + text: 'top' + } + }, + left: { + type: 'linear', + position: 'left', + ticks: { + display: false + }, + gridLines: { + display: false + }, + title: { + display: true, + align: 'end', + text: 'left' + } + }, + bottom: { + type: 'linear', + position: 'bottom', + ticks: { + display: false + }, + gridLines: { + display: false + }, + title: { + display: true, + align: 'end', + text: 'bottom' + } + }, + right: { + type: 'linear', + position: 'right', + ticks: { + display: false + }, + gridLines: { + display: false + }, + title: { + display: true, + align: 'end', + text: 'right' + } + }, + } + } + }, + options: { + spriteText: true, + canvas: { + height: 256, + width: 256 + }, + } +}; diff --git a/test/fixtures/core.scale/title/align-end.png b/test/fixtures/core.scale/title/align-end.png new file mode 100644 index 0000000000000000000000000000000000000000..f52a7bf7346ca22024125c05556e50e893a0f016 GIT binary patch literal 4939 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/core.scale/title/align-start.js b/test/fixtures/core.scale/title/align-start.js new file mode 100644 index 000000000..385f1725e --- /dev/null +++ b/test/fixtures/core.scale/title/align-start.js @@ -0,0 +1,77 @@ +module.exports = { + config: { + type: 'line', + options: { + events: [], + scales: { + top: { + type: 'linear', + position: 'top', + ticks: { + display: false + }, + gridLines: { + display: false + }, + title: { + display: true, + align: 'start', + text: 'top' + } + }, + left: { + type: 'linear', + position: 'left', + ticks: { + display: false + }, + gridLines: { + display: false + }, + title: { + display: true, + align: 'start', + text: 'left' + } + }, + bottom: { + type: 'linear', + position: 'bottom', + ticks: { + display: false + }, + gridLines: { + display: false + }, + title: { + display: true, + align: 'start', + text: 'bottom' + } + }, + right: { + type: 'linear', + position: 'right', + ticks: { + display: false + }, + gridLines: { + display: false + }, + title: { + display: true, + align: 'start', + text: 'right' + } + }, + } + } + }, + options: { + spriteText: true, + canvas: { + height: 256, + width: 256 + }, + } +}; diff --git a/test/fixtures/core.scale/title/align-start.png b/test/fixtures/core.scale/title/align-start.png new file mode 100644 index 0000000000000000000000000000000000000000..7a1317ec1c203bae9eaffe1e3afbfdc6bee2f6ca GIT binary patch literal 4930 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/core.scale/title/multi-line/default.js b/test/fixtures/core.scale/title/multi-line/default.js new file mode 100644 index 000000000..c320d0f69 --- /dev/null +++ b/test/fixtures/core.scale/title/multi-line/default.js @@ -0,0 +1,73 @@ +module.exports = { + config: { + type: 'line', + options: { + events: [], + scales: { + top: { + type: 'linear', + position: 'top', + ticks: { + display: false + }, + gridLines: { + display: false + }, + title: { + display: true, + text: ['top', 'line2', 'line3'] + } + }, + left: { + type: 'linear', + position: 'left', + ticks: { + display: false + }, + gridLines: { + display: false + }, + title: { + display: true, + text: ['left', 'line2', 'line3'] + } + }, + bottom: { + type: 'linear', + position: 'bottom', + ticks: { + display: false + }, + gridLines: { + display: false + }, + title: { + display: true, + text: ['bottom', 'line2', 'line3'] + } + }, + right: { + type: 'linear', + position: 'right', + ticks: { + display: false + }, + gridLines: { + display: false + }, + title: { + display: true, + text: ['right', 'line2', 'line3'] + } + }, + } + } + }, + options: { + spriteText: true, + canvas: { + height: 256, + width: 256 + }, + } +}; diff --git a/test/fixtures/core.scale/title/multi-line/default.png b/test/fixtures/core.scale/title/multi-line/default.png new file mode 100644 index 0000000000000000000000000000000000000000..f53f33e0e827ec71e9e96b7c72342523d89e708d GIT binary patch literal 8572 zcmeHtXHb+~(B+-LI74Po0Z9WA6(nbcK}B*2iK7W|1;r8^s-M9Ok(@%t+jw%i1IZ6Nkjk?

y1m%d^XyjE?giClk5)tB< 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