StructV2/src/BehaviorHelper/initG6Behaviors.ts
2022-04-13 20:27:44 +08:00

118 lines
3.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { Graph, INode, Modes } from "@antv/g6";
import { Engine } from "../engine";
import { SVModel } from "../Model/SVModel";
import { SVNode } from "../Model/SVNode";
import { ViewContainer } from "../View/viewContainer";
import { DetermineNodeDrag } from "./behaviorIssueHelper";
/**
* 初始化g6 交互options
* @param optionsTable
* @returns
*/
export function InitG6Behaviors(engine: Engine, viewContainer: ViewContainer): Modes {
const dragNodeFilter = event => {
let g6Item = event.item,
node: SVNode = g6Item.SVModel;
if (g6Item === null || node.isNode() === false) {
return false;
}
const enableDrag = DetermineNodeDrag(viewContainer.getLayoutGroupTable(), node, viewContainer.brushSelectedModels);
if(enableDrag === false) {
return false;
}
// 在拖拽某个节点前先处理一下上次点击选中的节点不然会上次选中的节点会跟着一起拖产生bug
if(viewContainer.clickSelectNode) {
const isPrevSelectInBrush = viewContainer.brushSelectedModels.find(item => item.id === viewContainer.clickSelectNode.id);
if(isPrevSelectInBrush === undefined) {
viewContainer.clickSelectNode.setSelectedState(false);
viewContainer.clickSelectNode = null;
}
}
// 这里之所以要把节点和其 appendages 的选中状态设置为true是因为 g6 处理拖拽节点的逻辑是将所以已选中的元素一起拖动,
// 这样 appendages 就可以很自然地跟着节点动(我是看源码才知道的)
node.setSelectedState(true);
node.getAppendagesList().forEach(item => {
item.setSelectedState(true);
});
return true;
};
const selectNodeFilter = event => {
let g6Item = event.item;
if(g6Item === null) {
return false
}
let node: SVNode = g6Item.SVModel;
if (node.isNode() === false) {
return false;
}
viewContainer.clickSelectNode = node;
return true;
};
const brushSelectNodeFilter = G6Item => {
const model: SVModel = G6Item.SVModel;
// 泄漏的元素不能被框选
if (model.leaked || model.isNode() === false) {
return false;
}
model.setSelectedState(true);
return true;
};
// --------------------------------------------------------------------------------
const dragNode = {
type: 'drag-node',
shouldBegin: dragNodeFilter
};
const dragCanvas = {
type: 'drag-canvas'
};
const zoomCanvas = {
type: 'zoom-canvas'
};
const clickSelect = {
type: 'click-select',
multiple: false,
shouldBegin: selectNodeFilter
};
const brushSelect = {
type: 'brush-select',
trigger: 'drag',
includeEdges: false,
shouldUpdate: brushSelectNodeFilter
}
return {
default: [dragNode, dragCanvas, clickSelect],
brush: [brushSelect, dragNode]
};
}