node-drag.js 5.7 KB

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