mirror of
https://github.com/projectstorm/react-diagrams.git
synced 2025-08-06 14:49:40 +08:00
58 lines
1.5 KiB
TypeScript
58 lines
1.5 KiB
TypeScript
import { CanvasEngine } from '../CanvasEngine';
|
|
import { AbstractDisplacementState, AbstractDisplacementStateEvent } from '../core-state/AbstractDisplacementState';
|
|
import { State } from '../core-state/State';
|
|
|
|
export interface DragCanvasStateOptions {
|
|
/**
|
|
* If enabled, the canvas is available to drag
|
|
*/
|
|
allowDrag?: boolean;
|
|
}
|
|
|
|
export class DragCanvasState<E extends CanvasEngine = CanvasEngine> extends AbstractDisplacementState<E> {
|
|
// store this as we drag the canvas
|
|
initialCanvasX: number;
|
|
initialCanvasY: number;
|
|
config: DragCanvasStateOptions;
|
|
|
|
constructor(options: DragCanvasStateOptions = {}) {
|
|
super({
|
|
name: 'drag-canvas'
|
|
});
|
|
this.config = {
|
|
allowDrag: true,
|
|
...options
|
|
};
|
|
}
|
|
|
|
async activated(prev) {
|
|
super.activated(prev);
|
|
this.engine.getModel().clearSelection();
|
|
await this.engine.repaintCanvas(true);
|
|
|
|
// we can block layer rendering because we are only targeting the transforms
|
|
for (let layer of this.engine.getModel().getLayers()) {
|
|
layer.allowRepaint(false);
|
|
}
|
|
|
|
this.initialCanvasX = this.engine.getModel().getOffsetX();
|
|
this.initialCanvasY = this.engine.getModel().getOffsetY();
|
|
}
|
|
|
|
deactivated(next: State) {
|
|
super.deactivated(next);
|
|
for (let layer of this.engine.getModel().getLayers()) {
|
|
layer.allowRepaint(true);
|
|
}
|
|
}
|
|
|
|
fireMouseMoved(event: AbstractDisplacementStateEvent) {
|
|
if (this.config.allowDrag) {
|
|
this.engine
|
|
.getModel()
|
|
.setOffset(this.initialCanvasX + event.displacementX, this.initialCanvasY + event.displacementY);
|
|
this.engine.repaintCanvas();
|
|
}
|
|
}
|
|
}
|