UNPKG

@antv/g6-pc

Version:

A Graph Visualization Framework in JavaScript

265 lines (264 loc) 7.69 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _tslib = require("tslib"); var _util = _interopRequireDefault(require("../util")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } var isPolygonsIntersect = _util.default.isPolygonsIntersect, pathToPoints = _util.default.pathToPoints; var DEFAULT_TRIGGER = 'shift'; var ALLOW_EVENTS = ['drag', 'shift', 'ctrl', 'alt', 'control']; var isItemIntersecPolygon = function isItemIntersecPolygon(item, polyPoints) { var shapePoints; var shape = item.getKeyShape(); if (item.get('type') === 'path') { shapePoints = pathToPoints(shape.attr('path')); } else { var shapeBBox = shape.getCanvasBBox(); shapePoints = [[shapeBBox.minX, shapeBBox.minY], [shapeBBox.maxX, shapeBBox.minY], [shapeBBox.maxX, shapeBBox.maxY], [shapeBBox.minX, shapeBBox.maxY]]; } return isPolygonsIntersect(polyPoints, shapePoints); }; var _default = exports.default = { getDefaultCfg: function getDefaultCfg() { return { delegateStyle: { fill: '#EEF6FF', fillOpacity: 0.4, stroke: '#DDEEFE', lineWidth: 1 }, onSelect: function onSelect() {}, onDeselect: function onDeselect() {}, shouldDeselect: undefined, selectedState: 'selected', trigger: DEFAULT_TRIGGER, includeEdges: true, selectedEdges: [], selectedNodes: [] // multiple: false, }; }, getEvents: function getEvents() { // 检测输入是否合法 if (!(ALLOW_EVENTS.indexOf(this.trigger.toLowerCase()) > -1)) { this.trigger = DEFAULT_TRIGGER; console.warn("Behavior lasso-select 的 trigger 参数不合法,请输入 'drag'、'shift'、'ctrl' 或 'alt'"); } if (this.trigger === 'drag') { return { dragstart: 'onDragStart', drag: 'onDragMove', dragend: 'onDragEnd', 'canvas:click': 'clearStates' }; } return { dragstart: 'onDragStart', drag: 'onDragMove', dragend: 'onDragEnd', keyup: 'onKeyUp', keydown: 'onKeyDown', 'canvas:click': 'clearStates' }; }, onDragStart: function onDragStart(e) { var lasso = this.lasso; var item = e.item; // 排除在节点上拖动 if (item) { return; } if (this.trigger !== 'drag' && !this.keydown) { return; } if (this.selectedNodes && this.selectedNodes.length !== 0) { this.clearStates('dragstart'); } if (!lasso) { lasso = this.createLasso(); } this.dragging = true; this.originPoint = { x: e.x, y: e.y }; this.points.push(this.originPoint); lasso.show(); }, onDragMove: function onDragMove(e) { if (!this.dragging) { return; } if (this.trigger !== 'drag' && !this.keydown) { return; } this.points.push({ x: e.x, y: e.y }); this.updateLasso(e); }, onDragEnd: function onDragEnd(e) { if (!this.lasso && !this.dragging) { return; } if (this.trigger !== 'drag' && !this.keydown) { return; } this.points.push(this.originPoint); this.getSelectedItems(); this.lasso.remove(true); this.lasso = null; this.points = []; this.dragging = false; }, getLassoPath: function getLassoPath() { var points = this.points; var path = []; if (points.length) { points.forEach(function (point, index) { if (index === 0) { path.push(['M', point.x, point.y]); } else { path.push(['L', point.x, point.y]); } }); path.push(['L', points[0].x, points[0].y]); } return path; }, clearStates: function clearStates(action) { if (action === void 0) { action = 'canvas:click'; } var _a = this, graph = _a.graph, selectedState = _a.selectedState, shouldDeselect = _a.shouldDeselect; var nodes = graph.findAllByState('node', selectedState); var edges = graph.findAllByState('edge', selectedState); if (!shouldDeselect || shouldDeselect({ action: action, nodes: nodes, edges: edges })) { nodes.forEach(function (node) { return graph.setItemState(node, selectedState, false); }); edges.forEach(function (edge) { return graph.setItemState(edge, selectedState, false); }); } if (this.onDeselect) { this.onDeselect(this.selectedNodes, this.selectedEdges); } this.selectedNodes = []; this.selectedEdges = []; graph.emit('nodeselectchange', { selectedItems: { nodes: [], edges: [] }, select: false }); }, getSelectedItems: function getSelectedItems() { var _this = this; var _a = this, graph = _a.graph, shouldUpdate = _a.shouldUpdate; var lassoContour = this.points.map(function (point) { return [graph.getCanvasByPoint(point.x, point.y).x, graph.getCanvasByPoint(point.x, point.y).y]; }); var state = this.selectedState; var selectedNodes = []; var selectedIds = []; graph.getNodes().forEach(function (node) { if (!node.isVisible()) return; // 隐藏节点不能被选中 if (isItemIntersecPolygon(node, lassoContour)) { if (shouldUpdate(node, 'select', _this)) { selectedNodes.push(node); var model = node.getModel(); selectedIds.push(model.id); graph.setItemState(node, state, true); } } }); var selectedEdges = []; if (this.includeEdges) { // 选中边,边的source和target都在选中的节点中时才选中 selectedNodes.forEach(function (node) { var edges = node.getOutEdges(); edges.forEach(function (edge) { if (!edge.isVisible()) return; // 隐藏边不能够被选中 var model = edge.getModel(); var source = model.source, target = model.target; if (selectedIds.includes(source) && selectedIds.includes(target) && shouldUpdate(edge, 'select', _this)) { selectedEdges.push(edge); graph.setItemState(edge, _this.selectedState, true); } }); }); } this.selectedEdges = selectedEdges; this.selectedNodes = selectedNodes; if (this.onSelect) { this.onSelect(selectedNodes, selectedEdges); } graph.emit('nodeselectchange', { selectedItems: { nodes: selectedNodes, edges: selectedEdges }, select: true }); }, createLasso: function createLasso() { var self = this; var lasso = self.graph.get('delegateGroup').addShape('path', { attrs: (0, _tslib.__assign)({ path: [] }, self.delegateStyle), capture: false, name: 'lasso-shape' }); this.lasso = lasso; this.delegate = lasso; this.points = []; return lasso; }, updateLasso: function updateLasso(e) { var self = this; this.lasso.attr({ path: self.getLassoPath() }); }, onKeyDown: function onKeyDown(e) { var code = e.key; if (!code) { return; } // if (this.selectedNodes && this.selectedNodes.length !== 0) { // this.clearStates(); // } if (code.toLowerCase() === this.trigger.toLowerCase()) { this.keydown = true; } else { this.keydown = false; } }, onKeyUp: function onKeyUp() { if (this.lasso) { // 清除所有选中状态后,设置拖得动状态为false,并清除框选的lasso this.lasso.remove(true); this.lasso = null; this.points = []; this.dragging = false; } this.keydown = false; } };