UNPKG

@antv/g2plot

Version:

G2 Plot, a market of plots built with the Grammar of Graphics'

243 lines 8.05 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var event_emitter_1 = tslib_1.__importDefault(require("@antv/event-emitter")); var G = tslib_1.__importStar(require("@antv/g")); var _ = tslib_1.__importStar(require("@antv/util")); var event_1 = require("../util/event"); var Layer = /** @class */ (function (_super) { tslib_1.__extends(Layer, _super); /** * layer base for g2plot */ function Layer(props) { var _this = _super.call(this) || this; _this.layers = []; _this.destroyed = false; _this.visibility = true; _this.rendered = false; _this.eventHandlers = []; _this.options = _this.getOptions(props); _this.processOptions(_this.options); _this.container = new G.Group(); return _this; } Layer.prototype.processOptions = function (options) { this.id = options.id; this.x = options.x; this.y = options.y; this.width = options.width; this.height = options.height; this.canvas = options.canvas; this.parent = options.parent; }; Layer.prototype.updateConfig = function (cfg) { this.options = _.deepMix({}, this.options, cfg); this.processOptions(this.options); }; Layer.prototype.beforeInit = function () { }; /** * init life cycle */ Layer.prototype.init = function () { this.layerBBox = this.getLayerBBox(); this.layerRegion = this.getLayerRegion(); this.eachLayer(function (layer) { layer.init(); }); }; Layer.prototype.afterInit = function () { }; /** * render layer recursively */ Layer.prototype.render = function () { // fixme: 等plot不再继承layer,这个就可以挪到构造函数里去,不需要再加是否render过的判断了 if (!this.rendered) { if (this.parent) { this.parent.container.add(this.container); } else { this.canvas.add(this.container); } } this.rendered = true; this.beforeInit(); this.init(); this.afterInit(); this.container.transform([['t', this.x, this.y]]); this.eachLayer(function (layer) { layer.render(); }); this.canvas.draw(); }; /** * clear layer content */ Layer.prototype.clear = function () { this.eachLayer(function (layer) { layer.destroy(); }); this.layers = []; this.container.clear(); }; /** * destroy layer recursively, remove the container of layer */ Layer.prototype.destroy = function () { var _this = this; this.eachLayer(function (layer) { layer.destroy(); }); _.each(this.eventHandlers, function (h) { _this.off(h.eventName, h.handler); }); this.container.remove(true); this.destroyed = true; }; /** * display layer */ Layer.prototype.show = function () { this.container.set('visible', true); this.visibility = true; }; /** * hide layer */ Layer.prototype.hide = function () { this.container.set('visible', false); this.visibility = false; }; /** * add children layer * @param layer */ Layer.prototype.addLayer = function (layer) { var idx = _.findIndex(this.layers, function (item) { return item === layer; }); if (idx < 0) { if (layer.parent !== this) { layer.parent = this; layer.init(); } this.layers.push(layer); } }; /** * remove children layer * @param layer */ Layer.prototype.removeLayer = function (layer) { var idx = _.findIndex(this.layers, function (item) { return item === layer; }); if (idx >= 0) { this.layers.splice(idx, 1); } }; /** * update layer's display range * @param props * @param recursive whether update children layers or not */ Layer.prototype.updateBBox = function (props, recursive) { if (recursive === void 0) { recursive = false; } var originRange = { x: this.x, y: this.y, width: this.width, height: this.height, }; var newRange = _.deepMix({}, originRange, props); this.x = newRange.x; this.y = newRange.y; this.width = newRange.width; this.height = newRange.height; this.layerBBox = this.getLayerBBox(); this.layerRegion = this.getLayerRegion(); this.render(); if (recursive) { this.eachLayer(function (layer) { layer.updateBBoxByParent(); layer.render(); }); } this.canvas.draw(); }; /** * update display range according to parent layer's range */ Layer.prototype.updateBBoxByParent = function () { var region = this.layerRegion; this.x = this.parent.x + this.parent.width * region.start.x; this.y = this.parent.y + this.parent.height * region.start.y; this.width = this.parent.width * (region.end.x - region.start.x); this.height = this.parent.height * (region.end.y - region.start.y); this.layerBBox = this.getLayerBBox(); }; /** * get global position of layer */ Layer.prototype.getGlobalPosition = function () { var globalX = this.x; var globalY = this.y; var parent = this.parent; while (parent) { globalX += parent.x; globalY += parent.y; parent = parent.parent; } return { x: globalX, y: globalY }; }; Layer.prototype.getGlobalBBox = function () { var globalPosition = this.getGlobalPosition(); return new G.BBox(globalPosition.x, globalPosition.y, this.width, this.height); }; Layer.prototype.getOptions = function (props) { var parentWidth = 0; var parentHeight = 0; if (props.parent) { parentWidth = props.parent.width; parentHeight = props.parent.height; } var defaultOptions = { x: 0, y: 0, width: parentWidth, height: parentHeight, }; return _.deepMix({}, defaultOptions, props); }; Layer.prototype.eachLayer = function (cb) { _.each(this.layers, cb); }; Layer.prototype.parseEvents = function (eventParser) { var _this = this; var eventsName = _.keys(event_1.LAYER_EVENT_MAP); _.each(eventParser, function (e, k) { if (_.contains(eventsName, k) && _.isFunction(e)) { var eventName = event_1.LAYER_EVENT_MAP[k] || k; var handler = e; _this.on(eventName, handler); _this.eventHandlers.push({ name: eventName, handler: handler }); } }); }; Layer.prototype.getLayerBBox = function () { return new G.BBox(this.x, this.y, this.width, this.height); }; Layer.prototype.getLayerRegion = function () { if (this.parent) { var parentWidth = this.parent.width; var parentHeight = this.parent.height; var parentX = this.parent.x; var parentY = this.parent.y; var startX = (this.x - parentX) / parentWidth; var startY = (this.y - parentY) / parentHeight; var endX = (this.x + this.width - parentX) / parentWidth; var endY = (this.y + this.height - parentY) / parentHeight; return { start: { x: startX, y: startY }, end: { x: endX, y: endY } }; } return { start: { x: 0, y: 0 }, end: { x: 1, y: 1 } }; }; return Layer; }(event_emitter_1.default)); exports.default = Layer; //# sourceMappingURL=layer.js.map