276 lines
8.0 KiB
JavaScript
276 lines
8.0 KiB
JavaScript
function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
|
||
|
||
function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
|
||
|
||
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
||
|
||
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
|
||
|
||
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
|
||
|
||
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
|
||
|
||
var Component = require('../component');
|
||
|
||
var Util = require('../util');
|
||
|
||
var Crosshair = /*#__PURE__*/function (_Component) {
|
||
_inheritsLoose(Crosshair, _Component);
|
||
|
||
var _super = _createSuper(Crosshair);
|
||
|
||
var _proto = Crosshair.prototype;
|
||
|
||
_proto.getDefaultCfg = function getDefaultCfg() {
|
||
var cfg = _Component.prototype.getDefaultCfg.call(this);
|
||
|
||
return Util.mix({}, cfg, {
|
||
/**
|
||
* crosshair的类型
|
||
* @type {String}
|
||
*/
|
||
type: null,
|
||
|
||
/**
|
||
* 画在哪层视图
|
||
* @type {G-Element}
|
||
*/
|
||
plot: null,
|
||
|
||
/**
|
||
* x轴上,移动到位置的偏移量
|
||
* @type {Number}
|
||
*/
|
||
plotRange: null,
|
||
|
||
/**
|
||
* 默认rect crosshair样式
|
||
* @type {Object}
|
||
*/
|
||
rectStyle: {
|
||
fill: '#CCD6EC',
|
||
opacity: 0.3
|
||
},
|
||
|
||
/**
|
||
* 默认line crosshair样式
|
||
* @type {Object}
|
||
*/
|
||
lineStyle: {
|
||
stroke: 'rgba(0, 0, 0, 0.25)',
|
||
lineWidth: 1
|
||
},
|
||
isTransposed: false
|
||
});
|
||
};
|
||
|
||
function Crosshair(cfg) {
|
||
var _this;
|
||
|
||
_this = _Component.call(this, cfg) || this;
|
||
|
||
_this._init_();
|
||
|
||
_this.render();
|
||
|
||
return _this;
|
||
}
|
||
|
||
_proto._init_ = function _init_() {
|
||
var self = this;
|
||
var plot = self.get('plot');
|
||
var group;
|
||
|
||
if (self.type === 'rect') {
|
||
group = plot.addGroup({
|
||
zIndex: 0
|
||
});
|
||
} else {
|
||
group = plot.addGroup();
|
||
}
|
||
|
||
this.set('container', group);
|
||
};
|
||
|
||
_proto._addLineShape = function _addLineShape(attrs, type) {
|
||
var container = this.get('container');
|
||
var shape = container.addShape('line', {
|
||
capture: false,
|
||
attrs: attrs
|
||
}); // shape.hide();
|
||
|
||
this.set('crossLineShape' + type, shape);
|
||
return shape;
|
||
};
|
||
|
||
_proto._renderHorizontalLine = function _renderHorizontalLine(canvas, plotRange) {
|
||
var style = Util.mix(this.get('lineStyle'), this.get('style'));
|
||
var attrs = Util.mix({
|
||
x1: plotRange ? plotRange.bl.x : canvas.get('width'),
|
||
y1: 0,
|
||
x2: plotRange ? plotRange.br.x : 0,
|
||
y2: 0
|
||
}, style);
|
||
|
||
this._addLineShape(attrs, 'X');
|
||
};
|
||
|
||
_proto._renderVerticalLine = function _renderVerticalLine(canvas, plotRange) {
|
||
var style = Util.mix(this.get('lineStyle'), this.get('style'));
|
||
var attrs = Util.mix({
|
||
x1: 0,
|
||
y1: plotRange ? plotRange.bl.y : canvas.get('height'),
|
||
x2: 0,
|
||
y2: plotRange ? plotRange.tl.y : 0
|
||
}, style);
|
||
|
||
this._addLineShape(attrs, 'Y');
|
||
};
|
||
|
||
_proto._renderBackground = function _renderBackground(canvas, plotRange) {
|
||
var style = Util.mix(this.get('rectStyle'), this.get('style'));
|
||
var container = this.get('container');
|
||
var attrs = Util.mix({
|
||
x: plotRange ? plotRange.tl.x : 0,
|
||
y: plotRange ? plotRange.tl.y : canvas.get('height'),
|
||
width: plotRange ? plotRange.br.x - plotRange.bl.x : canvas.get('width'),
|
||
height: plotRange ? Math.abs(plotRange.tl.y - plotRange.bl.y) : canvas.get('height')
|
||
}, style);
|
||
var shape = container.addShape('rect', {
|
||
attrs: attrs,
|
||
capture: false
|
||
}); // shape.hide();
|
||
|
||
this.set('crosshairsRectShape', shape);
|
||
return shape;
|
||
};
|
||
|
||
_proto._updateRectShape = function _updateRectShape(items) {
|
||
var offset;
|
||
var crosshairsRectShape = this.get('crosshairsRectShape');
|
||
var isTransposed = this.get('isTransposed');
|
||
var firstItem = items[0];
|
||
var lastItem = items[items.length - 1];
|
||
var dim = isTransposed ? 'y' : 'x';
|
||
var attr = isTransposed ? 'height' : 'width';
|
||
var startDim = firstItem[dim];
|
||
|
||
if (items.length > 1 && firstItem[dim] > lastItem[dim]) {
|
||
startDim = lastItem[dim];
|
||
}
|
||
|
||
if (this.get('width')) {
|
||
// 用户定义了 width
|
||
crosshairsRectShape.attr(dim, startDim - this.get('crosshairs').width / 2);
|
||
crosshairsRectShape.attr(attr, this.get('width'));
|
||
} else {
|
||
if (Util.isArray(firstItem.point[dim]) && !firstItem.size) {
|
||
// 直方图
|
||
var width = firstItem.point[dim][1] - firstItem.point[dim][0];
|
||
crosshairsRectShape.attr(dim, firstItem.point[dim][0]);
|
||
crosshairsRectShape.attr(attr, width);
|
||
} else {
|
||
offset = 3 * firstItem.size / 4;
|
||
crosshairsRectShape.attr(dim, startDim - offset);
|
||
|
||
if (items.length === 1) {
|
||
crosshairsRectShape.attr(attr, 3 * firstItem.size / 2);
|
||
} else {
|
||
crosshairsRectShape.attr(attr, Math.abs(lastItem[dim] - firstItem[dim]) + 2 * offset);
|
||
}
|
||
}
|
||
}
|
||
};
|
||
|
||
_proto.render = function render() {
|
||
var canvas = this.get('canvas');
|
||
var plotRange = this.get('plotRange');
|
||
var isTransposed = this.get('isTransposed');
|
||
this.clear();
|
||
|
||
switch (this.get('type')) {
|
||
case 'x':
|
||
this._renderHorizontalLine(canvas, plotRange);
|
||
|
||
break;
|
||
|
||
case 'y':
|
||
this._renderVerticalLine(canvas, plotRange);
|
||
|
||
break;
|
||
|
||
case 'cross':
|
||
this._renderHorizontalLine(canvas, plotRange);
|
||
|
||
this._renderVerticalLine(canvas, plotRange);
|
||
|
||
break;
|
||
|
||
case 'rect':
|
||
this._renderBackground(canvas, plotRange);
|
||
|
||
break;
|
||
|
||
default:
|
||
isTransposed ? this._renderHorizontalLine(canvas, plotRange) : this._renderVerticalLine(canvas, plotRange);
|
||
}
|
||
};
|
||
|
||
_proto.show = function show() {
|
||
var container = this.get('container');
|
||
|
||
_Component.prototype.show.call(this);
|
||
|
||
container.show();
|
||
};
|
||
|
||
_proto.hide = function hide() {
|
||
var container = this.get('container');
|
||
|
||
_Component.prototype.hide.call(this);
|
||
|
||
container.hide();
|
||
};
|
||
|
||
_proto.clear = function clear() {
|
||
var container = this.get('container');
|
||
this.set('crossLineShapeX', null);
|
||
this.set('crossLineShapeY', null);
|
||
this.set('crosshairsRectShape', null);
|
||
|
||
_Component.prototype.clear.call(this);
|
||
|
||
container.clear();
|
||
};
|
||
|
||
_proto.destroy = function destroy() {
|
||
var container = this.get('container');
|
||
|
||
_Component.prototype.destroy.call(this);
|
||
|
||
container.remove();
|
||
};
|
||
|
||
_proto.setPosition = function setPosition(x, y, items) {
|
||
var crossLineShapeX = this.get('crossLineShapeX');
|
||
var crossLineShapeY = this.get('crossLineShapeY');
|
||
var crosshairsRectShape = this.get('crosshairsRectShape');
|
||
|
||
if (crossLineShapeY && !crossLineShapeY.get('destroyed')) {
|
||
// 第一次进入时,画布需要单独绘制,所以需要先设定corss的位置
|
||
crossLineShapeY.move(x, 0);
|
||
}
|
||
|
||
if (crossLineShapeX && !crossLineShapeX.get('destroyed')) {
|
||
crossLineShapeX.move(0, y);
|
||
}
|
||
|
||
if (crosshairsRectShape && !crosshairsRectShape.get('destroyed')) {
|
||
this._updateRectShape(items);
|
||
}
|
||
};
|
||
|
||
return Crosshair;
|
||
}(Component);
|
||
|
||
module.exports = Crosshair; |