adjust-node-position.ts 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import { PositionSchema } from '@flowgram.ai/utils';
  2. import {
  3. WorkflowDocument,
  4. WorkflowDragService,
  5. WorkflowNodeEntity,
  6. WorkflowPortEntity,
  7. } from '@flowgram.ai/free-layout-core';
  8. export type IAdjustNodePosition = (params: {
  9. nodeType: string;
  10. position: PositionSchema;
  11. document: WorkflowDocument;
  12. dragService: WorkflowDragService;
  13. fromPort?: WorkflowPortEntity;
  14. toPort?: WorkflowPortEntity;
  15. containerNode?: WorkflowNodeEntity;
  16. }) => PositionSchema;
  17. /** 调整节点坐标 */
  18. export const adjustNodePosition: IAdjustNodePosition = (params) => {
  19. const { nodeType, position, fromPort, toPort, containerNode, document, dragService } = params;
  20. const register = document.getNodeRegistry(nodeType);
  21. const size = register?.meta?.size;
  22. let adjustedPosition = position;
  23. if (!size) {
  24. adjustedPosition = position;
  25. }
  26. // 计算坐标偏移
  27. else if (fromPort && toPort) {
  28. // 输入输出
  29. adjustedPosition = {
  30. x: position.x,
  31. y: position.y - size.height / 2,
  32. };
  33. } else if (fromPort && !toPort) {
  34. // 仅输入
  35. adjustedPosition = {
  36. x: position.x + size.width / 2,
  37. y: position.y - size.height / 2,
  38. };
  39. } else if (!fromPort && toPort) {
  40. // 仅输出
  41. adjustedPosition = {
  42. x: position.x - size.width / 2,
  43. y: position.y - size.height / 2,
  44. };
  45. } else {
  46. adjustedPosition = position;
  47. }
  48. return dragService.adjustSubNodePosition(nodeType, containerNode, adjustedPosition);
  49. };