html.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import { __assign, __extends } from "tslib";
  2. import { createDom, modifyCSS } from '@antv/dom-util';
  3. import { substitute, hasKey } from '@antv/util';
  4. import { toPx, getTextPoint } from '../util/util';
  5. import HtmlComponent from '../abstract/html-component';
  6. import * as CssConst from './css-const';
  7. import HtmlTheme from './html-theme';
  8. var HtmlCrosshair = /** @class */ (function (_super) {
  9. __extends(HtmlCrosshair, _super);
  10. function HtmlCrosshair() {
  11. return _super !== null && _super.apply(this, arguments) || this;
  12. }
  13. HtmlCrosshair.prototype.getDefaultCfg = function () {
  14. var cfg = _super.prototype.getDefaultCfg.call(this);
  15. return __assign(__assign({}, cfg), { name: 'crosshair', type: 'html', locationType: 'region', start: { x: 0, y: 0 }, end: { x: 0, y: 0 }, capture: false, text: null, containerTpl: "<div class=\"" + CssConst.CONTAINER_CLASS + "\"></div>", crosshairTpl: "<div class=\"" + CssConst.CROSSHAIR_LINE + "\"></div>", textTpl: "<span class=\"" + CssConst.CROSSHAIR_TEXT + "\">{content}</span>", domStyles: null, containerClassName: CssConst.CONTAINER_CLASS, defaultStyles: HtmlTheme, defaultCfg: {
  16. text: {
  17. position: 'start',
  18. content: null,
  19. align: 'center',
  20. offset: 10
  21. }
  22. } });
  23. };
  24. HtmlCrosshair.prototype.render = function () {
  25. this.resetText();
  26. this.resetPosition();
  27. };
  28. // 绘制 crosshair
  29. HtmlCrosshair.prototype.initCrossHair = function () {
  30. var container = this.getContainer();
  31. var crosshairTpl = this.get('crosshairTpl');
  32. var crosshairEl = createDom(crosshairTpl);
  33. container.appendChild(crosshairEl);
  34. this.applyStyle(CssConst.CROSSHAIR_LINE, crosshairEl);
  35. this.set('crosshairEl', crosshairEl);
  36. };
  37. // 获取文本的位置
  38. HtmlCrosshair.prototype.getTextPoint = function () {
  39. var _a = this.getLocation(), start = _a.start, end = _a.end;
  40. var _b = this.get('text'), position = _b.position, offset = _b.offset;
  41. return getTextPoint(start, end, position, offset);
  42. };
  43. // 设置 text
  44. HtmlCrosshair.prototype.resetText = function () {
  45. var text = this.get('text');
  46. var textEl = this.get('textEl');
  47. if (text) {
  48. var content = text.content;
  49. if (!textEl) {
  50. var container = this.getContainer();
  51. var textTpl = substitute(this.get('textTpl'), text);
  52. textEl = createDom(textTpl);
  53. container.appendChild(textEl);
  54. this.applyStyle(CssConst.CROSSHAIR_TEXT, textEl);
  55. this.set('textEl', textEl);
  56. }
  57. textEl.innerHTML = content;
  58. }
  59. else if (textEl) {
  60. textEl.remove();
  61. }
  62. };
  63. // 是否垂直
  64. HtmlCrosshair.prototype.isVertical = function (start, end) {
  65. return start.x === end.x;
  66. };
  67. // 重新调整位置
  68. HtmlCrosshair.prototype.resetPosition = function () {
  69. var crosshairEl = this.get('crosshairEl');
  70. if (!crosshairEl) {
  71. this.initCrossHair();
  72. crosshairEl = this.get('crosshairEl');
  73. }
  74. var start = this.get('start');
  75. var end = this.get('end');
  76. var minX = Math.min(start.x, end.x);
  77. var minY = Math.min(start.y, end.y);
  78. if (this.isVertical(start, end)) {
  79. modifyCSS(crosshairEl, {
  80. width: '1px',
  81. height: toPx(Math.abs(end.y - start.y))
  82. });
  83. }
  84. else {
  85. modifyCSS(crosshairEl, {
  86. height: '1px',
  87. width: toPx(Math.abs(end.x - start.x))
  88. });
  89. }
  90. modifyCSS(crosshairEl, {
  91. top: toPx(minY),
  92. left: toPx(minX)
  93. });
  94. this.alignText();
  95. };
  96. HtmlCrosshair.prototype.alignText = function () {
  97. // 重新设置 text 位置
  98. var textEl = this.get('textEl');
  99. if (textEl) {
  100. var align = this.get('text').align;
  101. var clientWidth = textEl.clientWidth;
  102. var point = this.getTextPoint();
  103. switch (align) {
  104. case 'center':
  105. point.x = point.x - clientWidth / 2;
  106. break;
  107. case 'right':
  108. point.x = point.x - clientWidth;
  109. case 'left':
  110. break;
  111. }
  112. modifyCSS(textEl, {
  113. top: toPx(point.y),
  114. left: toPx(point.x)
  115. });
  116. }
  117. };
  118. HtmlCrosshair.prototype.updateInner = function (cfg) {
  119. if (hasKey(cfg, 'text')) {
  120. this.resetText();
  121. }
  122. _super.prototype.updateInner.call(this, cfg);
  123. };
  124. return HtmlCrosshair;
  125. }(HtmlComponent));
  126. export default HtmlCrosshair;
  127. //# sourceMappingURL=html.js.map