@antv/g6
Version:
A Graph Visualization Framework in JavaScript
83 lines (69 loc) • 2.02 kB
text/typescript
import { Path } from '@antv/g';
import type { IPointerEvent, Point } from '../types';
import { pointsToPath } from '../utils/path';
import type { BrushSelectOptions } from './brush-select';
import { BrushSelect, getCursorPoint } from './brush-select';
/**
* <zh/> 套索选择交互配置项
*
* <en/> Lasso select behavior options
*/
export interface LassoSelectOptions extends BrushSelectOptions {}
/**
* <zh/> 套索选择交互
*
* <en/> Lasso select behavior
* @remarks
* <zh/> 用不规则多边形框选一组元素。
*
* <en/> Select a group of elements with an irregular polygon.
*/
export class LassoSelect extends BrushSelect {
private points?: Point[];
private pathShape?: Path;
/**
* Triggered when the mouse is pressed
* @param event - mouse event
* @internal
*/
protected onPointerDown(event: IPointerEvent) {
if (!super.validate(event) || !super.isKeydown() || this.points) return;
const { canvas } = this.context;
this.pathShape = new Path({
id: 'g6-lasso-select',
style: this.options.style,
});
canvas.appendChild(this.pathShape);
this.points = [getCursorPoint(event)];
}
/**
* Triggered when the mouse is moved
* @param event - mouse event
* @internal
*/
protected onPointerMove(event: IPointerEvent) {
if (!this.points) return;
const { immediately, mode } = this.options;
this.points.push(getCursorPoint(event));
this.pathShape?.setAttribute('d', pointsToPath(this.points));
if (immediately && mode === 'default' && this.points.length > 2) super.updateElementsStates(this.points);
}
/**
* Triggered when the mouse is released
* @internal
*/
protected onPointerUp() {
if (!this.points) return;
if (this.points.length < 2) {
this.clearLasso();
return;
}
super.updateElementsStates(this.points);
this.clearLasso();
}
private clearLasso() {
this.pathShape?.remove();
this.pathShape = undefined;
this.points = undefined;
}
}