cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
549 lines (548 loc) • 19.4 kB
JavaScript
import { __extends } from "../../../../tslib/tslib.es6.mjs";
import { concatArray, defaults } from "../../../../zrender/lib/core/util.mjs";
import { getECData } from "../../util/innerStore.mjs";
import SymbolClz from "../helper/Symbol.mjs";
import { radialCoordinate } from "./layoutHelper.mjs";
import { fromPoints } from "../../../../zrender/lib/core/bbox.mjs";
import View from "../../coord/View.mjs";
import { updateViewOnPan, updateViewOnZoom } from "../../component/helper/roamHelper.mjs";
import RoamController from "../../component/helper/RoamController.mjs";
import { onIrrelevantElement } from "../../component/helper/cursorHelper.mjs";
import { parsePercent } from "../../util/number.mjs";
import ChartView from "../../view/Chart.mjs";
import Path from "../../../../zrender/lib/graphic/Path.mjs";
import { HOVER_STATE_BLUR, setStatesFlag, setStatesStylesFromModel, setDefaultStateProxy } from "../../util/states.mjs";
import Group from "../../../../zrender/lib/graphic/Group.mjs";
import { updateProps, removeElement } from "../../animation/basicTransition.mjs";
import BezierCurve from "../../../../zrender/lib/graphic/shape/BezierCurve.mjs";
var TreeEdgeShape = function() {
function TreeEdgeShape2() {
this.parentPoint = [];
this.childPoints = [];
}
return TreeEdgeShape2;
}();
var TreePath = function(_super) {
__extends(TreePath2, _super);
function TreePath2(opts) {
return _super.call(this, opts) || this;
}
TreePath2.prototype.getDefaultStyle = function() {
return {
stroke: "#000",
fill: null
};
};
TreePath2.prototype.getDefaultShape = function() {
return new TreeEdgeShape();
};
TreePath2.prototype.buildPath = function(ctx, shape) {
var childPoints = shape.childPoints;
var childLen = childPoints.length;
var parentPoint = shape.parentPoint;
var firstChildPos = childPoints[0];
var lastChildPos = childPoints[childLen - 1];
if (childLen === 1) {
ctx.moveTo(parentPoint[0], parentPoint[1]);
ctx.lineTo(firstChildPos[0], firstChildPos[1]);
return;
}
var orient = shape.orient;
var forkDim = orient === "TB" || orient === "BT" ? 0 : 1;
var otherDim = 1 - forkDim;
var forkPosition = parsePercent(shape.forkPosition, 1);
var tmpPoint = [];
tmpPoint[forkDim] = parentPoint[forkDim];
tmpPoint[otherDim] = parentPoint[otherDim] + (lastChildPos[otherDim] - parentPoint[otherDim]) * forkPosition;
ctx.moveTo(parentPoint[0], parentPoint[1]);
ctx.lineTo(tmpPoint[0], tmpPoint[1]);
ctx.moveTo(firstChildPos[0], firstChildPos[1]);
tmpPoint[forkDim] = firstChildPos[forkDim];
ctx.lineTo(tmpPoint[0], tmpPoint[1]);
tmpPoint[forkDim] = lastChildPos[forkDim];
ctx.lineTo(tmpPoint[0], tmpPoint[1]);
ctx.lineTo(lastChildPos[0], lastChildPos[1]);
for (var i = 1; i < childLen - 1; i++) {
var point = childPoints[i];
ctx.moveTo(point[0], point[1]);
tmpPoint[forkDim] = point[forkDim];
ctx.lineTo(tmpPoint[0], tmpPoint[1]);
}
};
return TreePath2;
}(Path);
var TreeView = function(_super) {
__extends(TreeView2, _super);
function TreeView2() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this.type = TreeView2.type;
_this._mainGroup = new Group();
return _this;
}
TreeView2.prototype.init = function(ecModel, api) {
this._controller = new RoamController(api.getZr());
this._controllerHost = {
target: this.group
};
this.group.add(this._mainGroup);
};
TreeView2.prototype.render = function(seriesModel, ecModel, api) {
var data = seriesModel.getData();
var layoutInfo = seriesModel.layoutInfo;
var group = this._mainGroup;
var layout = seriesModel.get("layout");
if (layout === "radial") {
group.x = layoutInfo.x + layoutInfo.width / 2;
group.y = layoutInfo.y + layoutInfo.height / 2;
} else {
group.x = layoutInfo.x;
group.y = layoutInfo.y;
}
this._updateViewCoordSys(seriesModel, api);
this._updateController(seriesModel, ecModel, api);
var oldData = this._data;
data.diff(oldData).add(function(newIdx) {
if (symbolNeedsDraw(data, newIdx)) {
updateNode(data, newIdx, null, group, seriesModel);
}
}).update(function(newIdx, oldIdx) {
var symbolEl = oldData.getItemGraphicEl(oldIdx);
if (!symbolNeedsDraw(data, newIdx)) {
symbolEl && removeNode(oldData, oldIdx, symbolEl, group, seriesModel);
return;
}
updateNode(data, newIdx, symbolEl, group, seriesModel);
}).remove(function(oldIdx) {
var symbolEl = oldData.getItemGraphicEl(oldIdx);
if (symbolEl) {
removeNode(oldData, oldIdx, symbolEl, group, seriesModel);
}
}).execute();
this._nodeScaleRatio = seriesModel.get("nodeScaleRatio");
this._updateNodeAndLinkScale(seriesModel);
if (seriesModel.get("expandAndCollapse") === true) {
data.eachItemGraphicEl(function(el, dataIndex) {
el.off("click").on("click", function() {
api.dispatchAction({
type: "treeExpandAndCollapse",
seriesId: seriesModel.id,
dataIndex
});
});
});
}
this._data = data;
};
TreeView2.prototype._updateViewCoordSys = function(seriesModel, api) {
var data = seriesModel.getData();
var points = [];
data.each(function(idx) {
var layout = data.getItemLayout(idx);
if (layout && !isNaN(layout.x) && !isNaN(layout.y)) {
points.push([+layout.x, +layout.y]);
}
});
var min = [];
var max = [];
fromPoints(points, min, max);
var oldMin = this._min;
var oldMax = this._max;
if (max[0] - min[0] === 0) {
min[0] = oldMin ? oldMin[0] : min[0] - 1;
max[0] = oldMax ? oldMax[0] : max[0] + 1;
}
if (max[1] - min[1] === 0) {
min[1] = oldMin ? oldMin[1] : min[1] - 1;
max[1] = oldMax ? oldMax[1] : max[1] + 1;
}
var viewCoordSys = seriesModel.coordinateSystem = new View();
viewCoordSys.zoomLimit = seriesModel.get("scaleLimit");
viewCoordSys.setBoundingRect(min[0], min[1], max[0] - min[0], max[1] - min[1]);
viewCoordSys.setCenter(seriesModel.get("center"), api);
viewCoordSys.setZoom(seriesModel.get("zoom"));
this.group.attr({
x: viewCoordSys.x,
y: viewCoordSys.y,
scaleX: viewCoordSys.scaleX,
scaleY: viewCoordSys.scaleY
});
this._min = min;
this._max = max;
};
TreeView2.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);
});
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: "treeRoam",
dx: e.dx,
dy: e.dy
});
}).on("zoom", function(e) {
updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY);
api.dispatchAction({
seriesId: seriesModel.id,
type: "treeRoam",
zoom: e.scale,
originX: e.originX,
originY: e.originY
});
_this._updateNodeAndLinkScale(seriesModel);
api.updateLabelLayout();
});
};
TreeView2.prototype._updateNodeAndLinkScale = function(seriesModel) {
var data = seriesModel.getData();
var nodeScale = this._getNodeGlobalScale(seriesModel);
data.eachItemGraphicEl(function(el, idx) {
el.setSymbolScale(nodeScale);
});
};
TreeView2.prototype._getNodeGlobalScale = function(seriesModel) {
var coordSys = seriesModel.coordinateSystem;
if (coordSys.type !== "view") {
return 1;
}
var nodeScaleRatio = this._nodeScaleRatio;
var groupZoom = coordSys.scaleX || 1;
var roamZoom = coordSys.getZoom();
var nodeScale = (roamZoom - 1) * nodeScaleRatio + 1;
return nodeScale / groupZoom;
};
TreeView2.prototype.dispose = function() {
this._controller && this._controller.dispose();
this._controllerHost = null;
};
TreeView2.prototype.remove = function() {
this._mainGroup.removeAll();
this._data = null;
};
TreeView2.type = "tree";
return TreeView2;
}(ChartView);
function symbolNeedsDraw(data, dataIndex) {
var layout = data.getItemLayout(dataIndex);
return layout && !isNaN(layout.x) && !isNaN(layout.y);
}
function updateNode(data, dataIndex, symbolEl, group, seriesModel) {
var isInit = !symbolEl;
var node = data.tree.getNodeByDataIndex(dataIndex);
var itemModel = node.getModel();
var visualColor = node.getVisual("style").fill;
var symbolInnerColor = node.isExpand === false && node.children.length !== 0 ? visualColor : "#fff";
var virtualRoot = data.tree.root;
var source = node.parentNode === virtualRoot ? node : node.parentNode || node;
var sourceSymbolEl = data.getItemGraphicEl(source.dataIndex);
var sourceLayout = source.getLayout();
var sourceOldLayout = sourceSymbolEl ? {
x: sourceSymbolEl.__oldX,
y: sourceSymbolEl.__oldY,
rawX: sourceSymbolEl.__radialOldRawX,
rawY: sourceSymbolEl.__radialOldRawY
} : sourceLayout;
var targetLayout = node.getLayout();
if (isInit) {
symbolEl = new SymbolClz(data, dataIndex, null, {
symbolInnerColor,
useNameLabel: true
});
symbolEl.x = sourceOldLayout.x;
symbolEl.y = sourceOldLayout.y;
} else {
symbolEl.updateData(data, dataIndex, null, {
symbolInnerColor,
useNameLabel: true
});
}
symbolEl.__radialOldRawX = symbolEl.__radialRawX;
symbolEl.__radialOldRawY = symbolEl.__radialRawY;
symbolEl.__radialRawX = targetLayout.rawX;
symbolEl.__radialRawY = targetLayout.rawY;
group.add(symbolEl);
data.setItemGraphicEl(dataIndex, symbolEl);
symbolEl.__oldX = symbolEl.x;
symbolEl.__oldY = symbolEl.y;
updateProps(symbolEl, {
x: targetLayout.x,
y: targetLayout.y
}, seriesModel);
var symbolPath = symbolEl.getSymbolPath();
if (seriesModel.get("layout") === "radial") {
var realRoot = virtualRoot.children[0];
var rootLayout = realRoot.getLayout();
var length_1 = realRoot.children.length;
var rad = void 0;
var isLeft = void 0;
if (targetLayout.x === rootLayout.x && node.isExpand === true && realRoot.children.length) {
var center = {
x: (realRoot.children[0].getLayout().x + realRoot.children[length_1 - 1].getLayout().x) / 2,
y: (realRoot.children[0].getLayout().y + realRoot.children[length_1 - 1].getLayout().y) / 2
};
rad = Math.atan2(center.y - rootLayout.y, center.x - rootLayout.x);
if (rad < 0) {
rad = Math.PI * 2 + rad;
}
isLeft = center.x < rootLayout.x;
if (isLeft) {
rad = rad - Math.PI;
}
} else {
rad = Math.atan2(targetLayout.y - rootLayout.y, targetLayout.x - rootLayout.x);
if (rad < 0) {
rad = Math.PI * 2 + rad;
}
if (node.children.length === 0 || node.children.length !== 0 && node.isExpand === false) {
isLeft = targetLayout.x < rootLayout.x;
if (isLeft) {
rad = rad - Math.PI;
}
} else {
isLeft = targetLayout.x > rootLayout.x;
if (!isLeft) {
rad = rad - Math.PI;
}
}
}
var textPosition = isLeft ? "left" : "right";
var normalLabelModel = itemModel.getModel("label");
var rotate = normalLabelModel.get("rotate");
var labelRotateRadian = rotate * (Math.PI / 180);
var textContent = symbolPath.getTextContent();
if (textContent) {
symbolPath.setTextConfig({
position: normalLabelModel.get("position") || textPosition,
rotation: rotate == null ? -rad : labelRotateRadian,
origin: "center"
});
textContent.setStyle("verticalAlign", "middle");
}
}
var focus = itemModel.get(["emphasis", "focus"]);
var focusDataIndices = focus === "relative" ? concatArray(node.getAncestorsIndices(), node.getDescendantIndices()) : focus === "ancestor" ? node.getAncestorsIndices() : focus === "descendant" ? node.getDescendantIndices() : null;
if (focusDataIndices) {
getECData(symbolEl).focus = focusDataIndices;
}
drawEdge(seriesModel, node, virtualRoot, symbolEl, sourceOldLayout, sourceLayout, targetLayout, group);
if (symbolEl.__edge) {
symbolEl.onHoverStateChange = function(toState) {
if (toState !== "blur") {
var parentEl = node.parentNode && data.getItemGraphicEl(node.parentNode.dataIndex);
if (!(parentEl && parentEl.hoverState === HOVER_STATE_BLUR)) {
setStatesFlag(symbolEl.__edge, toState);
}
}
};
}
}
function drawEdge(seriesModel, node, virtualRoot, symbolEl, sourceOldLayout, sourceLayout, targetLayout, group) {
var itemModel = node.getModel();
var edgeShape = seriesModel.get("edgeShape");
var layout = seriesModel.get("layout");
var orient = seriesModel.getOrient();
var curvature = seriesModel.get(["lineStyle", "curveness"]);
var edgeForkPosition = seriesModel.get("edgeForkPosition");
var lineStyle = itemModel.getModel("lineStyle").getLineStyle();
var edge = symbolEl.__edge;
if (edgeShape === "curve") {
if (node.parentNode && node.parentNode !== virtualRoot) {
if (!edge) {
edge = symbolEl.__edge = new BezierCurve({
shape: getEdgeShape(layout, orient, curvature, sourceOldLayout, sourceOldLayout)
});
}
updateProps(edge, {
shape: getEdgeShape(layout, orient, curvature, sourceLayout, targetLayout)
}, seriesModel);
}
} else if (edgeShape === "polyline") {
if (layout === "orthogonal") {
if (node !== virtualRoot && node.children && node.children.length !== 0 && node.isExpand === true) {
var children = node.children;
var childPoints = [];
for (var i = 0; i < children.length; i++) {
var childLayout = children[i].getLayout();
childPoints.push([childLayout.x, childLayout.y]);
}
if (!edge) {
edge = symbolEl.__edge = new TreePath({
shape: {
parentPoint: [targetLayout.x, targetLayout.y],
childPoints: [[targetLayout.x, targetLayout.y]],
orient,
forkPosition: edgeForkPosition
}
});
}
updateProps(edge, {
shape: {
parentPoint: [targetLayout.x, targetLayout.y],
childPoints
}
}, seriesModel);
}
}
}
if (edge && !(edgeShape === "polyline" && !node.isExpand)) {
edge.useStyle(defaults({
strokeNoScale: true,
fill: null
}, lineStyle));
setStatesStylesFromModel(edge, itemModel, "lineStyle");
setDefaultStateProxy(edge);
group.add(edge);
}
}
function removeNodeEdge(node, data, group, seriesModel, removeAnimationOpt) {
var virtualRoot = data.tree.root;
var _a = getSourceNode(virtualRoot, node), source = _a.source, sourceLayout = _a.sourceLayout;
var symbolEl = data.getItemGraphicEl(node.dataIndex);
if (!symbolEl) {
return;
}
var sourceSymbolEl = data.getItemGraphicEl(source.dataIndex);
var sourceEdge = sourceSymbolEl.__edge;
var edge = symbolEl.__edge || (source.isExpand === false || source.children.length === 1 ? sourceEdge : void 0);
var edgeShape = seriesModel.get("edgeShape");
var layoutOpt = seriesModel.get("layout");
var orient = seriesModel.get("orient");
var curvature = seriesModel.get(["lineStyle", "curveness"]);
if (edge) {
if (edgeShape === "curve") {
removeElement(edge, {
shape: getEdgeShape(layoutOpt, orient, curvature, sourceLayout, sourceLayout),
style: {
opacity: 0
}
}, seriesModel, {
cb: function() {
group.remove(edge);
},
removeOpt: removeAnimationOpt
});
} else if (edgeShape === "polyline" && seriesModel.get("layout") === "orthogonal") {
removeElement(edge, {
shape: {
parentPoint: [sourceLayout.x, sourceLayout.y],
childPoints: [[sourceLayout.x, sourceLayout.y]]
},
style: {
opacity: 0
}
}, seriesModel, {
cb: function() {
group.remove(edge);
},
removeOpt: removeAnimationOpt
});
}
}
}
function getSourceNode(virtualRoot, node) {
var source = node.parentNode === virtualRoot ? node : node.parentNode || node;
var sourceLayout;
while (sourceLayout = source.getLayout(), sourceLayout == null) {
source = source.parentNode === virtualRoot ? source : source.parentNode || source;
}
return {
source,
sourceLayout
};
}
function removeNode(data, dataIndex, symbolEl, group, seriesModel) {
var node = data.tree.getNodeByDataIndex(dataIndex);
var virtualRoot = data.tree.root;
var sourceLayout = getSourceNode(virtualRoot, node).sourceLayout;
var removeAnimationOpt = {
duration: seriesModel.get("animationDurationUpdate"),
easing: seriesModel.get("animationEasingUpdate")
};
removeElement(symbolEl, {
x: sourceLayout.x + 1,
y: sourceLayout.y + 1
}, seriesModel, {
cb: function() {
group.remove(symbolEl);
data.setItemGraphicEl(dataIndex, null);
},
removeOpt: removeAnimationOpt
});
symbolEl.fadeOut(null, data.hostModel, {
fadeLabel: true,
animation: removeAnimationOpt
});
node.children.forEach(function(childNode) {
removeNodeEdge(childNode, data, group, seriesModel, removeAnimationOpt);
});
removeNodeEdge(node, data, group, seriesModel, removeAnimationOpt);
}
function getEdgeShape(layoutOpt, orient, curvature, sourceLayout, targetLayout) {
var cpx1;
var cpy1;
var cpx2;
var cpy2;
var x1;
var x2;
var y1;
var y2;
if (layoutOpt === "radial") {
x1 = sourceLayout.rawX;
y1 = sourceLayout.rawY;
x2 = targetLayout.rawX;
y2 = targetLayout.rawY;
var radialCoor1 = radialCoordinate(x1, y1);
var radialCoor2 = radialCoordinate(x1, y1 + (y2 - y1) * curvature);
var radialCoor3 = radialCoordinate(x2, y2 + (y1 - y2) * curvature);
var radialCoor4 = radialCoordinate(x2, y2);
return {
x1: radialCoor1.x || 0,
y1: radialCoor1.y || 0,
x2: radialCoor4.x || 0,
y2: radialCoor4.y || 0,
cpx1: radialCoor2.x || 0,
cpy1: radialCoor2.y || 0,
cpx2: radialCoor3.x || 0,
cpy2: radialCoor3.y || 0
};
} else {
x1 = sourceLayout.x;
y1 = sourceLayout.y;
x2 = targetLayout.x;
y2 = targetLayout.y;
if (orient === "LR" || orient === "RL") {
cpx1 = x1 + (x2 - x1) * curvature;
cpy1 = y1;
cpx2 = x2 + (x1 - x2) * curvature;
cpy2 = y2;
}
if (orient === "TB" || orient === "BT") {
cpx1 = x1;
cpy1 = y1 + (y2 - y1) * curvature;
cpx2 = x2;
cpy2 = y2 + (y1 - y2) * curvature;
}
}
return {
x1,
y1,
x2,
y2,
cpx1,
cpy1,
cpx2,
cpy2
};
}
var TreeView$1 = TreeView;
export { TreeView$1 as default };