cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
213 lines (212 loc) • 7.77 kB
JavaScript
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 };