Files
lan-manager/web/node_modules/@antv/g6-pc/lib/behavior/drag-canvas.js
openclaw 0a5f6a8047 Initial commit: Lan-manager project code
- Go backend (server/)
- Frontend (web/, server/static/)
- Database and deployment files
- Scripts and docs

Co-Authored-By: 狸花猫/Claude-Qwen3.6-Plus 🐾
2026-04-20 00:52:58 +08:00

304 lines
10 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _util = require("@antv/util");
var _util2 = _interopRequireDefault(require("../util"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
var cloneEvent = _util2.default.cloneEvent,
isNaN = _util2.default.isNaN;
var abs = Math.abs;
var DRAG_OFFSET = 10;
var ALLOW_EVENTS = ['shift', 'ctrl', 'alt', 'control'];
var _default = exports.default = {
getDefaultCfg: function getDefaultCfg() {
return {
direction: 'both',
enableOptimize: false,
// drag-canvas 可拖动的扩展范围,默认为 0即最多可以拖动一屏的位置
// 当设置的值大于 0 时,即拖动可以超过一屏
// 当设置的值小于 0 时,相当于缩小了可拖动范围
// 具体实例可参考https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*IFfoS67_HssAAAAAAAAAAAAAARQnAQ
scalableRange: 0,
allowDragOnItem: false
};
},
getEvents: function getEvents() {
return {
'mousedown': 'onMouseDown',
'drag': 'onDragMove',
'dragend': 'onMouseUp',
'canvas:click': 'onMouseUp',
'keyup': 'onKeyUp',
'focus': 'onKeyUp',
'keydown': 'onKeyDown',
'touchstart': 'onTouchStart',
'touchmove': 'onTouchMove',
'touchend': 'onMouseUp'
};
},
updateViewport: function updateViewport(e) {
var origin = this.origin;
var clientX = +e.clientX;
var clientY = +e.clientY;
if (isNaN(clientX) || isNaN(clientY)) {
return;
}
var dx = clientX - origin.x;
var dy = clientY - origin.y;
if (this.get('direction') === 'x') {
dy = 0;
} else if (this.get('direction') === 'y') {
dx = 0;
}
this.origin = {
x: clientX,
y: clientY
};
var width = this.graph.get('width');
var height = this.graph.get('height');
var graphCanvasBBox = this.graph.get('canvas').getCanvasBBox();
var expandWidth = this.scalableRange;
var expandHeight = this.scalableRange;
// 若 scalableRange 是 0~1 的小数,则作为比例考虑
if (expandWidth < 1 && expandWidth > -1) {
expandWidth = width * expandWidth;
expandHeight = height * expandHeight;
}
if (graphCanvasBBox.minX <= width + expandWidth && graphCanvasBBox.minX + dx > width + expandWidth || graphCanvasBBox.maxX + expandWidth >= 0 && graphCanvasBBox.maxX + expandWidth + dx < 0) {
dx = 0;
}
if (graphCanvasBBox.minY <= height + expandHeight && graphCanvasBBox.minY + dy > height + expandHeight || graphCanvasBBox.maxY + expandHeight >= 0 && graphCanvasBBox.maxY + expandHeight + dy < 0) {
dy = 0;
}
this.graph.translate(dx, dy);
},
onTouchStart: function onTouchStart(e) {
var self = this;
var touches = e.originalEvent.touches;
var event1 = touches[0];
var event2 = touches[1];
// 如果是双指操作,不允许拖拽画布
if (event1 && event2) {
return;
}
e.preventDefault();
this.mousedown = true;
self.onDragStart(e);
},
onMouseDown: function onMouseDown(e) {
this.mousedown = true;
},
onDragMove: function onDragMove(evt) {
if (!this.mousedown) return;
if (!this.dragstart) {
// dragstart
this.dragstart = true;
this.onDragStart(evt);
} else {
// drag
this.onDrag(evt);
}
},
onDragStart: function onDragStart(e) {
var self = this;
var event = e.originalEvent;
// TODO: 'name' doesn't exist on `IG6GraphEvent`, we should consider typing it so users get autocomplete and other benefits
if (event && e.name !== 'touchstart' && event.button !== 0) {
return;
}
if (e.name !== 'touchstart' && typeof window !== 'undefined' && window.event && !window.event.buttons && !window.event.button) {
return;
}
if (!this.shouldBegin(e, this)) {
return;
}
if (self.keydown) return;
if (!this.allowDrag(e)) return;
self.origin = {
x: e.clientX,
y: e.clientY
};
self.dragging = false;
if (this.enableOptimize) {
// 拖动 canvas 过程中隐藏所有的边及label
var graph = this.graph;
var edges = graph.getEdges();
for (var i = 0, len = edges.length; i < len; i++) {
var shapes = edges[i].get('group').get('children');
if (!shapes) continue;
shapes.forEach(function (shape) {
shape.set('ori-visibility', shape.get('ori-visibility') || shape.get('visible'));
shape.hide();
});
}
var nodes = graph.getNodes();
for (var j = 0, nodeLen = nodes.length; j < nodeLen; j++) {
var container = nodes[j].getContainer();
var children = container.get('children');
for (var _i = 0, children_1 = children; _i < children_1.length; _i++) {
var child = children_1[_i];
var isKeyShape = child.get('isKeyShape');
if (!isKeyShape) {
child.set('ori-visibility', child.get('ori-visibility') || child.get('visible'));
child.hide();
}
}
}
}
// 绑定浏览器右键监听,触发拖拽结束,结束拖拽时移除
if (typeof window !== 'undefined') {
var self_1 = this;
this.handleDOMContextMenu = function (e) {
return self_1.onMouseUp(e);
};
document.body.addEventListener('contextmenu', this.handleDOMContextMenu);
}
},
onTouchMove: function onTouchMove(e) {
var self = this;
var touches = e.originalEvent.touches;
var event1 = touches[0];
var event2 = touches[1];
// 如果是双指操作,不允许拖拽画布,结束拖拽
if (event1 && event2) {
this.onMouseUp(e);
return;
}
e.preventDefault();
self.onDrag(e);
},
onDrag: function onDrag(e) {
if (!this.mousedown) return;
var graph = this.graph;
if (this.keydown) return;
if (!this.allowDrag(e)) return;
e = cloneEvent(e);
if (!this.origin) {
return;
}
if (!this.dragging) {
if (abs(this.origin.x - e.clientX) + abs(this.origin.y - e.clientY) < DRAG_OFFSET) {
return;
}
if (this.shouldBegin(e, this)) {
e.type = 'dragstart';
graph.emit('canvas:dragstart', e);
this.originPosition = {
x: e.clientX,
y: e.clientY
};
this.dragging = true;
}
} else {
e.type = 'drag';
graph.emit('canvas:drag', e);
}
if (this.shouldUpdate(e, this)) {
this.updateViewport(e);
}
},
onMouseUp: function onMouseUp(e) {
var _a, _b;
this.mousedown = false;
this.dragstart = false;
var graph = this.graph;
if (this.keydown) return;
var currentZoom = graph.getZoom();
var modeController = graph.get('modeController');
var zoomCanvas = (_b = (_a = modeController === null || modeController === void 0 ? void 0 : modeController.modes[modeController.mode]) === null || _a === void 0 ? void 0 : _a.filter(function (behavior) {
return behavior.type === 'zoom-canvas';
})) === null || _b === void 0 ? void 0 : _b[0];
var optimizeZoom = zoomCanvas ? zoomCanvas.optimizeZoom || 0.1 : 0;
if (this.enableOptimize) {
// 拖动结束后显示所有的边
var edges = graph.getEdges();
for (var i = 0, len = edges.length; i < len; i++) {
var shapes = edges[i].get('group').get('children');
if (!shapes) continue;
shapes.forEach(function (shape) {
var oriVis = shape.get('ori-visibility');
shape.set('ori-visibility', undefined);
if (oriVis) shape.show();
});
}
if (currentZoom > optimizeZoom) {
var nodes = graph.getNodes();
for (var j = 0, nodeLen = nodes.length; j < nodeLen; j++) {
var container = nodes[j].getContainer();
var children = container.get('children');
for (var _i = 0, children_2 = children; _i < children_2.length; _i++) {
var child = children_2[_i];
var isKeyShape = child.get('isKeyShape');
if (!isKeyShape) {
var oriVis = child.get('ori-visibility');
child.set('ori-visibility', undefined);
if (oriVis) child.show();
}
}
}
}
}
if (!this.dragging) {
this.origin = null;
return;
}
e = cloneEvent(e);
if (this.shouldEnd(e, this)) {
this.updateViewport(e);
}
e.type = 'dragend';
e.dx = e.clientX - this.originPosition.x;
e.dy = e.clientY - this.originPosition.y;
graph.emit('canvas:dragend', e);
this.endDrag();
// 结束拖拽时移除浏览器右键监听
if (typeof window !== 'undefined') {
document.body.removeEventListener('contextmenu', this.handleDOMContextMenu);
}
},
endDrag: function endDrag() {
this.origin = null;
this.dragging = false;
this.dragbegin = false;
this.mousedown = false;
this.dragstart = false;
},
onKeyDown: function onKeyDown(e) {
var self = this;
var code = e.key;
if (!code) {
return;
}
if (ALLOW_EVENTS.indexOf(code.toLowerCase()) > -1) {
self.keydown = true;
} else {
self.keydown = false;
}
},
onKeyUp: function onKeyUp() {
this.keydown = false;
this.origin = null;
this.dragging = false;
this.dragbegin = false;
},
allowDrag: function allowDrag(evt) {
var _a, _b;
var target = evt.target;
var targetIsCanvas = target && target.isCanvas && target.isCanvas();
if ((0, _util.isBoolean)(this.allowDragOnItem) && !this.allowDragOnItem && !targetIsCanvas) return false;
if ((0, _util.isObject)(this.allowDragOnItem)) {
var _c = this.allowDragOnItem,
node = _c.node,
edge = _c.edge,
combo = _c.combo;
var itemType = (_b = (_a = evt.item) === null || _a === void 0 ? void 0 : _a.getType) === null || _b === void 0 ? void 0 : _b.call(_a);
if (!node && itemType === 'node') return false;
if (!edge && itemType === 'edge') return false;
if (!combo && itemType === 'combo') return false;
}
return true;
}
};