blob: 4e92c5596e1fd274f4d8ba3c9cb562730943f6d2 [file] [log] [blame]
// TODO Batch by color
import * as graphic from '../../util/graphic';
import * as lineContain from 'zrender/src/contain/line';
import * as quadraticContain from 'zrender/src/contain/quadratic';
var LargeLineShape = graphic.extendShape({
shape: {
polyline: false,
segs: []
},
buildPath: function (path, shape) {
var segs = shape.segs;
var isPolyline = shape.polyline;
for (var i = 0; i < segs.length; i++) {
var seg = segs[i];
if (isPolyline) {
path.moveTo(seg[0][0], seg[0][1]);
for (var j = 1; j < seg.length; j++) {
path.lineTo(seg[j][0], seg[j][1]);
}
} else {
path.moveTo(seg[0][0], seg[0][1]);
if (seg.length > 2) {
path.quadraticCurveTo(seg[2][0], seg[2][1], seg[1][0], seg[1][1]);
} else {
path.lineTo(seg[1][0], seg[1][1]);
}
}
}
},
findDataIndex: function (x, y) {
var shape = this.shape;
var segs = shape.segs;
var isPolyline = shape.polyline;
var lineWidth = Math.max(this.style.lineWidth, 1); // Not consider transform
for (var i = 0; i < segs.length; i++) {
var seg = segs[i];
if (isPolyline) {
for (var j = 1; j < seg.length; j++) {
if (lineContain.containStroke(seg[j - 1][0], seg[j - 1][1], seg[j][0], seg[j][1], lineWidth, x, y)) {
return i;
}
}
} else {
if (seg.length > 2) {
if (quadraticContain.containStroke(seg[0][0], seg[0][1], seg[2][0], seg[2][1], seg[1][0], seg[1][1], lineWidth, x, y)) {
return i;
}
} else {
if (lineContain.containStroke(seg[0][0], seg[0][1], seg[1][0], seg[1][1], lineWidth, x, y)) {
return i;
}
}
}
}
return -1;
}
});
function LargeLineDraw() {
this.group = new graphic.Group();
this._lineEl = new LargeLineShape();
}
var largeLineProto = LargeLineDraw.prototype;
/**
* Update symbols draw by new data
* @param {module:echarts/data/List} data
*/
largeLineProto.updateData = function (data) {
this.group.removeAll();
var lineEl = this._lineEl;
var seriesModel = data.hostModel;
lineEl.setShape({
segs: data.mapArray(data.getItemLayout),
polyline: seriesModel.get('polyline')
});
lineEl.useStyle(seriesModel.getModel('lineStyle.normal').getLineStyle());
var visualColor = data.getVisual('color');
if (visualColor) {
lineEl.setStyle('stroke', visualColor);
}
lineEl.setStyle('fill'); // Enable tooltip
// PENDING May have performance issue when path is extremely large
lineEl.seriesIndex = seriesModel.seriesIndex;
lineEl.on('mousemove', function (e) {
lineEl.dataIndex = null;
var dataIndex = lineEl.findDataIndex(e.offsetX, e.offsetY);
if (dataIndex > 0) {
// Provide dataIndex for tooltip
lineEl.dataIndex = dataIndex;
}
}); // Add back
this.group.add(lineEl);
};
largeLineProto.updateLayout = function (seriesModel) {
var data = seriesModel.getData();
this._lineEl.setShape({
segs: data.mapArray(data.getItemLayout)
});
};
largeLineProto.remove = function () {
this.group.removeAll();
};
export default LargeLineDraw;