UNPKG

@antv/g6-pc

Version:

A Graph Visualization Framework in JavaScript

363 lines (362 loc) 13.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _matrixUtil = require("@antv/matrix-util"); var _util = require("@antv/util"); var _browser = require("../util/browser"); var transform = _matrixUtil.ext.transform; var DELTA = 0.05; var _default = exports.default = { getDefaultCfg: function getDefaultCfg() { this.isFireFox = (0, _browser.getBrowserName)() === 'firefox'; return { sensitivity: 2, minZoom: undefined, maxZoom: undefined, enableOptimize: false, optimizeZoom: 0.1, fixSelectedItems: { fixAll: false, fixLineWidth: false, fixLabel: false, fixState: 'selected' }, animate: false, animateCfg: { duration: 500 } }; }, getEvents: function getEvents() { var fixSelectedItems = this.fixSelectedItems; if (!fixSelectedItems.fixState) fixSelectedItems.fixState = 'selected'; if (fixSelectedItems.fixAll) { fixSelectedItems.fixLineWidth = true; fixSelectedItems.fixLabel = true; } return { wheel: 'onWheel', touchstart: 'onTouchStart', touchmove: 'onTouchMove', touchend: 'onTouchEnd' }; }, onTouchStart: function onTouchStart(evt) { var touches = evt.originalEvent.touches; var event1 = touches[0]; var event2 = touches[1]; evt.preventDefault(); // 如果不是缩放事件则禁止继续执行 if (!event2) { return; } if (this.shouldBegin && !this.shouldBegin(evt, this)) { return; } // 第一个触摸点位置 this.startPoint = { pageX: event1.pageX, pageY: event1.pageY }; this.moveable = true; if (event2) { this.endPoint = { pageX: event2.pageX, pageY: event2.pageY }; } this.originScale = this.graph.getZoom() || this.currentScale || 1; }, onTouchMove: function onTouchMove(evt) { if (!this.moveable) { return; } evt.preventDefault(); var touches = evt.originalEvent.touches; var event1 = touches[0]; var event2 = touches[1]; if (!event2) { return; } if (!this.endPoint) { this.endPoint = { pageX: event2.pageX, pageY: event2.pageY }; } // 获取坐标之间的距离 var getDistance = function getDistance(start, end) { return Math.hypot(end.x - start.x, end.y - start.y); }; // 双指缩放比例 var scale = getDistance({ x: event1.pageX, y: event1.pageY }, { x: event2.pageX, y: event2.pageY }) / getDistance({ x: this.startPoint.pageX, y: this.startPoint.pageY }, { x: this.endPoint.pageX, y: this.endPoint.pageY }); // 应用到画布上的缩放比例 var zoom = this.originScale * scale; // 缓存当前的缩放比例 this.currentScale = zoom; var minZoom = this.get('minZoom') || this.graph.get('minZoom'); var maxZoom = this.get('maxZoom') || this.graph.get('maxZoom'); if (zoom > maxZoom || zoom < minZoom) { return; } var animate = this.get('animate'); var animateCfg = this.get('animateCfg'); var canvas = this.graph.get('canvas'); var point = canvas.getPointByClient(evt.clientX, evt.clientY); this.graph.zoomTo(zoom, { x: point.x, y: point.y }, animate, animateCfg); this.graph.emit('wheelzoom', evt); }, onTouchEnd: function onTouchEnd() { this.moveable = false; this.endPoint = null; }, onWheel: function onWheel(e) { var _this = this; var _a = this, graph = _a.graph, fixSelectedItems = _a.fixSelectedItems; if (this.shouldBegin && !this.shouldBegin(e, this)) { return; } if (!this.shouldUpdate(e, this)) { return; } e.preventDefault(); var canvas = graph.get('canvas'); var point = canvas.getPointByClient(e.clientX, e.clientY); var sensitivity = this.get('sensitivity'); var graphZoom = graph.getZoom(); var ratio = graphZoom; var zoom = graphZoom; // 兼容IE、Firefox及Chrome if (this.isFireFox) { if (e.deltaY > 0 || e.wheelDelta < 0) { ratio = 1 - DELTA * sensitivity; } else { ratio = 1 / (1 - DELTA * sensitivity); } } else { if (e.wheelDelta < 0) { ratio = 1 - DELTA * sensitivity; } else { ratio = 1 / (1 - DELTA * sensitivity); } } zoom = graphZoom * ratio; var minZoom = this.get('minZoom') || graph.get('minZoom'); var maxZoom = this.get('maxZoom') || graph.get('maxZoom'); if (zoom > maxZoom) { zoom = maxZoom; } else if (zoom < minZoom) { zoom = minZoom; } // hide the shapes when the zoom ratio is smaller than optimizeZoom // hide the shapes when zoomming var enableOptimize = this.get('enableOptimize'); if (enableOptimize) { var optimizeZoom_1 = this.get('optimizeZoom'); var optimized = this.get('optimized'); var nodes_1 = graph.getNodes(); var edges_1 = graph.getEdges(); var nodesLength_1 = nodes_1.length; var edgesLength_1 = edges_1.length; // hiding if (!optimized) { for (var n = 0; n < nodesLength_1; n++) { var node = nodes_1[n]; if (!node.destroyed) { var children = node.get('group').get('children'); var childrenLength = children.length; for (var c = 0; c < childrenLength; c++) { var shape = children[c]; if (!shape.destoryed && !shape.get('isKeyShape')) { shape.set('ori-visibility', shape.get('ori-visibility') || shape.get('visible')); shape.hide(); } } } } for (var edgeIndex = 0; edgeIndex < edgesLength_1; edgeIndex++) { var edge = edges_1[edgeIndex]; var children = edge.get('group').get('children'); var childrenLength = children.length; for (var c = 0; c < childrenLength; c++) { var shape = children[c]; shape.set('ori-visibility', shape.get('ori-visibility') || shape.get('visible')); shape.hide(); } } this.set('optimized', true); } // showing after 100ms clearTimeout(this.get('timeout')); var timeout = setTimeout(function () { var currentZoom = graph.getZoom(); var curOptimized = _this.get('optimized'); if (curOptimized) { _this.set('optimized', false); for (var n = 0; n < nodesLength_1; n++) { var node = nodes_1[n]; var children = node.get('group').get('children'); var childrenLength = children.length; if (currentZoom < optimizeZoom_1) { var keyShape = node.getKeyShape(); var oriVis = keyShape.get('ori-visibility'); keyShape.set('ori-visibility', undefined); if (oriVis) keyShape.show(); } else { for (var c = 0; c < childrenLength; c++) { var shape = children[c]; var oriVis = shape.get('ori-visibility'); shape.set('ori-visibility', undefined); if (!shape.get('visible') && oriVis) { if (oriVis) shape.show(); } } } } for (var edgeIndex = 0; edgeIndex < edgesLength_1; edgeIndex++) { var edge = edges_1[edgeIndex]; var children = edge.get('group').get('children'); var childrenLength = children.length; if (currentZoom < optimizeZoom_1) { var keyShape = edge.getKeyShape(); var oriVis = keyShape.get('ori-visibility'); keyShape.set('ori-visibility', undefined); if (oriVis) keyShape.show(); } else { for (var c = 0; c < childrenLength; c++) { var shape = children[c]; if (!shape.get('visible')) { var oriVis = shape.get('ori-visibility'); shape.set('ori-visibility', undefined); if (oriVis) shape.show(); } } } } } }, 100); this.set('timeout', timeout); } // fix the items when zooming if (graphZoom <= 1) { var fixNodes = void 0, fixEdges = void 0; if (fixSelectedItems.fixAll || fixSelectedItems.fixLineWidth || fixSelectedItems.fixLabel) { fixNodes = graph.findAllByState('node', fixSelectedItems.fixState); fixEdges = graph.findAllByState('edge', fixSelectedItems.fixState); var scale = graphZoom / zoom; var fixNodesLength = fixNodes.length; for (var fn = 0; fn < fixNodesLength; fn++) { var node = fixNodes[fn]; var group = node.getContainer(); var nodeModel = node.getModel(); var originStyle = node.getOriginStyle(); var itemStateStyle = node.getStateStyle(fixSelectedItems.fixState); var shapeStateStyle = node.get('shapeFactory').getShape(nodeModel.type).getStateStyle(fixSelectedItems.fixState, node)[fixSelectedItems.fixState]; if (fixSelectedItems.fixAll) { if (zoom <= 1) { var groupMatrix = (0, _util.clone)(group.getMatrix()); if (!groupMatrix) groupMatrix = [1, 0, 0, 0, 1, 0, 0, 0, 1]; var _b = node.getModel(), x = _b.x, y = _b.y; groupMatrix = transform(groupMatrix, [['t', -x, -y], ['s', scale, scale], ['t', x, y]]); group.setMatrix(groupMatrix); } } else { var children = group.get('children'); var childrenLength = children.length; for (var c = 0; c < childrenLength; c++) { var shape = children[c]; var fontSize = void 0, lineWidth = void 0; if (fixSelectedItems.fixLabel) { var shapeType = shape.get('type'); if (shapeType === 'text') { fontSize = shape.attr('fontSize') || 12; var itemStyle = itemStateStyle[shape.get('name')]; var shapeStyle = shapeStateStyle[shape.get('name')]; var itemFontSize = itemStyle ? itemStyle.fontSize : 12; var shapeFontSize = shapeStyle ? shapeStyle.fontSize : 12; var oriFontSize = itemFontSize || shapeFontSize || 12; if (zoom <= 1) shape.attr('fontSize', oriFontSize / zoom); // * graphZoom / zoom if (lineWidth) break; } } if (fixSelectedItems.fixLineWidth) { if (shape.get('isKeyShape')) { lineWidth = shape.attr('lineWidth') || 0; var oriLineWidth = itemStateStyle.lineWidth || shapeStateStyle.lineWidth || originStyle.lineWidth || 0; if (zoom <= 1) shape.attr('lineWidth', oriLineWidth / zoom); // * graphZoom / zoom if (fontSize) break; } } } } } var fixEdgesLength = fixEdges.length; for (var fe = 0; fe < fixEdgesLength; fe++) { var edge = fixEdges[fe]; var group = edge.getContainer(); var children = group.get('children'); var nodeModel = edge.getModel(); var itemStateStyle = edge.getStateStyle(fixSelectedItems.fixState); var shapeStateStyle = edge.get('shapeFactory').getShape(nodeModel.type).getStateStyle(fixSelectedItems.fixState, edge)[fixSelectedItems.fixState]; var childrenLength = children.length; for (var c = 0; c < childrenLength; c++) { var shape = children[c]; var fontSize = void 0, lineWidth = void 0; if (fixSelectedItems.fixLabel || fixSelectedItems.fixAll) { var shapeType = shape.get('type'); if (shapeType === 'text') { fontSize = shape.attr('fontSize') || 12; var itemStyle = itemStateStyle[shape.get('name')]; var shapeStyle = shapeStateStyle[shape.get('name')]; var itemFontSize = itemStyle ? itemStyle.fontSize : 12; var shapeFontSize = shapeStyle ? shapeStyle.fontSize : 12; var oriFontSize = itemFontSize || shapeFontSize || 12; if (zoom <= 1) shape.attr('fontSize', oriFontSize / zoom); if (lineWidth) break; } } if (fixSelectedItems.fixLineWidth || fixSelectedItems.fixAll) { if (shape.get('isKeyShape')) { lineWidth = shape.attr('lineWidth') || 0; var oriLineWidth = itemStateStyle.lineWidth || shapeStateStyle.lineWidth || 1; if (zoom <= 1) shape.attr('lineWidth', oriLineWidth / zoom); if (fontSize) break; } } } } } } var animate = this.get('animate'); var animateCfg = this.get('animateCfg'); graph.zoomTo(zoom, { x: point.x, y: point.y }, animate, animateCfg); graph.emit('wheelzoom', e); } };