@visactor/vrender-components 1.0.0-alpha.5 → 1.0.0-alpha.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/cjs/animation/axis-animate.js +4 -4
  2. package/cjs/animation/axis-animate.js.map +1 -1
  3. package/cjs/axis/util.js +5 -5
  4. package/cjs/axis/util.js.map +1 -1
  5. package/cjs/brush/brush.d.ts +16 -10
  6. package/cjs/brush/brush.js +81 -93
  7. package/cjs/brush/brush.js.map +1 -1
  8. package/cjs/brush/config.d.ts +5 -5
  9. package/cjs/brush/config.js +5 -5
  10. package/cjs/brush/config.js.map +1 -1
  11. package/cjs/brush/type.d.ts +1 -0
  12. package/cjs/brush/type.js +1 -1
  13. package/cjs/brush/type.js.map +1 -1
  14. package/cjs/data-zoom/data-zoom.d.ts +3 -0
  15. package/cjs/data-zoom/data-zoom.js +36 -19
  16. package/cjs/data-zoom/data-zoom.js.map +1 -1
  17. package/cjs/index.d.ts +1 -1
  18. package/cjs/index.js +1 -1
  19. package/cjs/index.js.map +1 -1
  20. package/cjs/label/base.js +17 -3
  21. package/cjs/label/base.js.map +1 -1
  22. package/cjs/marker/animate/animate.d.ts +3 -3
  23. package/cjs/marker/animate/animate.js.map +1 -1
  24. package/cjs/marker/animate/clip-in.d.ts +1 -1
  25. package/cjs/marker/animate/clip-in.js +6 -3
  26. package/cjs/marker/animate/clip-in.js.map +1 -1
  27. package/cjs/marker/animate/fade-in.d.ts +3 -3
  28. package/cjs/marker/animate/fade-in.js +10 -4
  29. package/cjs/marker/animate/fade-in.js.map +1 -1
  30. package/cjs/marker/animate/fade-out.d.ts +3 -3
  31. package/cjs/marker/animate/fade-out.js +10 -4
  32. package/cjs/marker/animate/fade-out.js.map +1 -1
  33. package/cjs/marker/arc-area.d.ts +8 -5
  34. package/cjs/marker/arc-area.js +18 -39
  35. package/cjs/marker/arc-area.js.map +1 -1
  36. package/cjs/marker/arc-line.d.ts +6 -4
  37. package/cjs/marker/arc-line.js +12 -9
  38. package/cjs/marker/arc-line.js.map +1 -1
  39. package/cjs/marker/area.d.ts +6 -4
  40. package/cjs/marker/area.js +14 -32
  41. package/cjs/marker/area.js.map +1 -1
  42. package/cjs/marker/base.d.ts +2 -3
  43. package/cjs/marker/base.js.map +1 -1
  44. package/cjs/marker/common-line.d.ts +11 -7
  45. package/cjs/marker/common-line.js +11 -31
  46. package/cjs/marker/common-line.js.map +1 -1
  47. package/cjs/marker/config.d.ts +2 -0
  48. package/cjs/marker/config.js +2 -0
  49. package/cjs/marker/config.js.map +1 -1
  50. package/cjs/marker/line.d.ts +6 -4
  51. package/cjs/marker/line.js +10 -4
  52. package/cjs/marker/line.js.map +1 -1
  53. package/cjs/marker/mixin/label.d.ts +16 -0
  54. package/cjs/marker/mixin/label.js +57 -0
  55. package/cjs/marker/mixin/label.js.map +1 -0
  56. package/cjs/marker/type.d.ts +19 -16
  57. package/cjs/marker/type.js.map +1 -1
  58. package/cjs/scrollbar/scrollbar.d.ts +1 -0
  59. package/cjs/scrollbar/scrollbar.js +21 -12
  60. package/cjs/scrollbar/scrollbar.js.map +1 -1
  61. package/cjs/slider/slider.d.ts +3 -0
  62. package/cjs/slider/slider.js +48 -27
  63. package/cjs/slider/slider.js.map +1 -1
  64. package/cjs/switch/switch.js +2 -2
  65. package/cjs/switch/switch.js.map +1 -1
  66. package/cjs/util/event.d.ts +1 -0
  67. package/cjs/util/event.js +14 -0
  68. package/cjs/util/event.js.map +1 -0
  69. package/dist/index.es.js +1580 -916
  70. package/es/animation/axis-animate.js +4 -4
  71. package/es/animation/axis-animate.js.map +1 -1
  72. package/es/axis/util.js +5 -6
  73. package/es/axis/util.js.map +1 -1
  74. package/es/brush/brush.d.ts +16 -10
  75. package/es/brush/brush.js +83 -95
  76. package/es/brush/brush.js.map +1 -1
  77. package/es/brush/config.d.ts +5 -5
  78. package/es/brush/config.js +5 -5
  79. package/es/brush/config.js.map +1 -1
  80. package/es/brush/type.d.ts +1 -0
  81. package/es/brush/type.js +1 -1
  82. package/es/brush/type.js.map +1 -1
  83. package/es/data-zoom/data-zoom.d.ts +3 -0
  84. package/es/data-zoom/data-zoom.js +35 -16
  85. package/es/data-zoom/data-zoom.js.map +1 -1
  86. package/es/index.d.ts +1 -1
  87. package/es/index.js +1 -1
  88. package/es/index.js.map +1 -1
  89. package/es/label/base.js +17 -3
  90. package/es/label/base.js.map +1 -1
  91. package/es/marker/animate/animate.d.ts +3 -3
  92. package/es/marker/animate/animate.js.map +1 -1
  93. package/es/marker/animate/clip-in.d.ts +1 -1
  94. package/es/marker/animate/clip-in.js +6 -2
  95. package/es/marker/animate/clip-in.js.map +1 -1
  96. package/es/marker/animate/fade-in.d.ts +3 -3
  97. package/es/marker/animate/fade-in.js +11 -3
  98. package/es/marker/animate/fade-in.js.map +1 -1
  99. package/es/marker/animate/fade-out.d.ts +3 -3
  100. package/es/marker/animate/fade-out.js +11 -3
  101. package/es/marker/animate/fade-out.js.map +1 -1
  102. package/es/marker/arc-area.d.ts +8 -5
  103. package/es/marker/arc-area.js +19 -41
  104. package/es/marker/arc-area.js.map +1 -1
  105. package/es/marker/arc-line.d.ts +6 -4
  106. package/es/marker/arc-line.js +12 -9
  107. package/es/marker/arc-line.js.map +1 -1
  108. package/es/marker/area.d.ts +6 -4
  109. package/es/marker/area.js +15 -34
  110. package/es/marker/area.js.map +1 -1
  111. package/es/marker/base.d.ts +2 -3
  112. package/es/marker/base.js.map +1 -1
  113. package/es/marker/common-line.d.ts +11 -7
  114. package/es/marker/common-line.js +14 -34
  115. package/es/marker/common-line.js.map +1 -1
  116. package/es/marker/config.d.ts +2 -0
  117. package/es/marker/config.js +2 -0
  118. package/es/marker/config.js.map +1 -1
  119. package/es/marker/line.d.ts +6 -4
  120. package/es/marker/line.js +10 -4
  121. package/es/marker/line.js.map +1 -1
  122. package/es/marker/mixin/label.d.ts +16 -0
  123. package/es/marker/mixin/label.js +45 -0
  124. package/es/marker/mixin/label.js.map +1 -0
  125. package/es/marker/type.d.ts +19 -16
  126. package/es/marker/type.js.map +1 -1
  127. package/es/scrollbar/scrollbar.d.ts +1 -0
  128. package/es/scrollbar/scrollbar.js +22 -11
  129. package/es/scrollbar/scrollbar.js.map +1 -1
  130. package/es/slider/slider.d.ts +3 -0
  131. package/es/slider/slider.js +49 -26
  132. package/es/slider/slider.js.map +1 -1
  133. package/es/switch/switch.js +2 -2
  134. package/es/switch/switch.js.map +1 -1
  135. package/es/util/event.d.ts +1 -0
  136. package/es/util/event.js +6 -0
  137. package/es/util/event.js.map +1 -0
  138. package/package.json +6 -6
