feat: support modify dragObject

This commit is contained in:
peidan.cpd 2021-12-14 15:22:44 +08:00
parent 75c329bcb4
commit 240387f5b4

View File

@ -7,6 +7,8 @@ import { Node, DocumentModel } from '../document';
import { ISimulatorHost, isSimulatorHost, NodeInstance, ComponentInstance } from '../simulator'; import { ISimulatorHost, isSimulatorHost, NodeInstance, ComponentInstance } from '../simulator';
import { Designer } from './designer'; import { Designer } from './designer';
export type DragObjectReducer = (dragObject: DragObject) => DragObject;
export interface LocateEvent { export interface LocateEvent {
readonly type: 'LocateEvent'; readonly type: 'LocateEvent';
/** /**
@ -193,7 +195,7 @@ function isDragEvent(e: any): e is DragEvent {
*/ */
export class Dragon { export class Dragon {
private sensors: ISensor[] = []; private sensors: ISensor[] = [];
private dragObjectTransducers: DragObjectReducer[] = [];
/** /**
* current active sensor, * current active sensor,
*/ */
@ -243,16 +245,41 @@ export class Dragon {
}; };
} }
/**
* change dragObject
*
* @param fn
*/
addDragObjectReducer(fn: DragObjectReducer) {
this.dragObjectTransducers.push(fn);
}
transformDragObject(dragObject: DragObject) {
if (!this.dragObjectTransducers?.length) {
return dragObject;
}
return this.dragObjectTransducers.reduce((preDragObject, reducer) => {
try {
return reducer(preDragObject);
} catch (e) {
console.warn(e);
return preDragObject;
}
}, dragObject);
}
/** /**
* boost your dragObject for dragging(flying) * boost your dragObject for dragging(flying)
* *
* @param dragObject * @param dragObject
* @param boostEvent * @param boostEvent
*/ */
boost(dragObject: DragObject, boostEvent: MouseEvent | DragEvent, fromRglNode?: Node) { boost(dragObjectWrap: DragObject, boostEvent: MouseEvent | DragEvent, fromRglNode?: Node) {
const { designer } = this; const { designer } = this;
const masterSensors = this.getMasterSensors(); const masterSensors = this.getMasterSensors();
const handleEvents = makeEventsHandler(boostEvent, masterSensors); const handleEvents = makeEventsHandler(boostEvent, masterSensors);
const dragObject = this.transformDragObject(dragObjectWrap);
const newBie = !isDragNodeObject(dragObject); const newBie = !isDragNodeObject(dragObject);
const forceCopyState = const forceCopyState =
isDragNodeObject(dragObject) && dragObject.nodes.some((node) => node.isSlot()); isDragNodeObject(dragObject) && dragObject.nodes.some((node) => node.isSlot());