UNPKG

@antv/g6

Version:

graph visualization frame work

188 lines (168 loc) 5.09 kB
/* * @Author: moyee * @Date: 2019-07-31 14:36:15 * @LastEditors: moyee * @LastEditTime: 2019-08-23 11:13:43 * @Description: 拖动群组 */ const deepMix = require('@antv/util/lib/deep-mix'); const body = document.body; const delegateStyle = { fill: '#F3F9FF', fillOpacity: 0.5, stroke: '#1890FF', strokeOpacity: 0.9, lineDash: [ 5, 5 ] }; module.exports = { getDefaultCfg() { return { delegate: true, delegateStyle: {}, delegateShapes: {}, delegateShapeBBoxs: {} }; }, getEvents() { return { dragstart: 'onDragStart', drag: 'onDrag', dragend: 'onDragEnd', 'canvas:mouseleave': 'onOutOfRange' }; }, onDragStart(evt) { const { target } = evt; // 获取拖动的group的ID,如果拖动的不是group,则直接return const groupId = target.get('groupId'); if (!groupId) { return false; } const graph = this.graph; const customGroupControll = graph.get('customGroupControll'); const customGroup = customGroupControll.customGroup; const currentGroup = customGroup[groupId].nodeGroup; this.targetGroup = currentGroup; this.mouseOrigin = { x: evt.canvasX, y: evt.canvasY }; // 获取groupId的父Group的ID const { groups } = graph.save(); let parentGroupId = null; for (const group of groups) { if (groupId !== group.id) { continue; } parentGroupId = group.parentId; break; } if (parentGroupId) { const parentGroup = customGroup[parentGroupId].nodeGroup; customGroupControll.setGroupStyle(parentGroup.get('keyShape'), 'hover'); } }, onDrag(evt) { if (!this.mouseOrigin) { return false; } this._updateDelegate(evt); }, onDragEnd(evt) { // 删除delegate shape const groupId = evt.target.get('groupId'); if (this.delegateShapes[groupId]) { this.delegateShapeBBox = this.delegateShapes[groupId].getBBox(); this.delegateShapes[groupId].remove(); delete this.delegateShapes[groupId]; } if (!this.delegateShapeBBox) { return false; } const graph = this.graph; const autoPaint = graph.get('autoPaint'); graph.setAutoPaint(false); // 修改群组位置 const customGroupControll = graph.get('customGroupControll'); const delegateShapeBBoxs = this.delegateShapeBBoxs[groupId]; customGroupControll.updateGroup(groupId, delegateShapeBBoxs); graph.setAutoPaint(autoPaint); graph.paint(); this.mouseOrigin = null; this.shapeOrigin = null; customGroupControll.resetNodePoint(); this.delegateShapeBBox = null; }, _updateDelegate(evt) { const self = this; const groupId = evt.target.get('groupId'); const item = this.targetGroup.get('keyShape'); const graph = this.graph; const autoPaint = graph.get('autoPaint'); graph.setAutoPaint(false); let delegateShape = self.delegateShapes[groupId]; const groupBbox = item.getBBox(); const delegateType = item.get('type'); if (!delegateShape) { const delegateGroup = graph.get('delegateGroup'); const { width, height } = groupBbox; const x = evt.canvasX - width / 2; const y = evt.canvasY - height / 2; const attrs = { width, height, x, y, ...deepMix({}, delegateStyle, this.delegateStyle) }; // 如果delegate是circle if (delegateType === 'circle') { const cx = evt.canvasX; // (width + 2 * x) / 2; const cy = evt.canvasY; // (height + 2 * y) / 2; const r = width > height ? width / 2 : height / 2; delegateShape = delegateGroup.addShape('circle', { attrs: { x: cx, y: cy, r, ...deepMix({}, delegateStyle, this.delegateStyle) } }); self.shapeOrigin = { x: cx, y: cy }; } else { delegateShape = delegateGroup.addShape('rect', { attrs }); self.shapeOrigin = { x: attrs.x, y: attrs.y }; } // delegateShape.set('capture', false); self.delegateShapes[groupId] = delegateShape; self.delegateShapeBBoxs[groupId] = delegateShape.getBBox(); } else { const { mouseOrigin, shapeOrigin } = self; const deltaX = evt.canvasX - mouseOrigin.x; const deltaY = evt.canvasY - mouseOrigin.y; const x = deltaX + shapeOrigin.x; const y = deltaY + shapeOrigin.y; // 将Canvas坐标转成视口坐标 const point = graph.getPointByCanvas(x, y); delegateShape.attr({ x: point.x, y: point.y }); self.delegateShapeBBoxs[groupId] = delegateShape.getBBox(); } graph.paint(); graph.setAutoPaint(autoPaint); }, onOutOfRange(e) { const self = this; if (this.origin) { const canvasElement = self.graph.get('canvas').get('el'); const fn = ev => { if (ev.target !== canvasElement) { self.onDragEnd(e); } }; this.fn = fn; body.addEventListener('mouseup', fn, false); } } };