@@ -7,9 +7,10 @@ export class AxisEnter extends AComponentAnimate {
7
7
  this._animator = animator;
8
8
  const duration = this.duration, easing = this.easing, {config: config, lastScale: lastScale, getTickCoord: getTickCoord} = this.params;
9
9
  let ratio = 1;
10
- if (lastScale && getTickCoord) {
10
+ const currData = this.target.data;
11
+ if (lastScale && getTickCoord && currData) {
11
12
  ratio = .7;
12
- const currData = this.target.data, point = getTickCoord(lastScale.scale(currData.rawValue)), newX = this.target.attribute.x, newY = this.target.attribute.y;
13
+ const point = getTickCoord(lastScale.scale(currData.rawValue)), newX = this.target.attribute.x, newY = this.target.attribute.y;
13
14
  this.target.setAttributes({
14
15
  x: point.x,
15
16
  y: point.y
@@ -34,12 +35,11 @@ export class AxisEnter extends AComponentAnimate {
34
35
 
35
36
  export class AxisUpdate extends AComponentAnimate {
36
37
  onBind() {
37
- var _a;
38
38
  const animator = createComponentAnimator(this.target);
39
39
  this._animator = animator;
40
40
  const duration = this.duration, easing = this.easing, {config: config, diffAttrs: diffAttrs} = this.params;
41
41
  animator.animate(this.target, {
42
- type: null !== (_a = config.type) && void 0 !== _a ? _a : "to",
42
+ type: "to",
43
43
  to: Object.assign({}, diffAttrs),
44
44
  duration: duration,
45
45
  easing: easing,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/animation/axis-animate.ts"],"names":[],"mappings":"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","file":"axis-animate.js","sourcesContent":["import { AComponentAnimate, AnimateExecutor, createComponentAnimator } from '@visactor/vrender-animate';\n\n/**\n * AxisEnter class handles the enter animation for Axis components\n */\nexport class AxisEnter extends AComponentAnimate<any> {\n onBind(): void {\n const animator = createComponentAnimator(this.target);\n this._animator = animator;\n const duration = this.duration;\n const easing = this.easing;\n const { config, lastScale, getTickCoord } = this.params;\n\n let ratio = 1;\n\n if (lastScale && getTickCoord) {\n ratio = 0.7;\n const currData = this.target.data;\n\n const oldValue = lastScale.scale(currData.rawValue);\n const point = getTickCoord(oldValue);\n const newX = this.target.attribute.x;\n const newY = this.target.attribute.y;\n\n this.target.setAttributes({ x: point.x, y: point.y });\n animator.animate(this.target, {\n type: 'to',\n to: { x: newX, y: newY },\n duration,\n easing\n });\n }\n\n // if (updateEls && updateEls.length > 1) {\n // ratio = 0.5;\n // const oldData1 = updateEls[0].oldEl.data;\n // const { rawValue: oldRawValue1, value: oldValue1 } = oldData1;\n // const oldData2 = updateEls[1].oldEl.data;\n // const { rawValue: oldRawValue2, value: oldValue2 } = oldData2;\n // const data = this.target.data;\n // const { rawValue: newRawValue } = data;\n // // rawValue 是原始值,value是映射出来的值,假设是线性映射,计算一下newRawValue在old阶段的value是什么值\n // const oldValue =\n // oldValue1 + ((oldValue2 - oldValue1) * (newRawValue - oldRawValue1)) / (oldRawValue2 - oldRawValue1);\n // // 将 x 和 y 做映射\n // const oldX1 = updateEls[0].oldEl.attribute.x;\n // const oldY1 = updateEls[0].oldEl.attribute.y;\n // const oldX2 = updateEls[1].oldEl.attribute.x;\n // const oldY2 = updateEls[1].oldEl.attribute.y;\n // const oldX = oldX1 + ((oldX2 - oldX1) * (oldValue - oldValue1)) / (oldValue2 - oldValue1);\n // const oldY = oldY1 + ((oldY2 - oldY1) * (oldValue - oldValue1)) / (oldValue2 - oldValue1);\n // const newX = this.target.attribute.x;\n // const newY = this.target.attribute.y;\n\n // this.target.setAttributes({ x: oldX, y: oldY });\n // animator.animate(this.target, {\n // type: 'to',\n // to: { x: newX, y: newY },\n // duration,\n // easing\n // });\n // }\n\n animator.animate(this.target, {\n type: config.type ?? 'fadeIn',\n to: config.to,\n duration: duration * ratio,\n easing\n });\n this.completeBind(animator);\n }\n}\n\n/**\n * AxisUpdate class handles the update animation for Axis components\n */\nexport class AxisUpdate extends AComponentAnimate<any> {\n onBind(): void {\n const animator = createComponentAnimator(this.target);\n this._animator = animator;\n const duration = this.duration;\n const easing = this.easing;\n const { config, diffAttrs } = this.params;\n // this.target.applyAnimationState(\n // ['update'],\n // [\n // {\n // name: 'update',\n // animation: {\n // type: 'to',\n // to: { ...this.props },\n // duration,\n // easing,\n // customParameters: {\n // diffAttrs: { ...this.props }\n // }\n // }\n // }\n // ]\n // );\n // console.log('this.props', this.props, { ...this.target.attribute });\n animator.animate(this.target, {\n type: config.type ?? 'to',\n to: { ...diffAttrs },\n duration,\n easing,\n customParameters: {\n diffAttrs: { ...diffAttrs }\n }\n });\n this.completeBind(animator);\n }\n\n // 轴动画本身没有逻辑,具体通过animator中执行,所以当需要屏蔽自身属性时,需要通过animator中执行\n deleteSelfAttr(key: string): void {\n super.deleteSelfAttr(key);\n this._animator.deleteSelfAttr(key);\n }\n\n // 轴动画本身没有逻辑,具体通过animator中执行,所以本身不需要屏蔽冲突\n protected tryPreventConflict(): void {\n return;\n }\n}\n\nexport function registerAxisAnimate() {\n // Label update animation\n AnimateExecutor.registerBuiltInAnimate('axisEnter', AxisEnter);\n AnimateExecutor.registerBuiltInAnimate('axisUpdate', AxisUpdate);\n}\n"]}
1
+ {"version":3,"sources":["../src/animation/axis-animate.ts"],"names":[],"mappings":"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","file":"axis-animate.js","sourcesContent":["import { AComponentAnimate, AnimateExecutor, createComponentAnimator } from '@visactor/vrender-animate';\n\n/**\n * AxisEnter class handles the enter animation for Axis components\n */\nexport class AxisEnter extends AComponentAnimate<any> {\n onBind(): void {\n const animator = createComponentAnimator(this.target);\n this._animator = animator;\n const duration = this.duration;\n const easing = this.easing;\n const { config, lastScale, getTickCoord } = this.params;\n\n let ratio = 1;\n const currData = this.target.data;\n if (lastScale && getTickCoord && currData) {\n ratio = 0.7;\n\n const oldValue = lastScale.scale(currData.rawValue);\n const point = getTickCoord(oldValue);\n const newX = this.target.attribute.x;\n const newY = this.target.attribute.y;\n\n this.target.setAttributes({ x: point.x, y: point.y });\n animator.animate(this.target, {\n type: 'to',\n to: { x: newX, y: newY },\n duration,\n easing\n });\n }\n\n // if (updateEls && updateEls.length > 1) {\n // ratio = 0.5;\n // const oldData1 = updateEls[0].oldEl.data;\n // const { rawValue: oldRawValue1, value: oldValue1 } = oldData1;\n // const oldData2 = updateEls[1].oldEl.data;\n // const { rawValue: oldRawValue2, value: oldValue2 } = oldData2;\n // const data = this.target.data;\n // const { rawValue: newRawValue } = data;\n // // rawValue 是原始值,value是映射出来的值,假设是线性映射,计算一下newRawValue在old阶段的value是什么值\n // const oldValue =\n // oldValue1 + ((oldValue2 - oldValue1) * (newRawValue - oldRawValue1)) / (oldRawValue2 - oldRawValue1);\n // // 将 x 和 y 做映射\n // const oldX1 = updateEls[0].oldEl.attribute.x;\n // const oldY1 = updateEls[0].oldEl.attribute.y;\n // const oldX2 = updateEls[1].oldEl.attribute.x;\n // const oldY2 = updateEls[1].oldEl.attribute.y;\n // const oldX = oldX1 + ((oldX2 - oldX1) * (oldValue - oldValue1)) / (oldValue2 - oldValue1);\n // const oldY = oldY1 + ((oldY2 - oldY1) * (oldValue - oldValue1)) / (oldValue2 - oldValue1);\n // const newX = this.target.attribute.x;\n // const newY = this.target.attribute.y;\n\n // this.target.setAttributes({ x: oldX, y: oldY });\n // animator.animate(this.target, {\n // type: 'to',\n // to: { x: newX, y: newY },\n // duration,\n // easing\n // });\n // }\n\n animator.animate(this.target, {\n type: config.type ?? 'fadeIn',\n to: config.to,\n duration: duration * ratio,\n easing\n });\n this.completeBind(animator);\n }\n}\n\n/**\n * AxisUpdate class handles the update animation for Axis components\n */\nexport class AxisUpdate extends AComponentAnimate<any> {\n onBind(): void {\n const animator = createComponentAnimator(this.target);\n this._animator = animator;\n const duration = this.duration;\n const easing = this.easing;\n const { config, diffAttrs } = this.params;\n // this.target.applyAnimationState(\n // ['update'],\n // [\n // {\n // name: 'update',\n // animation: {\n // type: 'to',\n // to: { ...this.props },\n // duration,\n // easing,\n // customParameters: {\n // diffAttrs: { ...this.props }\n // }\n // }\n // }\n // ]\n // );\n // console.log('this.props', this.props, { ...this.target.attribute });\n animator.animate(this.target, {\n type: 'to',\n to: { ...diffAttrs },\n duration,\n easing,\n customParameters: {\n diffAttrs: { ...diffAttrs }\n }\n });\n this.completeBind(animator);\n }\n\n // 轴动画本身没有逻辑,具体通过animator中执行,所以当需要屏蔽自身属性时,需要通过animator中执行\n deleteSelfAttr(key: string): void {\n super.deleteSelfAttr(key);\n this._animator.deleteSelfAttr(key);\n }\n\n // 轴动画本身没有逻辑,具体通过animator中执行,所以本身不需要屏蔽冲突\n protected tryPreventConflict(): void {\n return;\n }\n}\n\nexport function registerAxisAnimate() {\n // Label update animation\n AnimateExecutor.registerBuiltInAnimate('axisEnter', AxisEnter);\n AnimateExecutor.registerBuiltInAnimate('axisUpdate', AxisUpdate);\n}\n"]}
package/es/axis/util.js CHANGED
@@ -1,4 +1,4 @@
1
- import { isGreater, isLess, tau, normalizeAngle, polarToCartesian, merge } from "@visactor/vutils";
1
+ import { isGreater, isLess, tau, normalizeAngle, polarToCartesian, merge, obbSeparation, aabbSeparation } from "@visactor/vutils";
2
2
 
3
3
  import { traverseGroup } from "../util/common";
4
4
 
@@ -88,11 +88,10 @@ export function getPolygonPath(points, closed) {
88
88
 
89
89
  export function textIntersect(textA, textB, sep) {
90
90
  var _a;
91
- let a, b;
92
- const angle = null === (_a = textA.attribute) || void 0 === _a ? void 0 : _a.angle, isAABBIntersects = (textA, textB, sep) => (a = textA.AABBBounds,
93
- b = textB.AABBBounds, sep > Math.max(b.x1 - a.x2, a.x1 - b.x2, b.y1 - a.y2, a.y1 - b.y2));
94
- return isAngleHorizontal(angle, Number.EPSILON) ? isAABBIntersects(textA, textB, sep) : (a = textA.OBBBounds,
95
- b = textB.OBBBounds, !a || !b || a.empty() || b.empty() ? isAABBIntersects(textA, textB, sep) : a.intersects(b));
91
+ const angle = null === (_a = textA.attribute) || void 0 === _a ? void 0 : _a.angle;
92
+ if (isAngleHorizontal(angle, Number.EPSILON)) return sep > aabbSeparation(textA.AABBBounds, textB.AABBBounds);
93
+ const a = textA.OBBBounds, b = textB.OBBBounds;
94
+ return !a || !b || a.empty() || b.empty() ? sep > aabbSeparation(textA.AABBBounds, textB.AABBBounds) : a.intersects(b) || sep > obbSeparation(a, b);
96
95
  }
97
96
 
98
97
  export function hasOverlap(items, pad) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/axis/util.ts"],"names":[],"mappings":"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","file":"util.js","sourcesContent":["// eslint-disable-next-line no-duplicate-imports\nimport type { IGraphic, IGroup, IText, TextAlignType, TextBaselineType } from '@visactor/vrender-core';\nimport type { Dict, IBounds } from '@visactor/vutils';\n// eslint-disable-next-line no-duplicate-imports\nimport { isGreater, isLess, tau, normalizeAngle, polarToCartesian, merge } from '@visactor/vutils';\nimport { traverseGroup } from '../util/common';\nimport type { Vector2 } from '../util';\n// eslint-disable-next-line no-duplicate-imports\nimport { scale, length } from '../util';\nimport type { BreakSymbol } from './type';\nimport { DEFAULT_AXIS_BREAK_SYMBOL_STYLE } from './config';\nimport type { Point } from '../core/type';\nimport { isAngleHorizontal } from './overlap/util';\n\n// 和 vutils 版本不同\nexport const clampRadian = (angle: number = 0) => {\n if (angle < 0) {\n while (angle < 0) {\n angle += tau;\n }\n } else if (angle > 0) {\n while (angle > tau) {\n angle -= tau;\n }\n }\n return angle;\n};\n\n// 判断数值是否在制定范围内,包含误差\nexport function isInRange(a: number, min: number, max: number) {\n return !isLess(a, min, 0, 1e-6) && !isGreater(a, max, 0, 1e-6);\n}\n\nexport function getCircleLabelPosition(tickPosition: Point, tickVector: [number, number]) {\n return {\n x: tickPosition.x + tickVector[0],\n y: tickPosition.y + tickVector[1]\n };\n}\n\nexport function getAxisBreakSymbolAttrs(props: BreakSymbol = {}) {\n const { style = {}, angle = Math.PI * 0.5 } = props;\n const symbolStyle = merge({}, DEFAULT_AXIS_BREAK_SYMBOL_STYLE, style);\n const symbolSize = symbolStyle.size ?? DEFAULT_AXIS_BREAK_SYMBOL_STYLE.size;\n return {\n ...symbolStyle,\n symbolType:\n symbolStyle.symbolType ??\n `M ${-symbolSize / 2} ${symbolSize * Math.sin(angle)} L ${symbolSize / 2} ${-symbolSize * Math.sin(angle)}`,\n symbolSize\n };\n}\nexport function getElMap(g: IGroup) {\n const elMap: Dict<IGraphic> = {};\n traverseGroup(g, (el: IGraphic) => {\n if ((el as IGraphic).type !== 'group' && el.id) {\n elMap[el.id] = el;\n }\n });\n return elMap;\n}\n\nexport function getVerticalCoord(point: Point, vector: Vector2): Point {\n return {\n x: point.x + vector[0],\n y: point.y + vector[1]\n };\n}\n\nexport function getCircleVerticalVector(\n offset: number,\n point: Point,\n center: Point,\n inside = false,\n axisInside = false\n): Vector2 {\n const vector: [number, number] = [point.x - center.x, point.y - center.y];\n return scale(vector, ((inside ? -1 : 1) * (axisInside ? -1 : 1) * offset) / length(vector));\n}\n\n/**\n * 计算对应角度下的角度轴标签定位属性\n * @param angle 弧度角,需要注意是逆时针计算的\n * @returns\n */\nexport function angleLabelOrientAttribute(angle: number) {\n let align: TextAlignType = 'center';\n let baseline: TextBaselineType = 'middle';\n\n angle = normalizeAngle(angle);\n\n // left: 5/3 - 1/3; right: 2/3 - 4/3; center: 5/3 - 1/3 & 2/3 - 4/3\n if (angle >= Math.PI * (5 / 3) || angle <= Math.PI * (1 / 3)) {\n align = 'left';\n } else if (angle >= Math.PI * (2 / 3) && angle <= Math.PI * (4 / 3)) {\n align = 'right';\n } else {\n align = 'center';\n }\n\n // bottom: 7/6 - 11/6; top: 1/6 - 5/6; middle: 11/6 - 1/6 & 5/6 - 7/6\n if (angle >= Math.PI * (7 / 6) && angle <= Math.PI * (11 / 6)) {\n baseline = 'bottom';\n } else if (angle >= Math.PI * (1 / 6) && angle <= Math.PI * (5 / 6)) {\n baseline = 'top';\n } else {\n baseline = 'middle';\n }\n\n return { align, baseline };\n}\n\nexport function getPolarAngleLabelPosition(\n angle: number,\n center: { x: number; y: number },\n radius: number,\n labelOffset: number,\n inside: boolean\n) {\n const point = polarToCartesian({ x: 0, y: 0 }, radius, angle);\n const labelPoint = getVerticalCoord(point, getCircleVerticalVector(labelOffset, point, center, inside));\n const vector = getCircleVerticalVector(labelOffset || 1, labelPoint, center, inside);\n return getCircleLabelPosition(labelPoint, vector);\n}\n\nexport function getCirclePoints(center: Point, count: number, radius: number, startAngle: number, endAngle: number) {\n const points: Point[] = [];\n const range = endAngle - startAngle;\n for (let i = 0; i < count; i++) {\n const angle = startAngle + (i * range) / count;\n points.push(polarToCartesian(center, radius, angle));\n }\n return points;\n}\n\nexport function getPolygonPath(points: Point[], closed: boolean) {\n let path = '';\n if (points.length === 0) {\n return path;\n }\n points.forEach((point, index) => {\n if (index === 0) {\n path = `M${point.x},${point.y}`;\n } else {\n path += `L${point.x},${point.y}`;\n }\n });\n if (closed) {\n path += 'Z';\n }\n\n return path;\n}\n\nexport function textIntersect(textA: IText, textB: IText, sep: number) {\n let a: IBounds;\n let b: IBounds;\n // 注意:默认旋转角度一样\n const angle = textA.attribute?.angle;\n const isHorizontal = isAngleHorizontal(angle, Number.EPSILON);\n const isAABBIntersects = (textA: IText, textB: IText, sep: number) => {\n a = textA.AABBBounds;\n b = textB.AABBBounds;\n return sep > Math.max(b.x1 - a.x2, a.x1 - b.x2, b.y1 - a.y2, a.y1 - b.y2);\n };\n\n // 水平文字可以直接用 AABB 包围盒计算\n if (isHorizontal) {\n return isAABBIntersects(textA, textB, sep);\n }\n\n a = textA.OBBBounds;\n b = textB.OBBBounds;\n\n // 没有 OBB bounds 则用 AABB 包围盒计算\n if (!a || !b || a.empty() || b.empty()) {\n return isAABBIntersects(textA, textB, sep);\n }\n\n // 非水平文字且有 OBB 包围盒\n // TODO: 待支持有旋转角度下的 sep 计算逻辑\n return a.intersects(b);\n // const expandedTextA = textA.clone();\n // const boundsPaddingA = textA.attribute.boundsPadding ?? 0;\n // expandedTextA.setAttributes({\n // boundsPadding: isNumber(boundsPaddingA) ? boundsPaddingA + sep / 2 : boundsPaddingA.map(v => v + sep / 2)\n // });\n // const expandTextB = textB.clone();\n // const boundsPaddingB = textB.attribute.boundsPadding ?? 0;\n\n // expandTextB.setAttributes({\n // boundsPadding: isNumber(boundsPaddingB) ? boundsPaddingB + sep / 2 : boundsPaddingB.map(v => v + sep / 2)\n // });\n\n // return expandedTextA.OBBBounds.intersects(expandTextB.OBBBounds);\n}\n\nexport function hasOverlap<T>(items: IText[], pad: number): boolean {\n for (let i = 1, n = items.length, a = items[0], b; i < n; a = b, ++i) {\n b = items[i];\n if (textIntersect(a, b, pad)) {\n return true;\n }\n }\n return false;\n}\n"]}
1
+ {"version":3,"sources":["../src/axis/util.ts"],"names":[],"mappings":"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","file":"util.js","sourcesContent":["// eslint-disable-next-line no-duplicate-imports\nimport type { IGraphic, IGroup, IText, TextAlignType, TextBaselineType } from '@visactor/vrender-core';\nimport type { Dict, IBounds, IOBBBounds } from '@visactor/vutils';\n// eslint-disable-next-line no-duplicate-imports\nimport {\n isGreater,\n isLess,\n tau,\n normalizeAngle,\n polarToCartesian,\n merge,\n obbSeparation,\n aabbSeparation\n} from '@visactor/vutils';\nimport { traverseGroup } from '../util/common';\nimport type { Vector2 } from '../util';\n// eslint-disable-next-line no-duplicate-imports\nimport { scale, length } from '../util';\nimport type { BreakSymbol } from './type';\nimport { DEFAULT_AXIS_BREAK_SYMBOL_STYLE } from './config';\nimport type { Point } from '../core/type';\nimport { isAngleHorizontal } from './overlap/util';\n\n// 和 vutils 版本不同\nexport const clampRadian = (angle: number = 0) => {\n if (angle < 0) {\n while (angle < 0) {\n angle += tau;\n }\n } else if (angle > 0) {\n while (angle > tau) {\n angle -= tau;\n }\n }\n return angle;\n};\n\n// 判断数值是否在制定范围内,包含误差\nexport function isInRange(a: number, min: number, max: number) {\n return !isLess(a, min, 0, 1e-6) && !isGreater(a, max, 0, 1e-6);\n}\n\nexport function getCircleLabelPosition(tickPosition: Point, tickVector: [number, number]) {\n return {\n x: tickPosition.x + tickVector[0],\n y: tickPosition.y + tickVector[1]\n };\n}\n\nexport function getAxisBreakSymbolAttrs(props: BreakSymbol = {}) {\n const { style = {}, angle = Math.PI * 0.5 } = props;\n const symbolStyle = merge({}, DEFAULT_AXIS_BREAK_SYMBOL_STYLE, style);\n const symbolSize = symbolStyle.size ?? DEFAULT_AXIS_BREAK_SYMBOL_STYLE.size;\n return {\n ...symbolStyle,\n symbolType:\n symbolStyle.symbolType ??\n `M ${-symbolSize / 2} ${symbolSize * Math.sin(angle)} L ${symbolSize / 2} ${-symbolSize * Math.sin(angle)}`,\n symbolSize\n };\n}\nexport function getElMap(g: IGroup) {\n const elMap: Dict<IGraphic> = {};\n traverseGroup(g, (el: IGraphic) => {\n if ((el as IGraphic).type !== 'group' && el.id) {\n elMap[el.id] = el;\n }\n });\n return elMap;\n}\n\nexport function getVerticalCoord(point: Point, vector: Vector2): Point {\n return {\n x: point.x + vector[0],\n y: point.y + vector[1]\n };\n}\n\nexport function getCircleVerticalVector(\n offset: number,\n point: Point,\n center: Point,\n inside = false,\n axisInside = false\n): Vector2 {\n const vector: [number, number] = [point.x - center.x, point.y - center.y];\n return scale(vector, ((inside ? -1 : 1) * (axisInside ? -1 : 1) * offset) / length(vector));\n}\n\n/**\n * 计算对应角度下的角度轴标签定位属性\n * @param angle 弧度角,需要注意是逆时针计算的\n * @returns\n */\nexport function angleLabelOrientAttribute(angle: number) {\n let align: TextAlignType = 'center';\n let baseline: TextBaselineType = 'middle';\n\n angle = normalizeAngle(angle);\n\n // left: 5/3 - 1/3; right: 2/3 - 4/3; center: 5/3 - 1/3 & 2/3 - 4/3\n if (angle >= Math.PI * (5 / 3) || angle <= Math.PI * (1 / 3)) {\n align = 'left';\n } else if (angle >= Math.PI * (2 / 3) && angle <= Math.PI * (4 / 3)) {\n align = 'right';\n } else {\n align = 'center';\n }\n\n // bottom: 7/6 - 11/6; top: 1/6 - 5/6; middle: 11/6 - 1/6 & 5/6 - 7/6\n if (angle >= Math.PI * (7 / 6) && angle <= Math.PI * (11 / 6)) {\n baseline = 'bottom';\n } else if (angle >= Math.PI * (1 / 6) && angle <= Math.PI * (5 / 6)) {\n baseline = 'top';\n } else {\n baseline = 'middle';\n }\n\n return { align, baseline };\n}\n\nexport function getPolarAngleLabelPosition(\n angle: number,\n center: { x: number; y: number },\n radius: number,\n labelOffset: number,\n inside: boolean\n) {\n const point = polarToCartesian({ x: 0, y: 0 }, radius, angle);\n const labelPoint = getVerticalCoord(point, getCircleVerticalVector(labelOffset, point, center, inside));\n const vector = getCircleVerticalVector(labelOffset || 1, labelPoint, center, inside);\n return getCircleLabelPosition(labelPoint, vector);\n}\n\nexport function getCirclePoints(center: Point, count: number, radius: number, startAngle: number, endAngle: number) {\n const points: Point[] = [];\n const range = endAngle - startAngle;\n for (let i = 0; i < count; i++) {\n const angle = startAngle + (i * range) / count;\n points.push(polarToCartesian(center, radius, angle));\n }\n return points;\n}\n\nexport function getPolygonPath(points: Point[], closed: boolean) {\n let path = '';\n if (points.length === 0) {\n return path;\n }\n points.forEach((point, index) => {\n if (index === 0) {\n path = `M${point.x},${point.y}`;\n } else {\n path += `L${point.x},${point.y}`;\n }\n });\n if (closed) {\n path += 'Z';\n }\n\n return path;\n}\n\nexport function textIntersect(textA: IText, textB: IText, sep: number) {\n // 注意:默认旋转角度一样\n const angle = textA.attribute?.angle;\n const isHorizontal = isAngleHorizontal(angle, Number.EPSILON);\n\n // 水平文字可以直接用 AABB 包围盒计算\n if (isHorizontal) {\n return sep > aabbSeparation(textA.AABBBounds, textB.AABBBounds);\n }\n\n const a = textA.OBBBounds;\n const b = textB.OBBBounds;\n\n // 没有 OBB bounds 则用 AABB 包围盒计算\n if (!a || !b || a.empty() || b.empty()) {\n return sep > aabbSeparation(textA.AABBBounds, textB.AABBBounds);\n }\n // 非水平文字且有 OBB 包围盒\n return a.intersects(b) || sep > obbSeparation(a as IOBBBounds, b as IOBBBounds);\n // const expandedTextA = textA.clone();\n // const boundsPaddingA = textA.attribute.boundsPadding ?? 0;\n // expandedTextA.setAttributes({\n // boundsPadding: isNumber(boundsPaddingA) ? boundsPaddingA + sep / 2 : boundsPaddingA.map(v => v + sep / 2)\n // });\n // const expandTextB = textB.clone();\n // const boundsPaddingB = textB.attribute.boundsPadding ?? 0;\n\n // expandTextB.setAttributes({\n // boundsPadding: isNumber(boundsPaddingB) ? boundsPaddingB + sep / 2 : boundsPaddingB.map(v => v + sep / 2)\n // });\n\n // return expandedTextA.OBBBounds.intersects(expandTextB.OBBBounds);\n}\n\nexport function hasOverlap<T>(items: IText[], pad: number): boolean {\n for (let i = 1, n = items.length, a = items[0], b; i < n; a = b, ++i) {\n b = items[i];\n if (textIntersect(a, b, pad)) {\n return true;\n }\n }\n return false;\n}\n"]}
@@ -7,7 +7,7 @@ export declare class Brush extends AbstractComponent<Required<BrushAttributes>>
7
7
  static defaultAttributes: {
8
8
  trigger: string;
9
9
  updateTrigger: string;
10
- endTrigger: string;
10
+ endTrigger: string[];
11
11
  resetTrigger: string;
12
12
  hasMask: boolean;
13
13
  brushMode: string;
@@ -23,17 +23,15 @@ export declare class Brush extends AbstractComponent<Required<BrushAttributes>>
23
23
  delayType: string;
24
24
  delayTime: number;
25
25
  interactiveRange: {
26
- y1: number;
27
- y2: number;
28
- x1: number;
29
- x2: number;
26
+ minY: number;
27
+ maxY: number;
28
+ minX: number;
29
+ maxX: number;
30
30
  };
31
31
  };
32
32
  private _container;
33
33
  private _activeDrawState;
34
34
  private _cacheDrawPoints;
35
- private _isDrawedBeforeEnd;
36
- private _isDownBeforeUpOutside;
37
35
  private _activeMoveState;
38
36
  private _operatingMaskMoveDx;
39
37
  private _operatingMaskMoveDy;
@@ -42,9 +40,10 @@ export declare class Brush extends AbstractComponent<Required<BrushAttributes>>
42
40
  private _cacheMovePoint;
43
41
  private _operatingMask;
44
42
  private _brushMaskAABBBoundsDict;
43
+ private _firstUpdate;
44
+ private _startPos;
45
45
  constructor(attributes: BrushAttributes, options?: ComponentOptions);
46
46
  private _bindBrushEvents;
47
- private _isPosInBrushMask;
48
47
  private _onBrushStart;
49
48
  private _onBrushing;
50
49
  private _onBrushingWithDelay;
@@ -54,13 +53,20 @@ export declare class Brush extends AbstractComponent<Required<BrushAttributes>>
54
53
  private _initMove;
55
54
  private _drawing;
56
55
  private _moving;
56
+ private _drawEnd;
57
+ private _moveEnd;
58
+ protected render(): void;
59
+ releaseBrushEvents(): void;
60
+ private _releaseBrushUpdateEvents;
57
61
  private _computeMaskPoints;
58
62
  private _addBrushMask;
63
+ private _isPosInBrushMask;
59
64
  private _outOfInteractiveRange;
60
65
  protected eventPosToStagePos(e: FederatedPointerEvent): {
61
66
  x: number;
62
67
  y: number;
63
68
  };
64
- protected render(): void;
65
- releaseBrushEvents(): void;
69
+ private _dispatchBrushEvent;
70
+ private _clearMask;
71
+ private _isEmptyMask;
66
72
  }
package/es/brush/brush.js CHANGED
@@ -1,6 +1,6 @@
1
- import { graphicCreator, vglobal } from "@visactor/vrender-core";
1
+ import { graphicCreator } from "@visactor/vrender-core";
2
2
 
3
- import { array, cloneDeep, debounce, merge, polygonContainPoint, throttle } from "@visactor/vutils";
3
+ import { array, cloneDeep, debounce, isEmpty, merge, polygonContainPoint, throttle } from "@visactor/vutils";
4
4
 
5
5
  import { AbstractComponent } from "../core/base";
6
6
 
@@ -20,80 +20,41 @@ loadBrushComponent();
20
20
  export class Brush extends AbstractComponent {
21
21
  constructor(attributes, options) {
22
22
  super((null == options ? void 0 : options.skipDefault) ? attributes : merge({}, Brush.defaultAttributes, attributes)),
23
- this.name = "brush", this._activeDrawState = !1, this._cacheDrawPoints = [], this._isDrawedBeforeEnd = !1,
24
- this._isDownBeforeUpOutside = !1, this._activeMoveState = !1, this._operatingMaskMoveDx = 0,
25
- this._operatingMaskMoveDy = 0, this._operatingMaskMoveRangeX = [ -1 / 0, 1 / 0 ],
23
+ this.name = "brush", this._activeDrawState = !1, this._cacheDrawPoints = [], this._activeMoveState = !1,
24
+ this._operatingMaskMoveDx = 0, this._operatingMaskMoveDy = 0, this._operatingMaskMoveRangeX = [ -1 / 0, 1 / 0 ],
26
25
  this._operatingMaskMoveRangeY = [ -1 / 0, 1 / 0 ], this._brushMaskAABBBoundsDict = {},
27
- this._onBrushStart = e => {
28
- var _a;
29
- if (this._outOfInteractiveRange(e)) return void (this._isDownBeforeUpOutside = !0);
30
- e.stopPropagation();
31
- const brushMoved = null === (_a = this.attribute.brushMoved) || void 0 === _a || _a;
32
- this._activeMoveState = brushMoved && this._isPosInBrushMask(e), this._activeDrawState = !this._activeMoveState,
33
- this._activeDrawState && this._initDraw(e), this._activeMoveState && this._initMove(e);
26
+ this._firstUpdate = !0, this._onBrushStart = e => {
27
+ if (this._outOfInteractiveRange(e)) return void (this._isEmptyMask() || (this._clearMask(),
28
+ this._dispatchBrushEvent(IOperateType.brushClear, e)));
29
+ const {updateTrigger: updateTrigger = DEFAULT_BRUSH_ATTRIBUTES.updateTrigger, endTrigger: endTrigger = DEFAULT_BRUSH_ATTRIBUTES.endTrigger, brushMoved: brushMoved = !0} = this.attribute;
30
+ array(updateTrigger).forEach((t => this.stage.addEventListener(t, this._onBrushingWithDelay))),
31
+ array(endTrigger).forEach((t => this.stage.addEventListener(t, this._onBrushEnd))),
32
+ e.stopPropagation(), this._firstUpdate = !0, this._activeMoveState = brushMoved && this._isPosInBrushMask(e),
33
+ this._activeDrawState = !this._activeMoveState, this._startPos = this.eventPosToStagePos(e),
34
+ this._cacheDrawPoints = [ this._startPos ];
34
35
  }, this._onBrushing = e => {
35
- this._outOfInteractiveRange(e) || ((this._activeDrawState || this._activeMoveState) && e.stopPropagation(),
36
- this._activeDrawState && this._drawing(e), this._activeMoveState && this._moving(e));
36
+ this._outOfInteractiveRange(e) || (e.stopPropagation(), this._firstUpdate ? (this._activeDrawState && this._initDraw(e),
37
+ this._activeMoveState && this._initMove(e), this._firstUpdate = !1) : (this._activeDrawState && this._drawing(e),
38
+ this._activeMoveState && this._moving(e)));
37
39
  }, this._onBrushingWithDelay = 0 === this.attribute.delayTime ? this._onBrushing : delayMap[this.attribute.delayType](this._onBrushing, this.attribute.delayTime),
38
40
  this._onBrushEnd = e => {
39
- var _a;
40
- if (!this._activeDrawState && !this._activeMoveState) return;
41
- e.preventDefault();
42
- const {removeOnClick: removeOnClick = !0} = this.attribute;
43
- this._activeDrawState && !this._isDrawedBeforeEnd && removeOnClick ? ((null === (_a = this._operatingMask) || void 0 === _a ? void 0 : _a._AABBBounds.empty()) && this._dispatchEvent(IOperateType.brushClear, {
44
- operateMask: this._operatingMask,
45
- operatedMaskAABBBounds: this._brushMaskAABBBoundsDict,
46
- event: e
47
- }), this._container.incrementalClearChild(), this._brushMaskAABBBoundsDict = {}) : (this._activeDrawState && this._dispatchEvent(IOperateType.drawEnd, {
48
- operateMask: this._operatingMask,
49
- operatedMaskAABBBounds: this._brushMaskAABBBoundsDict,
50
- event: e
51
- }), this._activeMoveState && this._dispatchEvent(IOperateType.moveEnd, {
52
- operateMask: this._operatingMask,
53
- operatedMaskAABBBounds: this._brushMaskAABBBoundsDict,
54
- event: e
55
- })), this._activeDrawState = !1, this._activeMoveState = !1, this._isDrawedBeforeEnd = !1,
56
- this._operatingMask && this._operatingMask.setAttribute("pickable", !1);
41
+ this._releaseBrushUpdateEvents(), e.preventDefault(), this._activeDrawState && this._drawEnd(e),
42
+ this._activeMoveState && this._moveEnd(e), this._activeDrawState = !1, this._activeMoveState = !1;
57
43
  }, this._onBrushClear = e => {
58
- e.preventDefault();
59
- const {removeOnClick: removeOnClick = !0} = this.attribute;
60
- this._isDownBeforeUpOutside && removeOnClick && (this._dispatchEvent(IOperateType.brushClear, {
61
- operateMask: this._operatingMask,
62
- operatedMaskAABBBounds: this._brushMaskAABBBoundsDict,
63
- event: e
64
- }), this._container.incrementalClearChild(), this._brushMaskAABBBoundsDict = {}),
65
- this._activeDrawState = !1, this._activeMoveState = !1, this._isDrawedBeforeEnd = !1,
66
- this._isDownBeforeUpOutside = !1, this._operatingMask && this._operatingMask.setAttribute("pickable", !1);
44
+ e.preventDefault(), this._isEmptyMask() || (this._clearMask(), this._dispatchBrushEvent(IOperateType.brushClear, e)),
45
+ this._activeDrawState = !1, this._activeMoveState = !1;
67
46
  };
68
47
  }
69
48
  _bindBrushEvents() {
70
- if (this.attribute.disableTriggerEvent) return;
71
- const {trigger: trigger = DEFAULT_BRUSH_ATTRIBUTES.trigger, updateTrigger: updateTrigger = DEFAULT_BRUSH_ATTRIBUTES.updateTrigger, endTrigger: endTrigger = DEFAULT_BRUSH_ATTRIBUTES.endTrigger, resetTrigger: resetTrigger = DEFAULT_BRUSH_ATTRIBUTES.resetTrigger} = this.attribute;
72
- array(trigger).forEach((t => vglobal.addEventListener(t, this._onBrushStart))),
73
- array(updateTrigger).forEach((t => this.stage.addEventListener(t, this._onBrushingWithDelay))),
74
- array(endTrigger).forEach((t => this.stage.addEventListener(t, this._onBrushEnd))),
49
+ if (this.releaseBrushEvents(), this.attribute.disableTriggerEvent) return;
50
+ const {trigger: trigger = DEFAULT_BRUSH_ATTRIBUTES.trigger, resetTrigger: resetTrigger = DEFAULT_BRUSH_ATTRIBUTES.resetTrigger} = this.attribute;
51
+ array(trigger).forEach((t => this.stage.addEventListener(t, this._onBrushStart))),
75
52
  array(resetTrigger).forEach((t => this.stage.addEventListener(t, this._onBrushClear)));
76
53
  }
77
- _isPosInBrushMask(e) {
78
- const pos = this.eventPosToStagePos(e), brushMasks = this._container.getChildren();
79
- for (let i = 0; i < brushMasks.length; i++) {
80
- const {points: points = [], dx: dx = 0, dy: dy = 0} = brushMasks[i].attribute, pointsConsiderOffset = points.map((point => ({
81
- x: point.x + dx,
82
- y: point.y + dy
83
- })));
84
- if (polygonContainPoint(pointsConsiderOffset, pos.x, pos.y)) return this._operatingMask = brushMasks[i],
85
- !0;
86
- }
87
- return !1;
88
- }
89
54
  _initDraw(e) {
90
55
  const {brushMode: brushMode} = this.attribute, pos = this.eventPosToStagePos(e);
91
- this._cacheDrawPoints = [ pos ], this._isDrawedBeforeEnd = !1, "single" === brushMode && (this._brushMaskAABBBoundsDict = {},
92
- this._container.incrementalClearChild()), this._addBrushMask(), this._dispatchEvent(IOperateType.drawStart, {
93
- operateMask: this._operatingMask,
94
- operatedMaskAABBBounds: this._brushMaskAABBBoundsDict,
95
- event: e
96
- });
56
+ this._cacheDrawPoints.push(pos), "single" === brushMode && this._clearMask(), this._addBrushMask(),
57
+ this._dispatchBrushEvent(IOperateType.drawStart, e), 1 === Object.keys(this._brushMaskAABBBoundsDict).length && this._dispatchBrushEvent(IOperateType.brushActive, e);
97
58
  }
98
59
  _initMove(e) {
99
60
  var _a, _b;
@@ -101,30 +62,18 @@ export class Brush extends AbstractComponent {
101
62
  this._operatingMaskMoveDy = null !== (_b = this._operatingMask.attribute.dy) && void 0 !== _b ? _b : 0;
102
63
  const {interactiveRange: interactiveRange} = this.attribute, {minY: minY = -1 / 0, maxY: maxY = 1 / 0, minX: minX = -1 / 0, maxX: maxX = 1 / 0} = interactiveRange, {x1: x1, x2: x2, y1: y1, y2: y2} = this._operatingMask.globalAABBBounds, minMoveStepX = minX - x1, maxMoveStepX = maxX - x2, minMoveStepY = minY - y1, maxMoveStepY = maxY - y2;
103
64
  this._operatingMaskMoveRangeX = [ minMoveStepX, maxMoveStepX ], this._operatingMaskMoveRangeY = [ minMoveStepY, maxMoveStepY ],
104
- this._operatingMask.setAttribute("pickable", !0), this._dispatchEvent(IOperateType.moveStart, {
105
- operateMask: this._operatingMask,
106
- operatedMaskAABBBounds: this._brushMaskAABBBoundsDict,
107
- event: e
108
- });
65
+ this._operatingMask.setAttribute("pickable", !0), this._dispatchBrushEvent(IOperateType.moveStart, e);
109
66
  }
110
67
  _drawing(e) {
111
- var _a, _b;
112
- const pos = this.eventPosToStagePos(e), {sizeThreshold: sizeThreshold = DEFAULT_SIZE_THRESHOLD, brushType: brushType} = this.attribute, cacheLength = this._cacheDrawPoints.length;
68
+ var _a;
69
+ const pos = this.eventPosToStagePos(e), {brushType: brushType} = this.attribute, cacheLength = this._cacheDrawPoints.length;
113
70
  if (cacheLength > 0) {
114
71
  const lastPos = null !== (_a = this._cacheDrawPoints[this._cacheDrawPoints.length - 1]) && void 0 !== _a ? _a : {};
115
72
  if (pos.x === lastPos.x && pos.y === lastPos.y) return;
116
73
  }
117
74
  "polygon" === brushType || cacheLength <= 1 ? this._cacheDrawPoints.push(pos) : this._cacheDrawPoints[cacheLength - 1] = pos;
118
75
  const maskPoints = this._computeMaskPoints();
119
- this._operatingMask.setAttribute("points", maskPoints);
120
- const {x1: x1 = 0, x2: x2 = 0, y1: y1 = 0, y2: y2 = 0} = null === (_b = this._operatingMask) || void 0 === _b ? void 0 : _b._AABBBounds;
121
- this._isDrawedBeforeEnd = !this._operatingMask._AABBBounds.empty() && !!(Math.abs(x2 - x1) > sizeThreshold || Math.abs(y1 - y2) > sizeThreshold),
122
- this._isDrawedBeforeEnd && (this._brushMaskAABBBoundsDict[this._operatingMask.name] = this._operatingMask.AABBBounds,
123
- this._dispatchEvent(IOperateType.drawing, {
124
- operateMask: this._operatingMask,
125
- operatedMaskAABBBounds: this._brushMaskAABBBoundsDict,
126
- event: e
127
- }));
76
+ this._operatingMask.setAttribute("points", maskPoints), this._dispatchBrushEvent(IOperateType.drawing, e);
128
77
  }
129
78
  _moving(e) {
130
79
  const startPos = this._cacheMovePoint, pos = this.eventPosToStagePos(e);
@@ -134,11 +83,37 @@ export class Brush extends AbstractComponent {
134
83
  dx: moveX,
135
84
  dy: moveY
136
85
  }), this._brushMaskAABBBoundsDict[this._operatingMask.name] = this._operatingMask.AABBBounds,
137
- this._dispatchEvent(IOperateType.moving, {
138
- operateMask: this._operatingMask,
139
- operatedMaskAABBBounds: this._brushMaskAABBBoundsDict,
140
- event: e
141
- });
86
+ this._dispatchBrushEvent(IOperateType.moving, e);
87
+ }
88
+ _drawEnd(e) {
89
+ const {removeOnClick: removeOnClick = !0, sizeThreshold: sizeThreshold = DEFAULT_SIZE_THRESHOLD} = this.attribute;
90
+ if (this._outOfInteractiveRange(e)) this._isEmptyMask() || (this._clearMask(), this._dispatchBrushEvent(IOperateType.brushClear, e)); else {
91
+ const {x: x1, y: y1} = this._startPos, {x: x2, y: y2} = this.eventPosToStagePos(e);
92
+ Math.abs(x2 - x1) <= 1 && Math.abs(y2 - y1) <= 1 && removeOnClick ? this._isEmptyMask() || (this._clearMask(),
93
+ this._dispatchBrushEvent(IOperateType.brushClear, e)) : Math.abs(x2 - x1) < sizeThreshold && Math.abs(y1 - y2) < sizeThreshold ? (delete this._brushMaskAABBBoundsDict[this._operatingMask.name],
94
+ this._container.setAttributes({}), this._container.removeChild(this._operatingMask),
95
+ this._isEmptyMask() && this._dispatchBrushEvent(IOperateType.brushClear, e)) : (this._brushMaskAABBBoundsDict[this._operatingMask.name] = this._operatingMask.AABBBounds,
96
+ this._dispatchBrushEvent(IOperateType.drawEnd, e));
97
+ }
98
+ }
99
+ _moveEnd(e) {
100
+ this._operatingMask && this._operatingMask.setAttribute("pickable", !1), this._dispatchBrushEvent(IOperateType.moveEnd, e);
101
+ }
102
+ render() {
103
+ this._bindBrushEvents();
104
+ const group = this.createOrUpdateChild("brush-container", {}, "group");
105
+ this._container = group;
106
+ }
107
+ releaseBrushEvents() {
108
+ const {trigger: trigger = DEFAULT_BRUSH_ATTRIBUTES.trigger, resetTrigger: resetTrigger = DEFAULT_BRUSH_ATTRIBUTES.resetTrigger} = this.attribute;
109
+ array(trigger).forEach((t => this.stage.removeEventListener(t, this._onBrushStart))),
110
+ array(resetTrigger).forEach((t => this.stage.removeEventListener(t, this._onBrushClear))),
111
+ this._releaseBrushUpdateEvents();
112
+ }
113
+ _releaseBrushUpdateEvents() {
114
+ const {updateTrigger: updateTrigger = DEFAULT_BRUSH_ATTRIBUTES.updateTrigger, endTrigger: endTrigger = DEFAULT_BRUSH_ATTRIBUTES.endTrigger} = this.attribute;
115
+ array(updateTrigger).forEach((t => this.stage.removeEventListener(t, this._onBrushingWithDelay))),
116
+ array(endTrigger).forEach((t => this.stage.removeEventListener(t, this._onBrushEnd)));
142
117
  }
143
118
  _computeMaskPoints() {
144
119
  const {brushType: brushType, xRange: xRange = [ 0, 0 ], yRange: yRange = [ 0, 0 ]} = this.attribute;
@@ -188,6 +163,18 @@ export class Brush extends AbstractComponent {
188
163
  brushMask.name = `brush-${Date.now()}`, this._operatingMask = brushMask, this._container.add(brushMask),
189
164
  this._brushMaskAABBBoundsDict[brushMask.name] = brushMask.AABBBounds;
190
165
  }
166
+ _isPosInBrushMask(e) {
167
+ const pos = this.eventPosToStagePos(e), brushMasks = this._container.getChildren();
168
+ for (let i = 0; i < brushMasks.length; i++) {
169
+ const {points: points = [], dx: dx = 0, dy: dy = 0} = brushMasks[i].attribute, pointsConsiderOffset = points.map((point => ({
170
+ x: point.x + dx,
171
+ y: point.y + dy
172
+ })));
173
+ if (polygonContainPoint(pointsConsiderOffset, pos.x, pos.y)) return this._operatingMask = brushMasks[i],
174
+ !0;
175
+ }
176
+ return !1;
177
+ }
191
178
  _outOfInteractiveRange(e) {
192
179
  const {interactiveRange: interactiveRange} = this.attribute, {minY: minY = -1 / 0, maxY: maxY = 1 / 0, minX: minX = -1 / 0, maxX: maxX = 1 / 0} = interactiveRange, pos = this.eventPosToStagePos(e);
193
180
  return pos.x > maxX || pos.x < minX || pos.y > maxY || pos.y < minY;
@@ -195,17 +182,18 @@ export class Brush extends AbstractComponent {
195
182
  eventPosToStagePos(e) {
196
183
  return this.stage.eventPointTransform(e);
197
184
  }
198
- render() {
199
- this._bindBrushEvents();
200
- const group = this.createOrUpdateChild("brush-container", {}, "group");
201
- this._container = group;
185
+ _dispatchBrushEvent(operateType, e) {
186
+ this._dispatchEvent(operateType, {
187
+ operateMask: this._operatingMask,
188
+ operatedMaskAABBBounds: this._brushMaskAABBBoundsDict,
189
+ event: e
190
+ });
202
191
  }
203
- releaseBrushEvents() {
204
- const {delayType: delayType = "throttle", delayTime: delayTime = 0, trigger: trigger = DEFAULT_BRUSH_ATTRIBUTES.trigger, updateTrigger: updateTrigger = DEFAULT_BRUSH_ATTRIBUTES.updateTrigger, endTrigger: endTrigger = DEFAULT_BRUSH_ATTRIBUTES.endTrigger, resetTrigger: resetTrigger = DEFAULT_BRUSH_ATTRIBUTES.resetTrigger} = this.attribute;
205
- array(trigger).forEach((t => vglobal.removeEventListener(t, this._onBrushStart))),
206
- array(updateTrigger).forEach((t => this.stage.removeEventListener(t, this._onBrushingWithDelay))),
207
- array(endTrigger).forEach((t => this.stage.removeEventListener(t, this._onBrushEnd))),
208
- array(resetTrigger).forEach((t => this.stage.removeEventListener(t, this._onBrushClear)));
192
+ _clearMask() {
193
+ this._brushMaskAABBBoundsDict = {}, this._container.incrementalClearChild(), this._operatingMask = null;
194
+ }
195
+ _isEmptyMask() {
196
+ return isEmpty(this._brushMaskAABBBoundsDict) || Object.keys(this._brushMaskAABBBoundsDict).every((key => this._brushMaskAABBBoundsDict[key].empty()));
209
197
  }
210
198
  }
211
199
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/brush/brush.ts"],"names":[],"mappings":"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","file":"brush.js","sourcesContent":["/**\n * @description 框选组件\n */\nimport type { FederatedPointerEvent, IGroup, IPolygon } from '@visactor/vrender-core';\n// eslint-disable-next-line no-duplicate-imports\nimport { graphicCreator, vglobal } from '@visactor/vrender-core';\nimport type { IBounds, IPointLike } from '@visactor/vutils';\n// eslint-disable-next-line no-duplicate-imports\nimport { array, cloneDeep, debounce, merge, polygonContainPoint, throttle } from '@visactor/vutils';\nimport { AbstractComponent } from '../core/base';\nimport type { BrushAttributes } from './type';\n// eslint-disable-next-line no-duplicate-imports\nimport { IOperateType } from './type';\nimport { DEFAULT_BRUSH_ATTRIBUTES, DEFAULT_SIZE_THRESHOLD } from './config';\nimport type { ComponentOptions } from '../interface';\nimport { loadBrushComponent } from './register';\n\nconst delayMap = {\n debounce: debounce,\n throttle: throttle\n};\n\nloadBrushComponent();\nexport class Brush extends AbstractComponent<Required<BrushAttributes>> {\n name = 'brush';\n static defaultAttributes = DEFAULT_BRUSH_ATTRIBUTES;\n\n private _container!: IGroup;\n\n // 绘制mask时的相关属性\n private _activeDrawState = false; // 用于标记绘制状态\n private _cacheDrawPoints: IPointLike[] = []; // 用于维护鼠标走过的路径,主要用于绘制mask的点\n private _isDrawedBeforeEnd = false;\n private _isDownBeforeUpOutside = false; // 用于标记出画布外单击事件,以便清空\n // 移动mask时的相关属性\n private _activeMoveState = false; // 用于标记移动状态\n private _operatingMaskMoveDx = 0; // 用于标记移动的位移量\n private _operatingMaskMoveDy = 0;\n private _operatingMaskMoveRangeX: [number, number] = [-Infinity, Infinity];\n private _operatingMaskMoveRangeY: [number, number] = [-Infinity, Infinity];\n private _cacheMovePoint!: IPointLike; // 用于维护鼠标所在位置,主要用于计算位移量\n\n private _operatingMask!: IPolygon; // 用于标记正在绘制的mask 或 正在移动的mask\n\n // 透出给上层的属性(主要是所有mask的AABBBounds,这里用的是dict存储方便添加和修改)\n private _brushMaskAABBBoundsDict: { [name: string]: IBounds } = {};\n\n constructor(attributes: BrushAttributes, options?: ComponentOptions) {\n super(options?.skipDefault ? attributes : merge({}, Brush.defaultAttributes, attributes));\n }\n\n private _bindBrushEvents(): void {\n if (this.attribute.disableTriggerEvent) {\n return;\n }\n const {\n trigger = DEFAULT_BRUSH_ATTRIBUTES.trigger,\n updateTrigger = DEFAULT_BRUSH_ATTRIBUTES.updateTrigger,\n endTrigger = DEFAULT_BRUSH_ATTRIBUTES.endTrigger,\n resetTrigger = DEFAULT_BRUSH_ATTRIBUTES.resetTrigger\n } = this.attribute as BrushAttributes;\n // 拖拽绘制开始\n array(trigger).forEach(t => vglobal.addEventListener(t, this._onBrushStart as EventListener));\n\n // 拖拽绘制时\n array(updateTrigger).forEach(t => this.stage.addEventListener(t, this._onBrushingWithDelay as EventListener));\n // 拖拽绘制结束\n array(endTrigger).forEach(t => this.stage.addEventListener(t, this._onBrushEnd as EventListener));\n array(resetTrigger).forEach(t => this.stage.addEventListener(t, this._onBrushClear as EventListener));\n }\n\n private _isPosInBrushMask(e: FederatedPointerEvent) {\n const pos = this.eventPosToStagePos(e);\n const brushMasks = this._container.getChildren();\n for (let i = 0; i < brushMasks.length; i++) {\n const { points = [], dx = 0, dy = 0 } = (brushMasks[i] as IPolygon).attribute;\n const pointsConsiderOffset: IPointLike[] = points.map((point: IPointLike) => {\n return {\n x: point.x + dx,\n y: point.y + dy\n };\n });\n if (polygonContainPoint(pointsConsiderOffset, pos.x, pos.y)) {\n this._operatingMask = brushMasks[i] as IPolygon;\n return true;\n }\n }\n return false;\n }\n\n /**\n * 开始绘制 或 移动\n * @description\n * 1. 判断状态: 如果在brushMask中,则属于移动状态; 否则属于绘制状态\n *(移动状态和绘制状态互斥, 且移动状态考虑brushMoved配置, 如果在brush点内但brushMoved为false, 则走绘制状态, 而非两个状态都不响应, 此效果与echarts保持一致)\n * 2. 判断坐标是否在有效交互范围内\n * 2. 如果是移动状态: 标记移动状态 & 标记正在移动的mask & 初始化mask的dx和dy\n * 3. 如果是绘制状态: 标记绘制状态 & 标记正在绘制的mask & 清除之前的mask & 添加新的mask\n */\n private _onBrushStart = (e: FederatedPointerEvent) => {\n if (this._outOfInteractiveRange(e)) {\n this._isDownBeforeUpOutside = true;\n return;\n }\n e.stopPropagation();\n\n const brushMoved = this.attribute.brushMoved ?? true;\n this._activeMoveState = brushMoved && this._isPosInBrushMask(e); // 如果是移动状态,在这里会标记operatingMask为正在移动的mask\n this._activeDrawState = !this._activeMoveState;\n\n this._activeDrawState && this._initDraw(e); // 如果是绘制状态,在这里会标记operatingMask为正在绘制的mask\n this._activeMoveState && this._initMove(e);\n };\n\n /**\n * 绘制 或 移动 中\n * @description\n * 1. 如果是绘制状态: 更新_cacheDrawPoints 和 mask的points属性\n * 2. 如果是移动状态: 标记移动状态 & 计算位移量 & 给被移动的mask偏移属性\n */\n private _onBrushing = (e: FederatedPointerEvent) => {\n if (this._outOfInteractiveRange(e)) {\n return;\n }\n\n if (this._activeDrawState || this._activeMoveState) {\n e.stopPropagation();\n }\n\n this._activeDrawState && this._drawing(e); // 如果是绘制状态,在这里会标记operatingMask为正在绘制的mask\n this._activeMoveState && this._moving(e);\n };\n\n private _onBrushingWithDelay =\n this.attribute.delayTime === 0\n ? this._onBrushing\n : delayMap[this.attribute.delayType](this._onBrushing, this.attribute.delayTime);\n\n /**\n * 结束绘制 和 移动\n * @description 取消绘制 和 移动 状态\n */\n private _onBrushEnd = (e: FederatedPointerEvent) => {\n if (!this._activeDrawState && !this._activeMoveState) {\n return;\n }\n\n e.preventDefault();\n const { removeOnClick = true } = this.attribute as BrushAttributes;\n if (this._activeDrawState && !this._isDrawedBeforeEnd && removeOnClick) {\n // _isDrawedBeforeEnd有两种情况:\n // 1. 没有绘制mask\n // 2. 绘制了mask但没有超过阈值\n // 只有第2种情况才会触发clear, 可以理解为双击才触发clear\n if (this._operatingMask?._AABBBounds.empty()) {\n this._dispatchEvent(IOperateType.brushClear, {\n operateMask: this._operatingMask as any,\n operatedMaskAABBBounds: this._brushMaskAABBBoundsDict,\n event: e\n });\n }\n this._container.incrementalClearChild();\n this._brushMaskAABBBoundsDict = {};\n } else {\n if (this._activeDrawState) {\n this._dispatchEvent(IOperateType.drawEnd, {\n operateMask: this._operatingMask as any,\n operatedMaskAABBBounds: this._brushMaskAABBBoundsDict,\n event: e\n });\n }\n\n if (this._activeMoveState) {\n this._dispatchEvent(IOperateType.moveEnd, {\n operateMask: this._operatingMask as any,\n operatedMaskAABBBounds: this._brushMaskAABBBoundsDict,\n event: e\n });\n }\n }\n\n this._activeDrawState = false;\n this._activeMoveState = false;\n this._isDrawedBeforeEnd = false;\n if (this._operatingMask) {\n this._operatingMask.setAttribute('pickable', false);\n }\n };\n\n private _onBrushClear = (e: FederatedPointerEvent) => {\n e.preventDefault();\n const { removeOnClick = true } = this.attribute as BrushAttributes;\n if (this._isDownBeforeUpOutside && removeOnClick) {\n this._dispatchEvent(IOperateType.brushClear, {\n operateMask: this._operatingMask as any,\n operatedMaskAABBBounds: this._brushMaskAABBBoundsDict,\n event: e\n });\n this._container.incrementalClearChild();\n this._brushMaskAABBBoundsDict = {};\n }\n\n this._activeDrawState = false;\n this._activeMoveState = false;\n this._isDrawedBeforeEnd = false;\n this._isDownBeforeUpOutside = false;\n if (this._operatingMask) {\n this._operatingMask.setAttribute('pickable', false);\n }\n };\n\n /**\n * 初始化绘制状态\n * @description 清除之前的mask & 添加新的mask\n */\n private _initDraw(e: FederatedPointerEvent) {\n const { brushMode } = this.attribute as BrushAttributes;\n const pos = this.eventPosToStagePos(e);\n this._cacheDrawPoints = [pos];\n this._isDrawedBeforeEnd = false;\n if (brushMode === 'single') {\n this._brushMaskAABBBoundsDict = {};\n this._container.incrementalClearChild();\n }\n this._addBrushMask();\n this._dispatchEvent(IOperateType.drawStart, {\n operateMask: this._operatingMask as any,\n operatedMaskAABBBounds: this._brushMaskAABBBoundsDict,\n event: e\n });\n }\n\n /**\n * 初始化移动状态\n * @description 初始化mask的dx和dy\n */\n private _initMove(e: FederatedPointerEvent) {\n this._cacheMovePoint = this.eventPosToStagePos(e);\n\n this._operatingMaskMoveDx = this._operatingMask.attribute.dx ?? 0;\n this._operatingMaskMoveDy = this._operatingMask.attribute.dy ?? 0;\n\n // 计算最大移动范围, 为了将brushMask限制在交互范围内\n const { interactiveRange } = this.attribute as BrushAttributes;\n const { minY = -Infinity, maxY = Infinity, minX = -Infinity, maxX = Infinity } = interactiveRange;\n\n const { x1, x2, y1, y2 } = this._operatingMask.globalAABBBounds;\n const minMoveStepX = minX - x1;\n const maxMoveStepX = maxX - x2;\n const minMoveStepY = minY - y1;\n const maxMoveStepY = maxY - y2;\n\n this._operatingMaskMoveRangeX = [minMoveStepX, maxMoveStepX];\n this._operatingMaskMoveRangeY = [minMoveStepY, maxMoveStepY];\n\n this._operatingMask.setAttribute('pickable', true);\n this._dispatchEvent(IOperateType.moveStart, {\n operateMask: this._operatingMask as any,\n operatedMaskAABBBounds: this._brushMaskAABBBoundsDict,\n event: e\n });\n }\n\n /**\n * 绘制中\n * @description 更新_cacheDrawPoints 和 mask的points属性\n */\n private _drawing(e: FederatedPointerEvent) {\n const pos = this.eventPosToStagePos(e);\n const { sizeThreshold = DEFAULT_SIZE_THRESHOLD, brushType } = this.attribute as BrushAttributes;\n\n const cacheLength = this._cacheDrawPoints.length;\n\n // 如果当前点的位置和上一次点的位置一致,则无需更新\n if (cacheLength > 0) {\n const lastPos = this._cacheDrawPoints[this._cacheDrawPoints.length - 1] ?? ({} as IPointLike);\n if (pos.x === lastPos.x && pos.y === lastPos.y) {\n return;\n }\n }\n // 更新交互位置\n if (brushType === 'polygon' || cacheLength <= 1) {\n this._cacheDrawPoints.push(pos);\n } else {\n this._cacheDrawPoints[cacheLength - 1] = pos;\n }\n // 更新mask形状\n const maskPoints = this._computeMaskPoints();\n this._operatingMask.setAttribute('points', maskPoints);\n\n // 更新形状之后再判断是否需要正在绘制\n // if not, 则_isDrawedBeforeEnd false\n // then: 1. 不暴露drawing状态 2. 在brushEnd时该形状会被清空\n const { x1 = 0, x2 = 0, y1 = 0, y2 = 0 } = this._operatingMask?._AABBBounds;\n this._isDrawedBeforeEnd =\n !this._operatingMask._AABBBounds.empty() &&\n !!(Math.abs(x2 - x1) > sizeThreshold || Math.abs(y1 - y2) > sizeThreshold);\n if (this._isDrawedBeforeEnd) {\n this._brushMaskAABBBoundsDict[this._operatingMask.name] = this._operatingMask.AABBBounds;\n this._dispatchEvent(IOperateType.drawing, {\n operateMask: this._operatingMask as any,\n operatedMaskAABBBounds: this._brushMaskAABBBoundsDict,\n event: e\n });\n }\n }\n\n /**\n * 移动中\n * @description 标记移动状态 & 计算位移量 & 给被移动的mask偏移属性\n */\n private _moving(e: FederatedPointerEvent) {\n const startPos = this._cacheMovePoint;\n const pos = this.eventPosToStagePos(e);\n // 如果当前点的位置和上一次点的位置一致,则无需更新\n if (pos.x === startPos?.x && pos.y === startPos?.y) {\n return;\n }\n\n const moveStepX = pos.x - startPos.x;\n const moveStepY = pos.y - startPos.y;\n const moveX =\n Math.min(this._operatingMaskMoveRangeX[1], Math.max(this._operatingMaskMoveRangeX[0], moveStepX)) +\n this._operatingMaskMoveDx;\n const moveY =\n Math.min(this._operatingMaskMoveRangeY[1], Math.max(this._operatingMaskMoveRangeY[0], moveStepY)) +\n this._operatingMaskMoveDy;\n\n this._operatingMask.setAttributes({\n dx: moveX,\n dy: moveY\n });\n this._brushMaskAABBBoundsDict[this._operatingMask.name] = this._operatingMask.AABBBounds;\n this._dispatchEvent(IOperateType.moving, {\n operateMask: this._operatingMask as any,\n operatedMaskAABBBounds: this._brushMaskAABBBoundsDict,\n event: e\n });\n }\n\n /**\n * 构造brushMask的points属性\n * @description 根据不同的brushType从_cacheDrawPoints中取points\n * 1. 'rect': 只取鼠标轨迹_cacheDrawPoints的第一个点和最后一个点\n * 2. 'x': 只取鼠标轨迹_cacheDrawPoints的第一个点和最后一个点的x坐标\n * 3. 'y': 只取鼠标轨迹_cacheDrawPoints的第一个点和最后一个点的y坐标\n * 4. 'polygon': 取鼠标轨迹_cacheDrawPoints的所有点\n */\n private _computeMaskPoints() {\n const { brushType, xRange = [0, 0], yRange = [0, 0] } = this.attribute as BrushAttributes;\n let maskPoints: IPointLike[] = [];\n const startPoint = this._cacheDrawPoints[0];\n const endPoint = this._cacheDrawPoints[this._cacheDrawPoints.length - 1];\n\n if (brushType === 'rect') {\n maskPoints = [\n startPoint,\n {\n x: endPoint.x,\n y: startPoint.y\n },\n endPoint,\n {\n x: startPoint.x,\n y: endPoint.y\n }\n ];\n } else if (brushType === 'x') {\n maskPoints = [\n {\n x: startPoint.x,\n y: yRange[0]\n },\n {\n x: endPoint.x,\n y: yRange[0]\n },\n {\n x: endPoint.x,\n y: yRange[1]\n },\n {\n x: startPoint.x,\n y: yRange[1]\n }\n ];\n } else if (brushType === 'y') {\n maskPoints = [\n {\n x: xRange[0],\n y: startPoint.y\n },\n {\n x: xRange[0],\n y: endPoint.y\n },\n {\n x: xRange[1],\n y: endPoint.y\n },\n {\n x: xRange[1],\n y: startPoint.y\n }\n ];\n } else {\n maskPoints = cloneDeep(this._cacheDrawPoints); // _cacheDrawPoints在不断更新,所以这里需要cloneDeep\n }\n return maskPoints;\n }\n\n private _addBrushMask() {\n const { brushStyle, hasMask } = this.attribute as BrushAttributes;\n const brushMask = graphicCreator.polygon({\n points: cloneDeep(this._cacheDrawPoints), // _cacheDrawPoints在不断更新,所以这里需要cloneDeep\n cursor: 'move',\n pickable: false,\n ...brushStyle,\n opacity: hasMask ? brushStyle.opacity ?? 1 : 0\n });\n brushMask.name = `brush-${Date.now()}`; // 用Date给mask唯一标记\n this._operatingMask = brushMask;\n this._container.add(brushMask);\n this._brushMaskAABBBoundsDict[brushMask.name] = brushMask.AABBBounds;\n }\n\n private _outOfInteractiveRange(e: FederatedPointerEvent) {\n // 在返回坐标时,将其限制在交互范围内\n const { interactiveRange } = this.attribute as BrushAttributes;\n const { minY = -Infinity, maxY = Infinity, minX = -Infinity, maxX = Infinity } = interactiveRange;\n const pos = this.eventPosToStagePos(e);\n if (pos.x > maxX || pos.x < minX || pos.y > maxY || pos.y < minY) {\n return true;\n }\n return false;\n }\n\n /** 事件系统坐标转换为stage坐标 */\n protected eventPosToStagePos(e: FederatedPointerEvent) {\n return this.stage.eventPointTransform(e);\n }\n\n protected render() {\n this._bindBrushEvents();\n const group = this.createOrUpdateChild('brush-container', {}, 'group') as unknown as IGroup;\n this._container = group;\n }\n\n releaseBrushEvents(): void {\n const {\n delayType = 'throttle',\n delayTime = 0,\n trigger = DEFAULT_BRUSH_ATTRIBUTES.trigger,\n updateTrigger = DEFAULT_BRUSH_ATTRIBUTES.updateTrigger,\n endTrigger = DEFAULT_BRUSH_ATTRIBUTES.endTrigger,\n resetTrigger = DEFAULT_BRUSH_ATTRIBUTES.resetTrigger\n } = this.attribute as BrushAttributes;\n array(trigger).forEach(t => vglobal.removeEventListener(t, this._onBrushStart as EventListener));\n array(updateTrigger).forEach(t => this.stage.removeEventListener(t, this._onBrushingWithDelay as EventListener));\n array(endTrigger).forEach(t => this.stage.removeEventListener(t, this._onBrushEnd as EventListener));\n array(resetTrigger).forEach(t => this.stage.removeEventListener(t, this._onBrushClear as EventListener));\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/brush/brush.ts"],"names":[],"mappings":"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","file":"brush.js","sourcesContent":["/**\n * @description 框选组件\n */\nimport type { FederatedPointerEvent, IGroup, IPolygon } from '@visactor/vrender-core';\n// eslint-disable-next-line no-duplicate-imports\nimport { graphicCreator } from '@visactor/vrender-core';\nimport type { IBounds, IPointLike } from '@visactor/vutils';\n// eslint-disable-next-line no-duplicate-imports\nimport { array, cloneDeep, debounce, isEmpty, merge, polygonContainPoint, throttle } from '@visactor/vutils';\nimport { AbstractComponent } from '../core/base';\nimport type { BrushAttributes } from './type';\n// eslint-disable-next-line no-duplicate-imports\nimport { IOperateType } from './type';\nimport { DEFAULT_BRUSH_ATTRIBUTES, DEFAULT_SIZE_THRESHOLD } from './config';\nimport type { ComponentOptions } from '../interface';\nimport { loadBrushComponent } from './register';\n\nconst delayMap = {\n debounce: debounce,\n throttle: throttle\n};\n\nloadBrushComponent();\nexport class Brush extends AbstractComponent<Required<BrushAttributes>> {\n name = 'brush';\n static defaultAttributes = DEFAULT_BRUSH_ATTRIBUTES;\n\n private _container!: IGroup;\n\n // 绘制mask时的相关属性\n private _activeDrawState = false; // 用于标记绘制状态\n private _cacheDrawPoints: IPointLike[] = []; // 用于维护鼠标走过的路径,主要用于绘制mask的点\n // 移动mask时的相关属性\n private _activeMoveState = false; // 用于标记移动状态\n private _operatingMaskMoveDx = 0; // 用于标记移动的位移量\n private _operatingMaskMoveDy = 0;\n private _operatingMaskMoveRangeX: [number, number] = [-Infinity, Infinity];\n private _operatingMaskMoveRangeY: [number, number] = [-Infinity, Infinity];\n private _cacheMovePoint!: IPointLike; // 用于维护鼠标所在位置,主要用于计算位移量\n\n private _operatingMask!: IPolygon; // 用于标记正在绘制的mask 或 正在移动的mask\n\n // 透出给上层的属性(主要是所有mask的AABBBounds,这里用的是dict存储方便添加和修改)\n private _brushMaskAABBBoundsDict: { [name: string]: IBounds } = {};\n\n private _firstUpdate = true; // 用于标记第一次更新\n private _startPos!: IPointLike; // 用于标记开始绘制的位置\n\n constructor(attributes: BrushAttributes, options?: ComponentOptions) {\n super(options?.skipDefault ? attributes : merge({}, Brush.defaultAttributes, attributes));\n }\n\n private _bindBrushEvents(): void {\n // 绑定前先解绑, 确保事件不会重复绑定\n this.releaseBrushEvents();\n if (this.attribute.disableTriggerEvent) {\n return;\n }\n const { trigger = DEFAULT_BRUSH_ATTRIBUTES.trigger, resetTrigger = DEFAULT_BRUSH_ATTRIBUTES.resetTrigger } = this\n .attribute as BrushAttributes;\n array(trigger).forEach(t => this.stage.addEventListener(t, this._onBrushStart as EventListener));\n array(resetTrigger).forEach(t => this.stage.addEventListener(t, this._onBrushClear as EventListener));\n }\n\n /**\n * 开始绘制 或 移动\n * @description\n * 1. 判断状态: 如果在brushMask中,则属于移动状态; 否则属于绘制状态\n *(移动状态和绘制状态互斥, 且移动状态考虑brushMoved配置, 如果在brush点内但brushMoved为false, 则走绘制状态, 而非两个状态都不响应, 此效果与echarts保持一致)\n * 2. 判断坐标是否在有效交互范围内\n * 2. 如果是移动状态: 标记移动状态 & 标记正在移动的mask & 初始化mask的dx和dy\n * 3. 如果是绘制状态: 标记绘制状态 & 标记正在绘制的mask & 清除之前的mask & 添加新的mask\n */\n private _onBrushStart = (e: FederatedPointerEvent) => {\n if (this._outOfInteractiveRange(e)) {\n if (!this._isEmptyMask()) {\n this._clearMask();\n this._dispatchBrushEvent(IOperateType.brushClear, e);\n }\n return;\n }\n const {\n updateTrigger = DEFAULT_BRUSH_ATTRIBUTES.updateTrigger,\n endTrigger = DEFAULT_BRUSH_ATTRIBUTES.endTrigger,\n brushMoved = true\n } = this.attribute as BrushAttributes;\n array(updateTrigger).forEach(t => this.stage.addEventListener(t, this._onBrushingWithDelay as EventListener));\n array(endTrigger).forEach(t => this.stage.addEventListener(t, this._onBrushEnd as EventListener));\n\n e.stopPropagation();\n this._firstUpdate = true;\n this._activeMoveState = brushMoved && this._isPosInBrushMask(e); // 如果是移动状态,在这里会标记operatingMask为正在移动的mask\n this._activeDrawState = !this._activeMoveState;\n this._startPos = this.eventPosToStagePos(e);\n this._cacheDrawPoints = [this._startPos];\n };\n\n /**\n * 绘制 或 移动 中\n * @description\n * 1. 如果是绘制状态: 更新_cacheDrawPoints 和 mask的points属性\n * 2. 如果是移动状态: 标记移动状态 & 计算位移量 & 给被移动的mask偏移属性\n */\n private _onBrushing = (e: FederatedPointerEvent) => {\n if (this._outOfInteractiveRange(e)) {\n return;\n }\n e.stopPropagation();\n if (this._firstUpdate) {\n this._activeDrawState && this._initDraw(e);\n this._activeMoveState && this._initMove(e);\n this._firstUpdate = false;\n } else {\n this._activeDrawState && this._drawing(e);\n this._activeMoveState && this._moving(e);\n }\n };\n\n private _onBrushingWithDelay =\n this.attribute.delayTime === 0\n ? this._onBrushing\n : delayMap[this.attribute.delayType](this._onBrushing, this.attribute.delayTime);\n\n /**\n * 结束绘制 和 移动\n * @description 取消绘制 和 移动 状态\n */\n private _onBrushEnd = (e: FederatedPointerEvent) => {\n this._releaseBrushUpdateEvents();\n e.preventDefault();\n this._activeDrawState && this._drawEnd(e);\n this._activeMoveState && this._moveEnd(e);\n\n this._activeDrawState = false;\n this._activeMoveState = false;\n };\n\n private _onBrushClear = (e: FederatedPointerEvent) => {\n e.preventDefault();\n if (!this._isEmptyMask()) {\n this._clearMask();\n this._dispatchBrushEvent(IOperateType.brushClear, e);\n }\n this._activeDrawState = false;\n this._activeMoveState = false;\n };\n\n /**\n * 初始化绘制状态\n * @description 清除之前的mask & 添加新的mask\n */\n private _initDraw(e: FederatedPointerEvent) {\n const { brushMode } = this.attribute as BrushAttributes;\n const pos = this.eventPosToStagePos(e);\n\n this._cacheDrawPoints.push(pos);\n brushMode === 'single' && this._clearMask();\n this._addBrushMask();\n this._dispatchBrushEvent(IOperateType.drawStart, e);\n // 无论是多选,还是单选\n // 如果这是第一个brush mask\n // 证明这第一次绘制, 则触发brushActive事件\n if (Object.keys(this._brushMaskAABBBoundsDict).length === 1) {\n this._dispatchBrushEvent(IOperateType.brushActive, e);\n }\n }\n\n /**\n * 初始化移动状态\n * @description 初始化mask的dx和dy\n */\n private _initMove(e: FederatedPointerEvent) {\n this._cacheMovePoint = this.eventPosToStagePos(e);\n\n this._operatingMaskMoveDx = this._operatingMask.attribute.dx ?? 0;\n this._operatingMaskMoveDy = this._operatingMask.attribute.dy ?? 0;\n\n // 计算最大移动范围, 为了将brushMask限制在交互范围内\n const { interactiveRange } = this.attribute as BrushAttributes;\n const { minY = -Infinity, maxY = Infinity, minX = -Infinity, maxX = Infinity } = interactiveRange;\n\n const { x1, x2, y1, y2 } = this._operatingMask.globalAABBBounds;\n const minMoveStepX = minX - x1;\n const maxMoveStepX = maxX - x2;\n const minMoveStepY = minY - y1;\n const maxMoveStepY = maxY - y2;\n\n this._operatingMaskMoveRangeX = [minMoveStepX, maxMoveStepX];\n this._operatingMaskMoveRangeY = [minMoveStepY, maxMoveStepY];\n\n this._operatingMask.setAttribute('pickable', true);\n this._dispatchBrushEvent(IOperateType.moveStart, e);\n }\n\n /**\n * 绘制中\n * @description 更新_cacheDrawPoints 和 mask的points属性\n */\n private _drawing(e: FederatedPointerEvent) {\n const pos = this.eventPosToStagePos(e);\n const { brushType } = this.attribute as BrushAttributes;\n\n const cacheLength = this._cacheDrawPoints.length;\n\n // 如果当前点的位置和上一次点的位置一致,则无需更新\n if (cacheLength > 0) {\n const lastPos = this._cacheDrawPoints[this._cacheDrawPoints.length - 1] ?? ({} as IPointLike);\n if (pos.x === lastPos.x && pos.y === lastPos.y) {\n return;\n }\n }\n // 更新交互位置\n if (brushType === 'polygon' || cacheLength <= 1) {\n this._cacheDrawPoints.push(pos);\n } else {\n this._cacheDrawPoints[cacheLength - 1] = pos;\n }\n // 更新mask形状\n const maskPoints = this._computeMaskPoints();\n this._operatingMask.setAttribute('points', maskPoints);\n this._dispatchBrushEvent(IOperateType.drawing, e);\n }\n\n /**\n * 移动中\n * @description 标记移动状态 & 计算位移量 & 给被移动的mask偏移属性\n */\n private _moving(e: FederatedPointerEvent) {\n const startPos = this._cacheMovePoint;\n const pos = this.eventPosToStagePos(e);\n // 如果当前点的位置和上一次点的位置一致,则无需更新\n if (pos.x === startPos?.x && pos.y === startPos?.y) {\n return;\n }\n\n const moveStepX = pos.x - startPos.x;\n const moveStepY = pos.y - startPos.y;\n const moveX =\n Math.min(this._operatingMaskMoveRangeX[1], Math.max(this._operatingMaskMoveRangeX[0], moveStepX)) +\n this._operatingMaskMoveDx;\n const moveY =\n Math.min(this._operatingMaskMoveRangeY[1], Math.max(this._operatingMaskMoveRangeY[0], moveStepY)) +\n this._operatingMaskMoveDy;\n\n this._operatingMask.setAttributes({\n dx: moveX,\n dy: moveY\n });\n this._brushMaskAABBBoundsDict[this._operatingMask.name] = this._operatingMask.AABBBounds;\n this._dispatchBrushEvent(IOperateType.moving, e);\n }\n\n private _drawEnd(e: FederatedPointerEvent) {\n const { removeOnClick = true, sizeThreshold = DEFAULT_SIZE_THRESHOLD } = this.attribute as BrushAttributes;\n if (this._outOfInteractiveRange(e)) {\n if (!this._isEmptyMask()) {\n this._clearMask();\n this._dispatchBrushEvent(IOperateType.brushClear, e);\n }\n } else {\n const { x: x1, y: y1 } = this._startPos;\n const { x: x2, y: y2 } = this.eventPosToStagePos(e);\n // 1. 无效绘制: 单击\n if (Math.abs(x2 - x1) <= 1 && Math.abs(y2 - y1) <= 1 && removeOnClick) {\n if (!this._isEmptyMask()) {\n this._clearMask();\n this._dispatchBrushEvent(IOperateType.brushClear, e);\n }\n }\n // 2. 无效绘制: 绘制了mask但没有超过阈值, 仅清空当前操作的mask\n else if (Math.abs(x2 - x1) < sizeThreshold && Math.abs(y1 - y2) < sizeThreshold) {\n delete this._brushMaskAABBBoundsDict[this._operatingMask.name];\n this._container.setAttributes({}); // hack逻辑, 待优化: removeChild后, vrender 无法 autoRender, setAttr手动触发render\n this._container.removeChild(this._operatingMask);\n if (this._isEmptyMask()) {\n // 说明是最后一个mask被清空了, 要抛出clear事件, 重置图元状态\n this._dispatchBrushEvent(IOperateType.brushClear, e);\n } else {\n // 说明还有其他mask, 这次无效绘制不会重置状态\n // do nothing\n }\n }\n // 3. 有效绘制\n else {\n this._brushMaskAABBBoundsDict[this._operatingMask.name] = this._operatingMask.AABBBounds;\n this._dispatchBrushEvent(IOperateType.drawEnd, e);\n }\n }\n }\n\n private _moveEnd(e: FederatedPointerEvent) {\n if (this._operatingMask) {\n this._operatingMask.setAttribute('pickable', false);\n }\n this._dispatchBrushEvent(IOperateType.moveEnd, e);\n }\n\n protected render() {\n this._bindBrushEvents();\n const group = this.createOrUpdateChild('brush-container', {}, 'group') as unknown as IGroup;\n this._container = group;\n }\n\n releaseBrushEvents(): void {\n const { trigger = DEFAULT_BRUSH_ATTRIBUTES.trigger, resetTrigger = DEFAULT_BRUSH_ATTRIBUTES.resetTrigger } = this\n .attribute as BrushAttributes;\n array(trigger).forEach(t => this.stage.removeEventListener(t, this._onBrushStart as EventListener));\n array(resetTrigger).forEach(t => this.stage.removeEventListener(t, this._onBrushClear as EventListener));\n this._releaseBrushUpdateEvents();\n }\n\n private _releaseBrushUpdateEvents(): void {\n const { updateTrigger = DEFAULT_BRUSH_ATTRIBUTES.updateTrigger, endTrigger = DEFAULT_BRUSH_ATTRIBUTES.endTrigger } =\n this.attribute as BrushAttributes;\n array(updateTrigger).forEach(t => this.stage.removeEventListener(t, this._onBrushingWithDelay as EventListener));\n array(endTrigger).forEach(t => this.stage.removeEventListener(t, this._onBrushEnd as EventListener));\n }\n\n /**\n * 构造brushMask的points属性\n * @description 根据不同的brushType从_cacheDrawPoints中取points\n * 1. 'rect': 只取鼠标轨迹_cacheDrawPoints的第一个点和最后一个点\n * 2. 'x': 只取鼠标轨迹_cacheDrawPoints的第一个点和最后一个点的x坐标\n * 3. 'y': 只取鼠标轨迹_cacheDrawPoints的第一个点和最后一个点的y坐标\n * 4. 'polygon': 取鼠标轨迹_cacheDrawPoints的所有点\n */\n private _computeMaskPoints() {\n const { brushType, xRange = [0, 0], yRange = [0, 0] } = this.attribute as BrushAttributes;\n let maskPoints: IPointLike[] = [];\n const startPoint = this._cacheDrawPoints[0];\n const endPoint = this._cacheDrawPoints[this._cacheDrawPoints.length - 1];\n\n if (brushType === 'rect') {\n maskPoints = [\n startPoint,\n {\n x: endPoint.x,\n y: startPoint.y\n },\n endPoint,\n {\n x: startPoint.x,\n y: endPoint.y\n }\n ];\n } else if (brushType === 'x') {\n maskPoints = [\n {\n x: startPoint.x,\n y: yRange[0]\n },\n {\n x: endPoint.x,\n y: yRange[0]\n },\n {\n x: endPoint.x,\n y: yRange[1]\n },\n {\n x: startPoint.x,\n y: yRange[1]\n }\n ];\n } else if (brushType === 'y') {\n maskPoints = [\n {\n x: xRange[0],\n y: startPoint.y\n },\n {\n x: xRange[0],\n y: endPoint.y\n },\n {\n x: xRange[1],\n y: endPoint.y\n },\n {\n x: xRange[1],\n y: startPoint.y\n }\n ];\n } else {\n maskPoints = cloneDeep(this._cacheDrawPoints); // _cacheDrawPoints在不断更新,所以这里需要cloneDeep\n }\n return maskPoints;\n }\n\n /**\n * 添加brushMask\n */\n private _addBrushMask() {\n const { brushStyle, hasMask } = this.attribute as BrushAttributes;\n const brushMask = graphicCreator.polygon({\n points: cloneDeep(this._cacheDrawPoints), // _cacheDrawPoints在不断更新,所以这里需要cloneDeep\n cursor: 'move',\n pickable: false,\n ...brushStyle,\n opacity: hasMask ? (brushStyle.opacity ?? 1) : 0\n });\n brushMask.name = `brush-${Date.now()}`; // 用Date给mask唯一标记\n this._operatingMask = brushMask;\n this._container.add(brushMask);\n this._brushMaskAABBBoundsDict[brushMask.name] = brushMask.AABBBounds;\n }\n\n /**\n * 遍历_container的所有子元素,判断鼠标是否在子元素的范围内\n */\n private _isPosInBrushMask(e: FederatedPointerEvent) {\n const pos = this.eventPosToStagePos(e);\n const brushMasks = this._container.getChildren();\n for (let i = 0; i < brushMasks.length; i++) {\n const { points = [], dx = 0, dy = 0 } = (brushMasks[i] as IPolygon).attribute;\n const pointsConsiderOffset: IPointLike[] = points.map((point: IPointLike) => {\n return {\n x: point.x + dx,\n y: point.y + dy\n };\n });\n if (polygonContainPoint(pointsConsiderOffset, pos.x, pos.y)) {\n this._operatingMask = brushMasks[i] as IPolygon;\n return true;\n }\n }\n return false;\n }\n\n /**\n * 判断鼠标是否在交互范围内\n */\n private _outOfInteractiveRange(e: FederatedPointerEvent) {\n // 在返回坐标时,将其限制在交互范围内\n const { interactiveRange } = this.attribute as BrushAttributes;\n const { minY = -Infinity, maxY = Infinity, minX = -Infinity, maxX = Infinity } = interactiveRange;\n const pos = this.eventPosToStagePos(e);\n if (pos.x > maxX || pos.x < minX || pos.y > maxY || pos.y < minY) {\n return true;\n }\n return false;\n }\n\n /**\n * 事件系统坐标转换为stage坐标\n */\n protected eventPosToStagePos(e: FederatedPointerEvent) {\n return this.stage.eventPointTransform(e);\n }\n\n /**\n * 根据操作类型触发对应的事件\n */\n private _dispatchBrushEvent(operateType: IOperateType, e: any) {\n this._dispatchEvent(operateType, {\n operateMask: this._operatingMask as any,\n operatedMaskAABBBounds: this._brushMaskAABBBoundsDict,\n event: e\n });\n }\n\n /**\n * 重置brush状态\n */\n private _clearMask() {\n this._brushMaskAABBBoundsDict = {};\n this._container.incrementalClearChild();\n this._operatingMask = null;\n }\n\n /**\n * 判断当前画布中,是否存在有效mask\n */\n private _isEmptyMask() {\n return (\n isEmpty(this._brushMaskAABBBoundsDict) ||\n Object.keys(this._brushMaskAABBBoundsDict).every(key => this._brushMaskAABBBoundsDict[key].empty())\n );\n }\n}\n"]}