UNPKG

jjb-lc-designable

Version:

基于alibaba-designable源码二次封装的表单设计器。

39 lines 1.89 kB
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); } }); };