UNPKG

@antv/g6-pc

Version:

A Graph Visualization Framework in JavaScript

250 lines (249 loc) 8.19 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _tslib = require("tslib"); var _domUtil = require("@antv/dom-util"); var _util = require("@antv/util"); var _g6Core = require("@antv/g6-core"); var cloneEvent = _g6Core.Util.cloneEvent, isViewportChanged = _g6Core.Util.isViewportChanged; var EventController = /** @class */function (_super) { (0, _tslib.__extends)(EventController, _super); function EventController(graph) { var _this = _super.call(this, graph) || this; _this.extendEvents = []; _this.dragging = false; _this.mousedown = false; _this.preItem = null; _this.destroy(); _this.graph = graph; _this.destroyed = false; _this.initEvents(); return _this; } // 初始化 G6 中的事件 EventController.prototype.initEvents = function () { var _a = this, graph = _a.graph, _b = _a.extendEvents, extendEvents = _b === void 0 ? [] : _b; var canvas = graph.get('canvas'); // canvas.set('draggable', true); var el = canvas.get('el'); var canvasHandler = (0, _util.wrapBehavior)(this, 'onCanvasEvents'); var originHandler = (0, _util.wrapBehavior)(this, 'onExtendEvents'); var wheelHandler = (0, _util.wrapBehavior)(this, 'onWheelEvent'); // each(EVENTS, event => { // canvas.off(event).on(event, canvasHandler); // }); canvas.off('*').on('*', canvasHandler); this.canvasHandler = canvasHandler; extendEvents.push((0, _domUtil.addEventListener)(el, 'wheel', wheelHandler)); if (typeof window !== 'undefined') { extendEvents.push((0, _domUtil.addEventListener)(window, 'keydown', originHandler)); extendEvents.push((0, _domUtil.addEventListener)(window, 'keyup', originHandler)); extendEvents.push((0, _domUtil.addEventListener)(window, 'focus', originHandler)); } // 数据变更,重置一些状态 if (this.resetHandler) graph.off('afterchangedata', this.resetHandler); this.resetHandler = (0, _util.wrapBehavior)(this, 'resetStatus'); graph.on('afterchangedata', this.resetHandler); }; // 获取 shape 的 item 对象 EventController.getItemRoot = function (shape) { while (shape && !shape.get('item')) { shape = shape.get('parent'); } return shape; }; /** * 处理 canvas 事件 * @param evt 事件句柄 */ EventController.prototype.onCanvasEvents = function (evt) { var _this = this; var graph = this.graph; var canvas = graph.get('canvas'); var target = evt.target; var eventType = evt.type; switch (eventType) { // solve G's problem: mousemove and mouseup are not triggered with drag and dragend case 'drag': this.onCanvasEvents(Object.assign({}, evt, { type: 'mousemove' })); break; case 'dragend': this.onCanvasEvents(Object.assign({}, evt, { type: 'mouseup' })); break; // solve G's problem: mousedown on other DOMs, mouseup on canvas, click event is triggered unexpectedly case 'mousedown': this.mousedown = true; break; case 'mouseup': // mouseup happend before click, so setTimeout to reset the tag for reference in click event setTimeout(function () { return _this.mousedown = false; }); break; case 'click': // the mousedown is not happend, the click is invalid if (!this.mousedown) return; break; default: break; } /** * (clientX, clientY): 相对于页面的坐标; * (canvasX, canvasY): 相对于 <canvas> 左上角的坐标; * (x, y): 相对于整个画布的坐标, 与 model 的 x, y 是同一维度的。 */ evt.canvasX = evt.x; evt.canvasY = evt.y; var point = { x: evt.canvasX, y: evt.canvasY }; var group = graph.get('group'); var matrix = group.getMatrix(); if (!matrix) { matrix = [1, 0, 0, 0, 1, 0, 0, 0, 1]; } if (isViewportChanged(matrix)) { point = graph.getPointByClient(evt.clientX, evt.clientY); } evt.x = point.x; evt.y = point.y; evt.currentTarget = graph; if (target === canvas) { if (eventType === 'mousemove' || eventType === 'mouseleave') { this.handleMouseMove(evt, 'canvas'); } evt.target = canvas; evt.item = null; graph.emit(eventType, evt); graph.emit("canvas:".concat(eventType), evt); return; } var itemShape = EventController.getItemRoot(target); if (!itemShape) { graph.emit(eventType, evt); return; } var item = itemShape.get('item'); if (item.destroyed) { return; } var type = item.getType(); // 事件target是触发事件的Shape实例,item是触发事件的item实例 evt.target = target; evt.item = item; if (evt.canvasX === evt.x && evt.canvasY === evt.y) { var canvasPoint = graph.getCanvasByPoint(evt.x, evt.y); evt.canvasX = canvasPoint.x; evt.canvasY = canvasPoint.y; } if (evt.name && !evt.name.includes(':')) { graph.emit("".concat(type, ":").concat(eventType), evt); // emit('node:click', evt) graph.emit(eventType, evt); // emit('click', evt); } else if (evt.name) { graph.emit(evt.name, evt); // emit('text-shape:click', evt) } if (eventType === 'dragstart') { this.dragging = true; } if (eventType === 'dragend') { this.dragging = false; } if (eventType === 'mousemove') { this.handleMouseMove(evt, type); } }; /** * 处理扩展事件 * @param evt 事件句柄 */ EventController.prototype.onExtendEvents = function (evt) { this.graph.emit(evt.type, evt); }; /** * 处理滚轮事件 * @param evt 事件句柄 */ EventController.prototype.onWheelEvent = function (evt) { if ((0, _util.isNil)(evt.wheelDelta)) { evt.wheelDelta = -evt.detail; } this.graph.emit('wheel', evt); }; /** * 处理鼠标移动的事件 * @param evt 事件句柄 * @param type item 类型 */ EventController.prototype.handleMouseMove = function (evt, type) { var _a = this, graph = _a.graph, preItem = _a.preItem; var canvas = graph.get('canvas'); var item = evt.target === canvas ? null : evt.item; evt = cloneEvent(evt); // 从前一个item直接移动到当前item,触发前一个item的leave事件 if (preItem && preItem !== item && !preItem.destroyed) { evt.item = preItem; this.emitCustomEvent(preItem.getType(), 'mouseleave', evt); if (this.dragging) { this.emitCustomEvent(preItem.getType(), 'dragleave', evt); } } // 从一个item或canvas移动到当前item,触发当前item的enter事件 if (item && preItem !== item) { evt.item = item; this.emitCustomEvent(type, 'mouseenter', evt); if (this.dragging) { this.emitCustomEvent(type, 'dragenter', evt); } } this.preItem = item; }; /** * 在 graph 上面 emit 事件 * @param itemType item 类型 * @param eventType 事件类型 * @param evt 事件句柄 */ EventController.prototype.emitCustomEvent = function (itemType, eventType, evt) { evt.type = eventType; this.graph.emit("".concat(itemType, ":").concat(eventType), evt); }; EventController.prototype.resetStatus = function () { this.mousedown = false; this.dragging = false; this.preItem = null; }; EventController.prototype.destroy = function () { var _a = this, graph = _a.graph, canvasHandler = _a.canvasHandler, extendEvents = _a.extendEvents; var canvas = graph.get('canvas'); // each(EVENTS, event => { // canvas.off(event, canvasHandler); // }); canvas.off('*', canvasHandler); (0, _util.each)(extendEvents, function (event) { event.remove(); }); this.resetStatus(); this.extendEvents.length = 0; this.canvasHandler = null; this.resetHandler = null; this.destroyed = true; }; return EventController; }(_g6Core.AbstractEvent); var _default = exports.default = EventController;