UNPKG

@antv/g6

Version:

graph visualization frame work

209 lines (187 loc) 6.36 kB
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** * @fileOverview animate controller * @author huangtonger@aliyun.com */ var Base = require('./base'); var Util = require('../util/'); var Global = require('../global'); /** * depth traversal and copy the graphics * @param {object} map the index table * @param {array} parent parent * @param {number} count element count * @return {number} count element count */ function getElements(map, parent, count) { var children = parent.get('children'); Util.each(children, function (child) { count++; var id = child.gid; if (child.isGroup) { count = getElements(map, child, count); } if (!Util.isNil(id)) { var stash = { matrixStash: Util.clone(child.getMatrix()), element: child }; if (child.isShape) { var attrs = child.get('attrs'); stash.attrsStash = {}; Util.each(attrs, function (v, k) { stash.attrsStash[k] = child.attr(k); }); } map[id] = stash; } }); return count; } function updateAnimate(element, props) { element.set('capture', false); element.animate(props, Global.updateDuration, Global.updateEasing, function () { element.set('capture', true); }); } var Controller = function (_Base) { _inherits(Controller, _Base); function Controller(cfg) { _classCallCheck(this, Controller); var _this = _possibleConstructorReturn(this, _Base.call(this, cfg)); _this._init(); return _this; } Controller.prototype._init = function _init() { var _this2 = this; var graph = this.graph; graph.on('afteritemdraw', function (ev) { _this2.cacheKeyFrame(ev.item); }); }; Controller.prototype.cacheKeyFrame = function cacheKeyFrame(item) { var keyFrameCache = this.keyFrameCache; var group = item.getGraphicGroup(); if (item.isEdge) { group.setMatrix([1, 0, 0, 0, 1, 0, 0, 0, 1]); } group.deepEach(function (element) { var id = element.gid; var stash = { matrix: Util.clone(element.getMatrix()) }; if (element.isItemContainer) { stash.enterAnimate = item.getEnterAnimate(); stash.leaveAnimate = item.getLeaveAnimate(); } if (element.isShape) { stash.attrs = element.getAttrs(); } stash.item = item; keyFrameCache[id] = stash; }, true); }; Controller.prototype._compare = function _compare() { var stash0 = this.stash0; var stash1 = this.stash1; var enterElements = []; var leaveElements = []; var updateElements = []; Util.each(stash1, function (v, k) { if (stash0[k]) { if (v.element.get('type') === stash0[k].element.get('type')) { updateElements.push(k); } } else { enterElements.push(k); } }); Util.each(stash0, function (v, k) { if (!stash1[k]) { leaveElements.push(k); } }); this.enterElements = enterElements; this.leaveElements = leaveElements; this.updateElements = updateElements; }; Controller.prototype._addTween = function _addTween() { var enterElements = this.enterElements; var leaveElements = this.leaveElements; var updateElements = this.updateElements; var stash0 = this.stash0; var stash1 = this.stash1; var keyFrameCache = this.keyFrameCache; Util.each(enterElements, function (elementId) { var keyFrame = keyFrameCache[elementId]; var enterAnimate = keyFrame.enterAnimate; if (enterAnimate) { enterAnimate(keyFrame.item, stash0.element, stash1.element); } }); Util.each(leaveElements, function (elementId) { var keyFrame = keyFrameCache[elementId]; var leaveAnimate = keyFrame.leaveAnimate; if (leaveAnimate) { var e0 = stash0[elementId].element; e0.getParent().add(e0); leaveAnimate(keyFrame.item, stash0, stash1); } }); Util.each(updateElements, function (elementId) { var keyFrame = keyFrameCache[elementId]; var subStash1 = stash1[elementId]; var subStash0 = stash0[elementId]; var e1 = subStash1.element; var e0 = subStash0.element; if (subStash0.attrsStash) { e1.attr(subStash0.attrsStash); } e1.setMatrix(subStash0.matrixStash); updateAnimate(e1, Util.mix({}, keyFrame.attrs, { matrix: keyFrame.matrix })); if (e0 !== e1) { e0.remove(); } }); }; Controller.prototype.getDefaultCfg = function getDefaultCfg() { return { graph: null, canvases: null, stash0: null, stash1: null, keyFrameCache: {} }; }; Controller.prototype.run = function run() { if (this.graph.destroyed) { return; } this.updateStash(); if (this.count < 5000) { this._compare(); this._addTween(); } Util.each(this.canvases, function (canvas) { canvas.draw(); }); }; Controller.prototype.updateStash = function updateStash() { var canvases = this.canvases; var elementsStash = this.elementsStash; var elements = {}; var count = 0; elementsStash = elementsStash ? elementsStash : {}; Util.each(canvases, function (canvas) { count += getElements(elements, canvas, 0); }); this.elementsStash = elements; this.stash0 = elementsStash; this.stash1 = elements; this.count = count; }; return Controller; }(Base); module.exports = Controller;