jjb-lc-designable
Version:
基于alibaba-designable源码二次封装的表单设计器。
39 lines • 1.89 kB
JavaScript
import { DragStopEvent } from '../events';
import { CursorType, CursorDragType } from '../models';
import { calcRectByStartEndPoint, isCrossRectInRect, isRectInRect, Point } from 'jjb-lc-designable/shared';
export const useFreeSelectionEffect = engine => {
engine.subscribeTo(DragStopEvent, event => {
if (engine.cursor.dragType !== CursorDragType.Move) {
return;
}
engine.workbench.eachWorkspace(workspace => {
const viewport = workspace.viewport;
const dragEndPoint = new Point(event.data.topClientX, event.data.topClientY);
const dragStartOffsetPoint = viewport.getOffsetPoint(new Point(engine.cursor.dragStartPosition.topClientX, engine.cursor.dragStartPosition.topClientY));
const dragEndOffsetPoint = viewport.getOffsetPoint(new Point(engine.cursor.position.topClientX, engine.cursor.position.topClientY));
if (!viewport.isPointInViewport(dragEndPoint, false)) return;
const tree = workspace.operation.tree;
const selectionRect = calcRectByStartEndPoint(dragStartOffsetPoint, dragEndOffsetPoint, viewport.dragScrollXDelta, viewport.dragScrollYDelta);
const selected = [];
tree.eachChildren(node => {
const nodeRect = viewport.getValidNodeOffsetRect(node);
if (nodeRect && isCrossRectInRect(selectionRect, nodeRect)) {
// @ts-ignore
selected.push([node, nodeRect]);
}
});
const selectedNodes = selected.reduce((buf, [node, nodeRect]) => {
if (isRectInRect(nodeRect, selectionRect)) {
if (selected.some(([selectNode]) => selectNode.isMyParents(node))) {
return buf;
}
}
return buf.concat(node);
}, []);
workspace.operation.selection.batchSafeSelect(selectedNodes);
});
if (engine.cursor.type === CursorType.Selection) {
engine.cursor.setType(CursorType.Normal);
}
});
};