UNPKG

@logicflow/core

Version:

LogicFlow, help you quickly create flowcharts

175 lines (174 loc) 8.66 kB
var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; import { jsx as _jsx } from "preact/jsx-runtime"; import { Component } from 'preact/compat'; import { observer } from '../..'; import { EventType } from '../../constant'; import { StepDrag } from '../../util'; var CanvasOverlay = /** @class */ (function (_super) { __extends(CanvasOverlay, _super); function CanvasOverlay(props) { var _this = _super.call(this) || this; _this.stepScrollX = 0; _this.stepScrollY = 0; // get InjectedProps() { // return this.props as InjectedProps; // } _this.onDragging = function (_a) { var deltaX = _a.deltaX, deltaY = _a.deltaY; _this.setState({ isDragging: true, }); var _b = _this.props.graphModel, transformModel = _b.transformModel, editConfigModel = _b.editConfigModel; if (editConfigModel.stopMoveGraph === true) { return; } transformModel.translate(deltaX, deltaY); }; _this.onDragEnd = function () { _this.setState({ isDragging: false, }); }; _this.zoomHandler = function (ev) { var _a = _this.props, _b = _a.graphModel, editConfigModel = _b.editConfigModel, transformModel = _b.transformModel, gridSize = _b.gridSize, graphModel = _a.graphModel; var eX = ev.deltaX, eY = ev.deltaY; var stopScrollGraph = editConfigModel.stopScrollGraph, stopZoomGraph = editConfigModel.stopZoomGraph; // 如果没有禁止滚动移动画布, 并且当前触发的时候ctrl键、cmd键没有按住, 那么移动画布 if (!stopScrollGraph && !ev.ctrlKey && !ev.metaKey) { ev.preventDefault(); _this.stepScrollX += eX; _this.stepScrollY += eY; if (Math.abs(_this.stepScrollX) >= gridSize) { var remainderX = _this.stepScrollX % gridSize; var moveDistance = _this.stepScrollX - remainderX; transformModel.translate(-moveDistance * transformModel.SCALE_X, 0); _this.stepScrollX = remainderX; } if (Math.abs(_this.stepScrollY) >= gridSize) { var remainderY = _this.stepScrollY % gridSize; var moveDistanceY = _this.stepScrollY - remainderY; transformModel.translate(0, -moveDistanceY * transformModel.SCALE_Y); _this.stepScrollY = remainderY; } return; } // 如果没有禁止缩放画布,那么进行缩放. 在禁止缩放画布后,按住 ctrl、cmd 键也不能缩放了。 if (!stopZoomGraph) { ev.preventDefault(); var position = graphModel.getPointByClient({ x: ev.clientX, y: ev.clientY, }); var _c = position.canvasOverlayPosition, x = _c.x, y = _c.y; transformModel.zoom(ev.deltaY < 0, [x, y]); } }; _this.clickHandler = function (ev) { // 点击空白处取消节点选中状态, 不包括冒泡过来的事件。 var target = ev.target; if (target.getAttribute('name') === 'canvas-overlay') { var graphModel = _this.props.graphModel; var selectElements = graphModel.selectElements; if (selectElements.size > 0) { graphModel.clearSelectElements(); } graphModel.eventCenter.emit(EventType.BLANK_CLICK, { e: ev }); } }; _this.handleContextMenu = function (ev) { var target = ev.target; if (target.getAttribute('name') === 'canvas-overlay') { ev.preventDefault(); var graphModel = _this.props.graphModel; var position = graphModel.getPointByClient({ x: ev.clientX, y: ev.clientY, }); // graphModel.setElementState(ElementState.SHOW_MENU, position.domOverlayPosition); graphModel.eventCenter.emit(EventType.BLANK_CONTEXTMENU, { e: ev, position: position, }); } }; // 鼠标、触摸板 按下 _this.mouseDownHandler = function (ev) { var _a = _this.props.graphModel, eventCenter = _a.eventCenter, editConfigModel = _a.editConfigModel, SCALE_X = _a.transformModel.SCALE_X, gridSize = _a.gridSize; var adjustEdge = editConfigModel.adjustEdge, adjustNodePosition = editConfigModel.adjustNodePosition, stopMoveGraph = editConfigModel.stopMoveGraph; var target = ev.target; var isFrozenElement = !adjustEdge && !adjustNodePosition; if (target.getAttribute('name') === 'canvas-overlay' || isFrozenElement) { if (stopMoveGraph !== true) { _this.stepDrag.setStep(gridSize * SCALE_X); _this.stepDrag.handleMouseDown(ev); } else { eventCenter.emit(EventType.BLANK_MOUSEDOWN, { e: ev }); } // 为了处理画布移动的时候,编辑和菜单仍然存在的问题。 _this.clickHandler(ev); } }; var _a = props.graphModel, gridSize = _a.gridSize, eventCenter = _a.eventCenter; _this.stepDrag = new StepDrag({ onDragging: _this.onDragging, onDragEnd: _this.onDragEnd, step: gridSize, eventType: 'BLANK', isStopPropagation: false, eventCenter: eventCenter, model: undefined, }); // 当 ctrl、cmd 键被按住的时候,可以放大缩小。 _this.state = { isDragging: false, }; return _this; } CanvasOverlay.prototype.render = function () { var transformModel = this.props.graphModel.transformModel; var transform = transformModel.getTransformStyle().transform; var _a = this.props, children = _a.children, dnd = _a.dnd; var isDragging = this.state.isDragging; return (_jsx("svg", __assign({ xmlns: "http://www.w3.org/2000/svg", width: "100%", height: "100%", name: "canvas-overlay", onWheel: this.zoomHandler, onMouseDown: this.mouseDownHandler, onContextMenu: this.handleContextMenu, className: isDragging ? 'lf-canvas-overlay lf-dragging' : 'lf-canvas-overlay lf-drag-able' }, dnd.eventMap(), { children: _jsx("g", { transform: transform, children: children }) }))); }; CanvasOverlay = __decorate([ observer ], CanvasOverlay); return CanvasOverlay; }(Component)); export { CanvasOverlay }; export default CanvasOverlay;