UNPKG

chartx

Version:

Data Visualization Chart Library

302 lines (294 loc) 10.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _component = _interopRequireDefault(require("../component")); var _canvax = _interopRequireDefault(require("canvax")); var _tools = require("../../utils/tools"); function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } var _ = _canvax.default._; var Rect = _canvax.default.Shapes.Rect; var lineMarkPoint = /*#__PURE__*/function (_Component) { function lineMarkPoint(opt, app) { var _this; (0, _classCallCheck2.default)(this, lineMarkPoint); _this = _callSuper(this, lineMarkPoint, [opt, app]); _this.name = "lineMarkPoint"; _.extend(true, _this, (0, _tools.getDefaultProps)(lineMarkPoint.defaultProps()), opt); _this.lineDatas = null; _this.sprite = new _canvax.default.Display.Sprite(); _this.app.graphsSprite.addChild(_this.sprite); return _this; } (0, _inherits2.default)(lineMarkPoint, _Component); return (0, _createClass2.default)(lineMarkPoint, [{ key: "reset", value: function reset(opt) { _.extend(true, this, opt); this.lineDatas = null; this.sprite.removeAllChildren(); this.draw(); } }, { key: "draw", value: function draw() { var me = this; var _coord = this.app.getComponent({ name: 'coord' }); this.pos = { x: _coord.origin.x, y: _coord.origin.y }; this.setPosition(); var lineGraphs = me.app.getComponent({ name: 'graphs', type: "line", field: me.lineField }); me.lineDatas = lineGraphs.data[me.lineField].data; var _xAxis = this.app.getComponent({ name: "coord" }).getAxis({ type: "xAxis" }); // let iNode = _xAxis.getIndexOfVal( this.xValue ); // if( iNode == -1 ){ // return; // }; var iNode = -1; for (var i = 0, l = this.lineDatas.length; i < l; i++) { if (this.xValue == this.lineDatas[i].rowData[_xAxis.field]) { iNode = i; break; } } if (iNode == -1) { return; } ; var nodeData = this.lineDatas[iNode]; var preNodeData = iNode ? this.lineDatas[iNode - 1] : null; var nextNodeData = iNode == me.lineDatas.length ? null : this.lineDatas[iNode + 1]; if (nodeData.y != undefined) { var x = nodeData.x; var _txtSp = new _canvax.default.Display.Sprite({ context: { x: x } }); this.sprite.addChild(_txtSp); var txtHeight = 0; var _label = new _canvax.default.Display.Text(me.label.text, { context: { fillStyle: this.label.fontColor, fontSize: this.label.fontSize, textAlign: 'center', textBaseline: 'top' } }); _txtSp.addChild(_label); txtHeight = _label.getTextHeight(); var txtWidth = _label.getTextWidth(); var _bgRect; var padding = 0; //如果有背景,那么就要加上背景的padding if (this.label.background.enabled) { padding = this.label.background.padding; txtHeight += padding * 2; txtWidth += padding * 2; _txtSp.context.x -= padding; //sp的y会在下面单独计算好 _label.context.x += padding; _label.context.y += padding; var r = me.label.background.radius; //添加一下背景 _bgRect = new Rect({ context: { x: -txtWidth / 2 + padding, width: txtWidth, height: txtHeight, radius: [r, r, r, r], fillStyle: me.label.background.fillStyle, strokeStyle: me.label.background.strokeStyle, lineWidth: me.label.background.lineWidth } }); _txtSp.addChild(_bgRect, 0); } ; if (txtWidth / 2 + x > _coord.width) { _txtSp.context.x = _coord.width; _label.context.textAlign = "right"; _bgRect && (_bgRect.context.x -= txtWidth / 2 - padding); } ; if (x - txtWidth / 2 < 0) { _txtSp.context.x = 0; _label.context.textAlign = "left"; _bgRect && (_bgRect.context.x += txtWidth / 2 - padding); } ; //计算y的位置 var _me$_getNodeYandLineP = me._getNodeYandLinePointList(nodeData, preNodeData, nextNodeData, _coord, txtHeight), y = _me$_getNodeYandLineP.y, pointList = _me$_getNodeYandLineP.pointList; _txtSp.context.y = y; if (me.line.enabled) { var _line = new _canvax.default.Shapes.BrokenLine({ context: { pointList: pointList, strokeStyle: me.line.strokeStyle, lineWidth: me.line.lineWidth } }); me.sprite.addChild(_line, 0); } } } }, { key: "_getNodeYandLinePointList", value: function _getNodeYandLinePointList(nodeData, preNodeData, nextNodeData, _coord, txtHeight) { var appHeight = this.app.height; var coordHeight = _coord.height; var y = nodeData.y; var lineLength = !this.line.enabled ? 3 : this.line.lineLength; var lineDis = this.line.lineDis; //line到node的距离 var position = "online"; if (this.position == 'auto') { if (preNodeData && preNodeData.y < nodeData.y || nextNodeData && nextNodeData.y < nodeData.y) { position = 'offline'; //在线的下方 } ; if (position == "online" && Math.abs(y) + lineLength + lineDis + txtHeight > coordHeight) { //在上面但是超过了坐标系顶部空间 position = "offline"; } ; if (position == "offline" && Math.abs(y) < lineLength + txtHeight + lineDis) { //在线下面,但是超出了坐标系底部空间 position = "online"; } ; } else { position = this.position; } ; var top = 0; if (position == "online") { top = y - lineLength - lineDis - txtHeight; } else { top = y + lineDis + lineLength; } ; //默认offline var pointList = [[nodeData.x, top], [nodeData.x, nodeData.y + lineDis]]; if (position == "online") { pointList = [[nodeData.x, top + txtHeight], [nodeData.x, nodeData.y - lineDis]]; } ; return { y: top, pointList: pointList }; } }], [{ key: "defaultProps", value: function defaultProps() { return { lineField: { detail: '对应的line字段', default: null }, xValue: { detail: '在lineFile字段的折线上对应点的x轴的值', default: null }, line: { detail: 'line的配置', propertys: { enabled: { detail: '是否要指示线', default: true }, lineWidth: { detail: '线宽', default: 2 }, strokeStyle: { detail: '线颜色', default: '#ccc' }, lineLength: { detail: '线的长度,也就是label到line的距离', default: 8 }, lineDis: { detail: 'line到折线上面node的距离', default: 3 } } }, label: { detail: 'markpoint标注的文本配置', propertys: { text: { detail: 'label内容', default: '' }, fontSize: { detail: 'label的文本大小', default: 12 }, fontColor: { detail: '文本颜色', default: '#666' }, background: { detail: 'label的background配置', propertys: { enabled: { detail: 'label是否需要背景', default: true }, fillStyle: { detail: 'label的背景颜色', default: '#f5f5f6' }, radius: { detail: 'label的背景圆角', default: 6 }, strokeStyle: { detail: 'label的背景边框颜色', default: '#f5f5f6' }, lineWidth: { detail: '背景描边', default: 1 }, padding: { detail: 'background和label之间的距离', default: 6 } } } } }, position: { detail: '在线的方向,online(线上边) or offline(线下方),默认自动计算', default: 'auto' } }; } }]); }(_component.default); _component.default.registerComponent(lineMarkPoint, 'lineMarkPoint'); var _default = exports.default = lineMarkPoint;