mirror of
https://gitee.com/antv/g6.git
synced 2024-12-05 05:09:07 +08:00
feat(minimap): add delegate view type for minimap
This commit is contained in:
parent
38a26a5f87
commit
279aa683fa
@ -78,7 +78,7 @@ G6.registerNode('tree-node', {
|
|||||||
return rect;
|
return rect;
|
||||||
}
|
}
|
||||||
}, 'single-shape');
|
}, 'single-shape');
|
||||||
const minimap = new Minimap({ size: [200, 150] });
|
const minimap = new Minimap({ size: [200, 150], type: 'delegate', delegateStyle: { fill: '#fff', stroke: '#666' } });
|
||||||
const graph = new G6.TreeGraph({
|
const graph = new G6.TreeGraph({
|
||||||
container: 'mountNode',
|
container: 'mountNode',
|
||||||
width: 800,
|
width: 800,
|
||||||
|
@ -8,6 +8,10 @@ const each = require('@antv/util/lib/each');
|
|||||||
|
|
||||||
const max = Math.max;
|
const max = Math.max;
|
||||||
|
|
||||||
|
const DEFAULT_MODE = 'default';
|
||||||
|
const KEYSHAPE_MODE = 'keyShape';
|
||||||
|
const DELEGATE_MODE = 'delegate';
|
||||||
|
|
||||||
class Minimap extends Base {
|
class Minimap extends Base {
|
||||||
init(graph) {
|
init(graph) {
|
||||||
super.init(graph);
|
super.init(graph);
|
||||||
@ -18,8 +22,12 @@ class Minimap extends Base {
|
|||||||
container: null,
|
container: null,
|
||||||
className: 'g6-minimap',
|
className: 'g6-minimap',
|
||||||
viewportClassName: 'g6-minimap-viewport',
|
viewportClassName: 'g6-minimap-viewport',
|
||||||
keyShapeOnly: false,
|
type: 'default', // 可选 default, delegate, keyShape
|
||||||
size: [ 200, 120 ]
|
size: [ 200, 120 ],
|
||||||
|
delegateStyle: {
|
||||||
|
fill: '#40a9ff',
|
||||||
|
stroke: '#096dd9'
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
getEvents() {
|
getEvents() {
|
||||||
@ -132,11 +140,19 @@ class Minimap extends Base {
|
|||||||
const size = this.get('size');
|
const size = this.get('size');
|
||||||
const graph = this.get('graph');
|
const graph = this.get('graph');
|
||||||
const canvas = this.get('canvas');
|
const canvas = this.get('canvas');
|
||||||
// 根据cfgs更新画布内容
|
const type = this.get('type');
|
||||||
if (this.get('keyShapeOnly')) {
|
switch (type) {
|
||||||
this._updateKeyShapes();
|
case DEFAULT_MODE:
|
||||||
} else {
|
this._updateGraphShapes();
|
||||||
this._updateGraphShapes();
|
break;
|
||||||
|
case KEYSHAPE_MODE:
|
||||||
|
this._updateKeyShapes();
|
||||||
|
break;
|
||||||
|
case DELEGATE_MODE:
|
||||||
|
this._updateDelegateShapes();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
this._updateGraphShapes();
|
||||||
}
|
}
|
||||||
const bbox = canvas.getBBox();
|
const bbox = canvas.getBBox();
|
||||||
// 刷新后bbox可能会变,需要重置画布矩阵以缩放到合适的大小
|
// 刷新后bbox可能会变,需要重置画布矩阵以缩放到合适的大小
|
||||||
@ -161,12 +177,8 @@ class Minimap extends Base {
|
|||||||
const canvas = this.get('canvas');
|
const canvas = this.get('canvas');
|
||||||
const group = canvas.get('children')[0] || canvas.addGroup();
|
const group = canvas.get('children')[0] || canvas.addGroup();
|
||||||
const nodes = graph.getNodes();
|
const nodes = graph.getNodes();
|
||||||
const edges = graph.getEdges();
|
|
||||||
group.clear();
|
group.clear();
|
||||||
// 边可以直接使用keyShape
|
this._getGraphEdgeKeyShape(group);
|
||||||
each(edges, edge => {
|
|
||||||
group.add(edge.get('keyShape').clone());
|
|
||||||
});
|
|
||||||
// 节点需要group配合keyShape
|
// 节点需要group配合keyShape
|
||||||
each(nodes, node => {
|
each(nodes, node => {
|
||||||
const parent = group.addGroup();
|
const parent = group.addGroup();
|
||||||
@ -183,6 +195,33 @@ class Minimap extends Base {
|
|||||||
clonedGroup.resetMatrix();
|
clonedGroup.resetMatrix();
|
||||||
canvas.get('children')[0] = clonedGroup;
|
canvas.get('children')[0] = clonedGroup;
|
||||||
}
|
}
|
||||||
|
// 将主图上的node用
|
||||||
|
_updateDelegateShapes() {
|
||||||
|
const graph = this._cfgs.graph;
|
||||||
|
const canvas = this.get('canvas');
|
||||||
|
const group = canvas.get('children')[0] || canvas.addGroup();
|
||||||
|
const delegateStyle = this.get('delegateStyle');
|
||||||
|
group.clear();
|
||||||
|
this._getGraphEdgeKeyShape(group);
|
||||||
|
each(graph.getNodes(), node => {
|
||||||
|
const bbox = node.getBBox();
|
||||||
|
group.addShape('rect', {
|
||||||
|
attrs: {
|
||||||
|
x: bbox.minX,
|
||||||
|
y: bbox.minY,
|
||||||
|
width: bbox.width,
|
||||||
|
height: bbox.height,
|
||||||
|
...delegateStyle
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
_getGraphEdgeKeyShape(group) {
|
||||||
|
const graph = this.get('graph');
|
||||||
|
each(graph.getEdges(), edge => {
|
||||||
|
group.add(edge.get('keyShape').clone());
|
||||||
|
});
|
||||||
|
}
|
||||||
// 绘制minimap视口
|
// 绘制minimap视口
|
||||||
_updateViewport(ratio, dx, dy) {
|
_updateViewport(ratio, dx, dy) {
|
||||||
const graph = this.get('graph');
|
const graph = this.get('graph');
|
||||||
|
@ -122,6 +122,25 @@ describe('minimap', () => {
|
|||||||
}, 50);
|
}, 50);
|
||||||
}, 50);
|
}, 50);
|
||||||
});
|
});
|
||||||
|
it('delegate type of minimap', () => {
|
||||||
|
const minimap = new Minimap({ size: [ 200, 200 ], type: 'delegate', delegateStyle: { fill: '#fff' } });
|
||||||
|
const graph = new G6.Graph({
|
||||||
|
container: div,
|
||||||
|
width: 500,
|
||||||
|
height: 500,
|
||||||
|
plugins: [ minimap ]
|
||||||
|
});
|
||||||
|
const nodeBBox = graph.addItem('node', { id: 'node', x: 100, y: 100, size: 16 }).getBBox();
|
||||||
|
const canvas = minimap.getCanvas();
|
||||||
|
const delegateShape = canvas.get('children')[0].get('children')[0];
|
||||||
|
expect(delegateShape.attr('x')).to.equal(nodeBBox.minX);
|
||||||
|
expect(delegateShape.attr('y')).to.equal(nodeBBox.minY);
|
||||||
|
expect(delegateShape.attr('width')).to.equal(nodeBBox.width);
|
||||||
|
expect(delegateShape.attr('height')).to.equal(nodeBBox.height);
|
||||||
|
expect(delegateShape.attr('fill')).to.equal('#fff');
|
||||||
|
expect(delegateShape.attr('stroke')).to.equal('#096dd9');
|
||||||
|
graph.destroy();
|
||||||
|
});
|
||||||
it('minimap container', () => {
|
it('minimap container', () => {
|
||||||
const minimap = new Minimap({ container, size: [ 200, 200 ], className: 'test-className' });
|
const minimap = new Minimap({ container, size: [ 200, 200 ], className: 'test-className' });
|
||||||
const graph = new G6.Graph({
|
const graph = new G6.Graph({
|
||||||
@ -147,7 +166,7 @@ describe('minimap', () => {
|
|||||||
graph.destroy();
|
graph.destroy();
|
||||||
});
|
});
|
||||||
it('keyShapeOnly minimap', () => {
|
it('keyShapeOnly minimap', () => {
|
||||||
const minimap = new Minimap({ size: [ 200, 200 ], keyShapeOnly: true });
|
const minimap = new Minimap({ size: [ 200, 200 ], type: 'keyShape' });
|
||||||
const graph = new G6.Graph({
|
const graph = new G6.Graph({
|
||||||
container: div,
|
container: div,
|
||||||
width: 500,
|
width: 500,
|
||||||
|
Loading…
Reference in New Issue
Block a user