UNPKG

cione-comp-lib

Version:

`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`

213 lines (212 loc) 7.77 kB
import { __extends } from "../../../../tslib/tslib.es6.mjs"; import SymbolDraw from "../helper/SymbolDraw.mjs"; import LineDraw from "../helper/LineDraw.mjs"; import RoamController from "../../component/helper/RoamController.mjs"; import { updateViewOnPan, updateViewOnZoom } from "../../component/helper/roamHelper.mjs"; import { onIrrelevantElement } from "../../component/helper/cursorHelper.mjs"; import adjustEdge from "./adjustEdge.mjs"; import { getNodeGlobalScale } from "./graphHelper.mjs"; import ChartView from "../../view/Chart.mjs"; import { getECData } from "../../util/innerStore.mjs"; import { simpleLayoutEdge } from "./simpleLayoutHelper.mjs"; import { circularLayout, rotateNodeLabel } from "./circularLayoutHelper.mjs"; import { updateProps } from "../../animation/basicTransition.mjs"; function isViewCoordSys(coordSys) { return coordSys.type === "view"; } var GraphView = function(_super) { __extends(GraphView2, _super); function GraphView2() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = GraphView2.type; return _this; } GraphView2.prototype.init = function(ecModel, api) { var symbolDraw = new SymbolDraw(); var lineDraw = new LineDraw(); var group = this.group; this._controller = new RoamController(api.getZr()); this._controllerHost = { target: group }; group.add(symbolDraw.group); group.add(lineDraw.group); this._symbolDraw = symbolDraw; this._lineDraw = lineDraw; this._firstRender = true; }; GraphView2.prototype.render = function(seriesModel, ecModel, api) { var _this = this; var coordSys = seriesModel.coordinateSystem; this._model = seriesModel; var symbolDraw = this._symbolDraw; var lineDraw = this._lineDraw; var group = this.group; if (isViewCoordSys(coordSys)) { var groupNewProp = { x: coordSys.x, y: coordSys.y, scaleX: coordSys.scaleX, scaleY: coordSys.scaleY }; if (this._firstRender) { group.attr(groupNewProp); } else { updateProps(group, groupNewProp, seriesModel); } } adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel)); var data = seriesModel.getData(); symbolDraw.updateData(data); var edgeData = seriesModel.getEdgeData(); lineDraw.updateData(edgeData); this._updateNodeAndLinkScale(); this._updateController(seriesModel, ecModel, api); clearTimeout(this._layoutTimeout); var forceLayout = seriesModel.forceLayout; var layoutAnimation = seriesModel.get(["force", "layoutAnimation"]); if (forceLayout) { this._startForceLayoutIteration(forceLayout, layoutAnimation); } var layout = seriesModel.get("layout"); data.graph.eachNode(function(node) { var idx = node.dataIndex; var el = node.getGraphicEl(); var itemModel = node.getModel(); if (!el) { return; } el.off("drag").off("dragend"); var draggable = itemModel.get("draggable"); if (draggable) { el.on("drag", function(e) { switch (layout) { case "force": forceLayout.warmUp(); !_this._layouting && _this._startForceLayoutIteration(forceLayout, layoutAnimation); forceLayout.setFixed(idx); data.setItemLayout(idx, [el.x, el.y]); break; case "circular": data.setItemLayout(idx, [el.x, el.y]); node.setLayout({ fixed: true }, true); circularLayout(seriesModel, "symbolSize", node, [e.offsetX, e.offsetY]); _this.updateLayout(seriesModel); break; case "none": default: data.setItemLayout(idx, [el.x, el.y]); simpleLayoutEdge(seriesModel.getGraph(), seriesModel); _this.updateLayout(seriesModel); break; } }).on("dragend", function() { if (forceLayout) { forceLayout.setUnfixed(idx); } }); } el.setDraggable(draggable, !!itemModel.get("cursor")); var focus = itemModel.get(["emphasis", "focus"]); if (focus === "adjacency") { getECData(el).focus = node.getAdjacentDataIndices(); } }); data.graph.eachEdge(function(edge) { var el = edge.getGraphicEl(); var focus = edge.getModel().get(["emphasis", "focus"]); if (!el) { return; } if (focus === "adjacency") { getECData(el).focus = { edge: [edge.dataIndex], node: [edge.node1.dataIndex, edge.node2.dataIndex] }; } }); var circularRotateLabel = seriesModel.get("layout") === "circular" && seriesModel.get(["circular", "rotateLabel"]); var cx = data.getLayout("cx"); var cy = data.getLayout("cy"); data.graph.eachNode(function(node) { rotateNodeLabel(node, circularRotateLabel, cx, cy); }); this._firstRender = false; }; GraphView2.prototype.dispose = function() { this._controller && this._controller.dispose(); this._controllerHost = null; }; GraphView2.prototype._startForceLayoutIteration = function(forceLayout, layoutAnimation) { var self = this; (function step() { forceLayout.step(function(stopped) { self.updateLayout(self._model); (self._layouting = !stopped) && (layoutAnimation ? self._layoutTimeout = setTimeout(step, 16) : step()); }); })(); }; GraphView2.prototype._updateController = function(seriesModel, ecModel, api) { var _this = this; var controller = this._controller; var controllerHost = this._controllerHost; var group = this.group; controller.setPointerChecker(function(e, x, y) { var rect = group.getBoundingRect(); rect.applyTransform(group.transform); return rect.contain(x, y) && !onIrrelevantElement(e, api, seriesModel); }); if (!isViewCoordSys(seriesModel.coordinateSystem)) { controller.disable(); return; } controller.enable(seriesModel.get("roam")); controllerHost.zoomLimit = seriesModel.get("scaleLimit"); controllerHost.zoom = seriesModel.coordinateSystem.getZoom(); controller.off("pan").off("zoom").on("pan", function(e) { updateViewOnPan(controllerHost, e.dx, e.dy); api.dispatchAction({ seriesId: seriesModel.id, type: "graphRoam", dx: e.dx, dy: e.dy }); }).on("zoom", function(e) { updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY); api.dispatchAction({ seriesId: seriesModel.id, type: "graphRoam", zoom: e.scale, originX: e.originX, originY: e.originY }); _this._updateNodeAndLinkScale(); adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel)); _this._lineDraw.updateLayout(); api.updateLabelLayout(); }); }; GraphView2.prototype._updateNodeAndLinkScale = function() { var seriesModel = this._model; var data = seriesModel.getData(); var nodeScale = getNodeGlobalScale(seriesModel); data.eachItemGraphicEl(function(el, idx) { el && el.setSymbolScale(nodeScale); }); }; GraphView2.prototype.updateLayout = function(seriesModel) { adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel)); this._symbolDraw.updateLayout(); this._lineDraw.updateLayout(); }; GraphView2.prototype.remove = function(ecModel, api) { this._symbolDraw && this._symbolDraw.remove(); this._lineDraw && this._lineDraw.remove(); }; GraphView2.type = "graph"; return GraphView2; }(ChartView); var GraphView$1 = GraphView; export { GraphView$1 as default };