light-chart
Version:
Charts for mobile visualization.
162 lines (151 loc) • 5.14 kB
JavaScript
const Helper = require('../interaction/helper');
const Util = require('../util/common');
const DEFAULT_CFG = {
mode: 'x',
xStyle: {
backgroundColor: 'rgba(202, 215, 239, .2)',
fillerColor: 'rgba(202, 215, 239, .5)',
size: 4,
lineCap: 'round',
offsetX: 0,
offsetY: 8
},
yStyle: {
backgroundColor: 'rgba(202, 215, 239, .2)',
fillerColor: 'rgba(202, 215, 239, .5)',
size: 4,
lineCap: 'round',
offsetX: 8,
offsetY: 0
}
};
module.exports = {
init(chart) {
chart.set('_limitRange', {});
chart.scrollBar = function(cfg) {
if (cfg === true) {
cfg = DEFAULT_CFG;
} else if (Util.isObject(cfg)) {
cfg = Util.deepMix({}, DEFAULT_CFG, cfg);
}
this.set('_scrollBarCfg', cfg);
};
},
clear(chart) {
chart.set('_limitRange', {});
},
changeData(chart) {
chart.set('_limitRange', {});
},
clearInner(chart) {
const hBar = chart.get('_horizontalBar');
const vBar = chart.get('_verticalBar');
hBar && hBar.remove(true);
vBar && vBar.remove(true);
chart.set('_horizontalBar', null);
chart.set('_verticalBar', null);
},
afterGeomDraw(chart) {
const scrollBarCfg = chart.get('_scrollBarCfg');
if (!scrollBarCfg) return;
const data = chart.get('data');
const plotRange = chart.get('plotRange');
const backPlot = chart.get('backPlot');
const canvas = chart.get('canvas');
const canvasHeight = canvas.get('height');
const limitRange = chart.get('_limitRange');
const mode = scrollBarCfg.mode;
if (Util.directionEnabled(mode, 'x')) {
const { offsetX, offsetY, lineCap, backgroundColor, fillerColor, size } = scrollBarCfg.xStyle;
const xScale = chart.getXScale();
let xLimitRange = limitRange[xScale.field];
if (!xLimitRange) {
xLimitRange = Helper.getLimitRange(data, xScale);
limitRange[xScale.field] = xLimitRange;
}
const currentRange = Helper.getFieldRange(xScale, xLimitRange, xScale.type);
let horizontalBar = chart.get('_horizontalBar');
const yPos = canvasHeight - (size / 2) + offsetY;
if (horizontalBar) {
const progressLine = horizontalBar.get('children')[1];
progressLine.attr({
x1: Math.max(plotRange.bl.x + plotRange.width * currentRange[0] + offsetX, plotRange.bl.x),
x2: Math.min(plotRange.bl.x + plotRange.width * currentRange[1] + offsetX, plotRange.br.x)
});
} else {
horizontalBar = backPlot.addGroup({
className: 'horizontalBar'
});
horizontalBar.addShape('line', {
attrs: {
x1: plotRange.bl.x + offsetX,
y1: yPos,
x2: plotRange.br.x + offsetX,
y2: yPos,
lineWidth: size,
stroke: backgroundColor,
lineCap
}
});
horizontalBar.addShape('line', {
attrs: {
x1: Math.max(plotRange.bl.x + plotRange.width * currentRange[0] + offsetX, plotRange.bl.x),
y1: yPos,
x2: Math.min(plotRange.bl.x + plotRange.width * currentRange[1] + offsetX, plotRange.br.x),
y2: yPos,
lineWidth: size,
stroke: fillerColor,
lineCap
}
});
chart.set('_horizontalBar', horizontalBar);
}
}
if (Util.directionEnabled(mode, 'y')) {
const { offsetX, offsetY, lineCap, backgroundColor, fillerColor, size } = scrollBarCfg.yStyle;
const yScale = chart.getYScales()[0];
let yLimitRange = limitRange[yScale.field];
if (!yLimitRange) {
yLimitRange = Helper.getLimitRange(data, yScale);
limitRange[yScale.field] = yLimitRange;
}
const currentRange = Helper.getFieldRange(yScale, yLimitRange, yScale.type);
let verticalBar = chart.get('_verticalBar');
const xPos = (size / 2) + offsetX;
if (verticalBar) {
const progressLine = verticalBar.get('children')[1];
progressLine.attr({
y1: Math.max(plotRange.tl.y + plotRange.height * currentRange[0] + offsetY, plotRange.tl.y),
y2: Math.min(plotRange.tl.y + plotRange.height * currentRange[1] + offsetY, plotRange.bl.y)
});
} else {
verticalBar = backPlot.addGroup({
className: 'verticalBar'
});
verticalBar.addShape('line', {
attrs: {
x1: xPos,
y1: plotRange.tl.y + offsetY,
x2: xPos,
y2: plotRange.bl.y + offsetY,
lineWidth: size,
stroke: backgroundColor,
lineCap
}
});
verticalBar.addShape('line', {
attrs: {
x1: xPos,
y1: Math.max(plotRange.tl.y + plotRange.height * currentRange[0] + offsetY, plotRange.tl.y),
x2: xPos,
y2: Math.min(plotRange.tl.y + plotRange.height * currentRange[1] + offsetY, plotRange.bl.y),
lineWidth: size,
stroke: fillerColor,
lineCap
}
});
chart.set('_verticalBar', verticalBar);
}
}
}
};