node-drag.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import { __assign, __extends, __spreadArray } from "tslib";
  2. import { Action } from '@antv/g2';
  3. import { get } from '@antv/util';
  4. import { findViewById } from '../../../../utils';
  5. import { EDGES_VIEW_ID, NODES_VIEW_ID } from '../../constant';
  6. var SankeyNodeDragAction = /** @class */ (function (_super) {
  7. __extends(SankeyNodeDragAction, _super);
  8. function SankeyNodeDragAction() {
  9. var _this = _super !== null && _super.apply(this, arguments) || this;
  10. /**
  11. * 是否在拖拽中的标记
  12. */
  13. _this.isDragging = false;
  14. return _this;
  15. }
  16. /**
  17. * 当前操作的是否是 element
  18. */
  19. SankeyNodeDragAction.prototype.isNodeElement = function () {
  20. var shape = get(this.context, 'event.target');
  21. if (shape) {
  22. var element = shape.get('element');
  23. return element && element.getModel().data.isNode;
  24. }
  25. return false;
  26. };
  27. SankeyNodeDragAction.prototype.getNodeView = function () {
  28. return findViewById(this.context.view, NODES_VIEW_ID);
  29. };
  30. SankeyNodeDragAction.prototype.getEdgeView = function () {
  31. return findViewById(this.context.view, EDGES_VIEW_ID);
  32. };
  33. /**
  34. * 获取当前操作的 index
  35. * @param element
  36. */
  37. SankeyNodeDragAction.prototype.getCurrentDatumIdx = function (element) {
  38. return this.getNodeView().geometries[0].elements.indexOf(element);
  39. };
  40. /**
  41. * 点击下去,开始
  42. */
  43. SankeyNodeDragAction.prototype.start = function () {
  44. // 记录开始了的状态
  45. if (this.isNodeElement()) {
  46. this.prevPoint = {
  47. x: get(this.context, 'event.x'),
  48. y: get(this.context, 'event.y'),
  49. };
  50. var element = this.context.event.target.get('element');
  51. var idx = this.getCurrentDatumIdx(element);
  52. if (idx === -1) {
  53. return;
  54. }
  55. this.currentElementIdx = idx;
  56. this.context.isDragging = true;
  57. this.isDragging = true;
  58. // 关闭动画并暂存配置
  59. this.prevNodeAnimateCfg = this.getNodeView().getOptions().animate;
  60. this.prevEdgeAnimateCfg = this.getEdgeView().getOptions().animate;
  61. this.getNodeView().animate(false);
  62. this.getEdgeView().animate(false);
  63. }
  64. };
  65. /**
  66. * 移动过程中,平移
  67. */
  68. SankeyNodeDragAction.prototype.translate = function () {
  69. if (this.isDragging) {
  70. var chart = this.context.view;
  71. var currentPoint = {
  72. x: get(this.context, 'event.x'),
  73. y: get(this.context, 'event.y'),
  74. };
  75. var x = currentPoint.x - this.prevPoint.x;
  76. var y = currentPoint.y - this.prevPoint.y;
  77. var nodeView = this.getNodeView();
  78. var element = nodeView.geometries[0].elements[this.currentElementIdx];
  79. // 修改数据
  80. if (element && element.getModel()) {
  81. var prevDatum = element.getModel().data;
  82. var data = nodeView.getOptions().data;
  83. var coordinate = nodeView.getCoordinate();
  84. var datumGap_1 = {
  85. x: x / coordinate.getWidth(),
  86. y: y / coordinate.getHeight(),
  87. };
  88. var nextDatum = __assign(__assign({}, prevDatum), { x: prevDatum.x.map(function (x) { return (x += datumGap_1.x); }), y: prevDatum.y.map(function (y) { return (y += datumGap_1.y); }) });
  89. // 处理一下在 [0, 1] 范围
  90. // 1. 更新 node 数据
  91. var newData = __spreadArray([], data, true);
  92. newData[this.currentElementIdx] = nextDatum;
  93. nodeView.data(newData);
  94. // 2. 更新 edge 数据
  95. var name_1 = prevDatum.name;
  96. var edgeView = this.getEdgeView();
  97. var edgeData = edgeView.getOptions().data;
  98. edgeData.forEach(function (datum) {
  99. // 2.1 以该 node 为 source 的边,修改 [x0, x1, x2, x3] 中的 x0, x1
  100. if (datum.source === name_1) {
  101. datum.x[0] += datumGap_1.x;
  102. datum.x[1] += datumGap_1.x;
  103. datum.y[0] += datumGap_1.y;
  104. datum.y[1] += datumGap_1.y;
  105. }
  106. // 2.2 以该 node 为 target 的边,修改 [x0, x1, x2, x3] 中的 x2, x3
  107. if (datum.target === name_1) {
  108. datum.x[2] += datumGap_1.x;
  109. datum.x[3] += datumGap_1.x;
  110. datum.y[2] += datumGap_1.y;
  111. datum.y[3] += datumGap_1.y;
  112. }
  113. });
  114. edgeView.data(edgeData);
  115. // 3. 更新最新位置
  116. this.prevPoint = currentPoint;
  117. // node edge 都改变了,所以要从底层 render
  118. chart.render(true);
  119. }
  120. }
  121. };
  122. /**
  123. * 结论,清除状态
  124. */
  125. SankeyNodeDragAction.prototype.end = function () {
  126. this.isDragging = false;
  127. this.context.isDragging = false;
  128. this.prevPoint = null;
  129. this.currentElementIdx = null;
  130. // 还原动画
  131. this.getNodeView().animate(this.prevNodeAnimateCfg);
  132. this.getEdgeView().animate(this.prevEdgeAnimateCfg);
  133. };
  134. return SankeyNodeDragAction;
  135. }(Action));
  136. export { SankeyNodeDragAction };
  137. //# sourceMappingURL=node-drag.js.map