fix: 修复free面板的一些bug

This commit is contained in:
黎智洲 2021-08-19 23:46:31 +08:00
parent 374bff38ff
commit fd63576b57
6 changed files with 64 additions and 20 deletions

View File

@ -18,7 +18,7 @@ SV.registerLayouter('LinkList', {
element: { element: {
default: { default: {
type: 'link-list-node', type: 'link-list-node',
label: '[data]', label: '[id]',
size: [60, 30], size: [60, 30],
style: { style: {
stroke: '#333', stroke: '#333',

View File

@ -91,7 +91,7 @@
"LinkStack0": { "LinkStack0": {
"data": [ "data": [
{ id: 6, next: 7 }, { id: 6, next: 7 },
{ id: 7, next: 8 }, { id: 7, next: 8, freed: true },
{ id: 8, external: 'h', data: '66' } { id: 8, external: 'h', data: '66' }
], ],
"layouter": "LinkList" "layouter": "LinkList"
@ -100,7 +100,7 @@
"LinkStack0": { "LinkStack0": {
"data": [ "data": [
{ id: 6, next: 7 }, { id: 6, next: 7 },
{ id: 7, next: 8 }, { id: 7, next: 8, freed: true },
{ id: 8, freed: true, external: 'h' } { id: 8, freed: true, external: 'h' }
], ],
"layouter": "LinkList" "layouter": "LinkList"

2
dist/sv.js vendored

File diff suppressed because one or more lines are too long

View File

@ -7,6 +7,7 @@ import { g6Behavior, Renderer } from "../renderer";
export class Container { export class Container {
protected engine: Engine; protected engine: Engine;
protected DOMContainer: HTMLElement; // 可视化视图容器 protected DOMContainer: HTMLElement; // 可视化视图容器

View File

@ -1,3 +1,6 @@
import { BoundingRect } from "../../Common/boundingRect";
import { Group } from "../../Common/group";
import { Model } from "../../Model/modelData";
import { Container } from "./container"; import { Container } from "./container";
/** /**
@ -5,6 +8,35 @@ import { Container } from "./container";
*/ */
export class FreedContainer extends Container { export class FreedContainer extends Container {
/**
*
* @param freedModels
*/
fitCenter(freedModels: Model[]) {
freedModels.forEach(item => {
item.G6Item = item.shadowG6Item;
});
let width = this.getG6Instance().getWidth(),
height = this.getG6Instance().getHeight(),
group = new Group();
group.add(...freedModels);
let viewBound: BoundingRect = group.getBound(),
centerX = width / 2, centerY = height / 2,
boundCenterX = viewBound.x + viewBound.width / 2,
boundCenterY = viewBound.y + viewBound.height / 2,
dx = centerX - boundCenterX,
dy = centerY - boundCenterY;
group.translate(dx, dy);
freedModels.forEach(item => {
item.G6Item = item.renderG6Item;
});
}
protected initBehaviors(): string[] { protected initBehaviors(): string[] {
return []; return [];
} }

View File

@ -12,15 +12,17 @@ import { Util } from "../Common/util";
import { EventBus } from "../Common/eventBus"; import { EventBus } from "../Common/eventBus";
export class ViewManager { export class ViewManager {
private engine: Engine; private engine: Engine;
private layouter: Layouter; private layouter: Layouter;
private mainContainer: Container; private mainContainer: Container;
private freedContainer: Container; private freedContainer: FreedContainer;
private leakContainer: Container; private leakContainer: LeakContainer;
private prevLayoutGroupTable: LayoutGroupTable; private prevLayoutGroupTable: LayoutGroupTable;
private prevModelList: Model[]; private prevModelList: Model[];
private prevFreedElements: Element[];
private shadowG6Instance; private shadowG6Instance;
@ -29,6 +31,7 @@ export class ViewManager {
this.layouter = new Layouter(engine); this.layouter = new Layouter(engine);
this.mainContainer = new MainContainer(engine, DOMContainer, { tooltip: true }); this.mainContainer = new MainContainer(engine, DOMContainer, { tooltip: true });
this.prevLayoutGroupTable = new Map(); this.prevLayoutGroupTable = new Map();
this.prevFreedElements = [];
this.prevModelList = []; this.prevModelList = [];
const options: EngineOptions = this.engine.engineOptions; const options: EngineOptions = this.engine.engineOptions;
@ -64,7 +67,7 @@ export class ViewManager {
* @param prevLayoutGroup * @param prevLayoutGroup
*/ */
private handleFreedLabel(freedElement: Element[], prevLayoutGroup: LayoutGroup) { private handleFreedLabel(freedElement: Element[], prevLayoutGroup: LayoutGroup) {
if(prevLayoutGroup === undefined) { if (prevLayoutGroup === undefined) {
return; return;
} }
@ -91,14 +94,24 @@ export class ViewManager {
removeModels: Model[] = []; removeModels: Model[] = [];
layoutGroupTable.forEach((group, key) => { layoutGroupTable.forEach((group, key) => {
let targetElements: Element[] = group.element.filter(item => item.freed); let targetElements: Element[] = group.element.filter(item => item.freed),
newFreedNode = null;
// 找出最新的freed节点防止上一次的freed节点被遗留在该次渲染此时会出现大于一个freed节点
targetElements.forEach(item => {
if (this.prevFreedElements.find(prevEle => prevEle.id === item.id) === undefined) {
newFreedNode = item;
}
});
if (targetElements.length) { if (targetElements.length) {
freedGroupName = key; freedGroupName = key;
freedElements = targetElements; freedElements = [newFreedNode];
} }
}); });
freedGroup = layoutGroupTable.get(freedGroupName); freedGroup = layoutGroupTable.get(freedGroupName);
freedElements.forEach(fItem => { freedElements.forEach(fItem => {
@ -119,6 +132,7 @@ export class ViewManager {
}); });
this.handleFreedLabel(freedElements, prevLayoutGroupTable.get(freedGroupName)); this.handleFreedLabel(freedElements, prevLayoutGroupTable.get(freedGroupName));
this.prevFreedElements = freedElements;
return [...freedElements, ...freedMarkers]; return [...freedElements, ...freedMarkers];
} }
@ -223,7 +237,7 @@ export class ViewManager {
let modelList = Util.convertGroupTable2ModelList(layoutGroupTable), let modelList = Util.convertGroupTable2ModelList(layoutGroupTable),
leakModelList = [], leakModelList = [],
freedList = []; freedModelList = [];
this.build(modelList); this.build(modelList);
@ -235,25 +249,22 @@ export class ViewManager {
// 进行布局设置model的xy // 进行布局设置model的xy
this.layouter.layoutAll(this.mainContainer, layoutGroupTable); this.layouter.layoutAll(this.mainContainer, layoutGroupTable);
freedList = this.getFreedModelList(this.prevLayoutGroupTable, layoutGroupTable); freedModelList = this.getFreedModelList(this.prevLayoutGroupTable, layoutGroupTable);
if (this.freedContainer && freedList.length) { if (this.freedContainer && freedModelList.length) {
EventBus.emit('onFreed', freedList); this.freedContainer.fitCenter(freedModelList);
this.freedContainer.render(freedList); this.freedContainer.render(freedModelList);
EventBus.emit('onFreed', freedModelList);
} }
// 从新获取一次因为第一次获取没有把freed节点筛选出去 // 从新获取一次因为第一次获取没有把freed节点筛选出去
modelList = Util.convertGroupTable2ModelList(layoutGroupTable); modelList = Util.convertGroupTable2ModelList(layoutGroupTable);
this.mainContainer.render(modelList); this.mainContainer.render(modelList);
if (this.leakContainer) { if (this.leakContainer && leakModelList.length) {
this.mainContainer.afterRemoveModels(() => {});
this.leakContainer.render(leakModelList); this.leakContainer.render(leakModelList);
if (leakModelList.length) {
EventBus.emit('onLeak', leakModelList); EventBus.emit('onLeak', leakModelList);
} }
}
this.prevLayoutGroupTable = layoutGroupTable; this.prevLayoutGroupTable = layoutGroupTable;
this.prevModelList = modelList; this.prevModelList = modelList;