@logicflow/core 2.2.0 → 2.2.1

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 (236) hide show
  1. package/dist/index.css +3 -2
  2. package/dist/index.min.js +1 -1
  3. package/dist/index.min.js.map +1 -1
  4. package/es/LogicFlow.d.ts +9 -0
  5. package/es/LogicFlow.js +0 -1
  6. package/es/constant/index.d.ts +1 -1
  7. package/es/constant/index.js +1 -1
  8. package/es/constant/theme.d.ts +136 -0
  9. package/es/constant/theme.js +680 -0
  10. package/es/index.css +3 -2
  11. package/es/model/GraphModel.d.ts +10 -2
  12. package/es/model/GraphModel.js +48 -14
  13. package/es/model/TransformModel.js +9 -9
  14. package/es/model/edge/BaseEdgeModel.js +7 -2
  15. package/es/model/edge/PolylineEdgeModel.d.ts +7 -0
  16. package/es/model/edge/PolylineEdgeModel.js +136 -7
  17. package/es/model/node/BaseNodeModel.d.ts +12 -1
  18. package/es/model/node/BaseNodeModel.js +9 -2
  19. package/es/model/node/HtmlNodeModel.d.ts +12 -0
  20. package/es/model/node/HtmlNodeModel.js +19 -0
  21. package/es/model/node/PolygonNodeModel.js +3 -3
  22. package/es/options.d.ts +4 -2
  23. package/es/style/index.css +3 -2
  24. package/es/style/index.less +3 -2
  25. package/es/style/raw.d.ts +1 -1
  26. package/es/style/raw.js +1 -1
  27. package/es/tool/MultipleSelectTool.js +10 -5
  28. package/es/util/drag.js +0 -1
  29. package/es/util/edge.d.ts +40 -1
  30. package/es/util/edge.js +43 -9
  31. package/es/util/geometry.d.ts +8 -0
  32. package/es/util/geometry.js +79 -0
  33. package/es/util/theme.d.ts +2 -65
  34. package/es/util/theme.js +4 -281
  35. package/es/view/Anchor.d.ts +1 -0
  36. package/es/view/Anchor.js +24 -21
  37. package/es/view/Control.d.ts +5 -0
  38. package/es/view/Control.js +44 -57
  39. package/es/view/edge/BaseEdge.js +9 -0
  40. package/es/view/edge/PolylineEdge.js +13 -2
  41. package/es/view/node/BaseNode.d.ts +1 -0
  42. package/es/view/node/BaseNode.js +23 -11
  43. package/es/view/node/HtmlNode.js +2 -4
  44. package/es/view/overlay/CanvasOverlay.js +5 -2
  45. package/es/view/overlay/Grid.d.ts +12 -1
  46. package/es/view/overlay/Grid.js +85 -23
  47. package/es/view/overlay/OutlineOverlay.d.ts +1 -0
  48. package/es/view/overlay/OutlineOverlay.js +18 -17
  49. package/es/view/overlay/gridConfig.d.ts +46 -0
  50. package/es/view/overlay/gridConfig.js +99 -0
  51. package/es/view/shape/Polygon.d.ts +0 -7
  52. package/es/view/shape/Polygon.js +12 -43
  53. package/lib/LogicFlow.d.ts +9 -0
  54. package/lib/LogicFlow.js +0 -1
  55. package/lib/constant/index.d.ts +1 -1
  56. package/lib/constant/index.js +16 -2
  57. package/lib/constant/theme.d.ts +136 -0
  58. package/lib/constant/theme.js +683 -0
  59. package/lib/index.css +3 -2
  60. package/lib/model/GraphModel.d.ts +10 -2
  61. package/lib/model/GraphModel.js +49 -15
  62. package/lib/model/TransformModel.js +9 -9
  63. package/lib/model/edge/BaseEdgeModel.js +7 -2
  64. package/lib/model/edge/PolylineEdgeModel.d.ts +7 -0
  65. package/lib/model/edge/PolylineEdgeModel.js +136 -7
  66. package/lib/model/node/BaseNodeModel.d.ts +12 -1
  67. package/lib/model/node/BaseNodeModel.js +9 -2
  68. package/lib/model/node/HtmlNodeModel.d.ts +12 -0
  69. package/lib/model/node/HtmlNodeModel.js +19 -0
  70. package/lib/model/node/PolygonNodeModel.js +3 -3
  71. package/lib/options.d.ts +4 -2
  72. package/lib/style/index.css +3 -2
  73. package/lib/style/index.less +3 -2
  74. package/lib/style/raw.d.ts +1 -1
  75. package/lib/style/raw.js +1 -1
  76. package/lib/tool/MultipleSelectTool.js +10 -5
  77. package/lib/util/drag.js +0 -1
  78. package/lib/util/edge.d.ts +40 -1
  79. package/lib/util/edge.js +43 -9
  80. package/lib/util/geometry.d.ts +8 -0
  81. package/lib/util/geometry.js +81 -1
  82. package/lib/util/theme.d.ts +2 -65
  83. package/lib/util/theme.js +15 -292
  84. package/lib/view/Anchor.d.ts +1 -0
  85. package/lib/view/Anchor.js +24 -21
  86. package/lib/view/Control.d.ts +5 -0
  87. package/lib/view/Control.js +44 -57
  88. package/lib/view/edge/BaseEdge.js +9 -0
  89. package/lib/view/edge/PolylineEdge.js +13 -2
  90. package/lib/view/node/BaseNode.d.ts +1 -0
  91. package/lib/view/node/BaseNode.js +22 -10
  92. package/lib/view/node/HtmlNode.js +1 -3
  93. package/lib/view/overlay/CanvasOverlay.js +5 -2
  94. package/lib/view/overlay/Grid.d.ts +12 -1
  95. package/lib/view/overlay/Grid.js +83 -21
  96. package/lib/view/overlay/OutlineOverlay.d.ts +1 -0
  97. package/lib/view/overlay/OutlineOverlay.js +18 -17
  98. package/lib/view/overlay/gridConfig.d.ts +46 -0
  99. package/lib/view/overlay/gridConfig.js +104 -0
  100. package/lib/view/shape/Polygon.d.ts +0 -7
  101. package/lib/view/shape/Polygon.js +13 -45
  102. package/package.json +6 -1
  103. package/.turbo/turbo-build$colon$dev.log +0 -10
  104. package/.turbo/turbo-build.log +0 -33
  105. package/CHANGELOG.md +0 -1849
  106. package/__tests__/algorithm/egde.test.ts +0 -131
  107. package/__tests__/algorithm/index.test.ts +0 -74
  108. package/__tests__/algorithm/outline.test.ts +0 -43
  109. package/__tests__/bugs/1545-spec.test.ts +0 -42
  110. package/__tests__/event/event.test.ts +0 -22
  111. package/__tests__/history/history.test.ts +0 -28
  112. package/__tests__/logicflow.test.ts +0 -575
  113. package/__tests__/model/graphmodel.test.ts +0 -87
  114. package/__tests__/util/compatible.test.ts +0 -48
  115. package/__tests__/util/edge.test.ts +0 -224
  116. package/__tests__/util/geometry.test.ts +0 -14
  117. package/__tests__/util/graph.test.ts +0 -16
  118. package/__tests__/util/matrix.test.ts +0 -41
  119. package/__tests__/util/node.test.ts +0 -68
  120. package/__tests__/util/sampling.test.ts +0 -12
  121. package/__tests__/util/vector.test.ts +0 -50
  122. package/__tests__/util/zIndex.test.ts +0 -10
  123. package/src/LogicFlow.tsx +0 -2008
  124. package/src/algorithm/edge.ts +0 -67
  125. package/src/algorithm/index.ts +0 -70
  126. package/src/algorithm/outline.ts +0 -77
  127. package/src/algorithm/rotate.ts +0 -55
  128. package/src/common/drag.ts +0 -219
  129. package/src/common/history.ts +0 -108
  130. package/src/common/index.ts +0 -6
  131. package/src/common/keyboard.ts +0 -108
  132. package/src/common/matrix.ts +0 -122
  133. package/src/common/vector.ts +0 -93
  134. package/src/constant/index.ts +0 -179
  135. package/src/event/event.md +0 -66
  136. package/src/event/eventArgs.ts +0 -643
  137. package/src/event/eventEmitter.ts +0 -156
  138. package/src/history/index.ts +0 -119
  139. package/src/index.less +0 -1
  140. package/src/index.ts +0 -26
  141. package/src/keyboard/index.ts +0 -112
  142. package/src/keyboard/shortcut.ts +0 -200
  143. package/src/model/BaseModel.ts +0 -250
  144. package/src/model/EditConfigModel.ts +0 -334
  145. package/src/model/GraphModel.ts +0 -1788
  146. package/src/model/NestedTransformModel.ts +0 -121
  147. package/src/model/SnaplineModel.ts +0 -256
  148. package/src/model/TransformModel.ts +0 -258
  149. package/src/model/edge/BaseEdgeModel.ts +0 -777
  150. package/src/model/edge/BezierEdgeModel.ts +0 -197
  151. package/src/model/edge/LineEdgeModel.ts +0 -36
  152. package/src/model/edge/PolylineEdgeModel.ts +0 -672
  153. package/src/model/edge/index.ts +0 -4
  154. package/src/model/index.ts +0 -9
  155. package/src/model/node/BaseNodeModel.ts +0 -949
  156. package/src/model/node/CircleNodeModel.ts +0 -91
  157. package/src/model/node/DiamondNodeModel.ts +0 -132
  158. package/src/model/node/EllipseNodeModel.ts +0 -98
  159. package/src/model/node/HtmlNodeModel.ts +0 -50
  160. package/src/model/node/PolygonNodeModel.ts +0 -150
  161. package/src/model/node/RectNodeModel.ts +0 -69
  162. package/src/model/node/TextNodeModel.ts +0 -54
  163. package/src/model/node/index.ts +0 -8
  164. package/src/options.ts +0 -145
  165. package/src/style/index.less +0 -261
  166. package/src/style/raw.ts +0 -220
  167. package/src/tool/MultipleSelectTool.tsx +0 -132
  168. package/src/tool/TextEditTool.tsx +0 -193
  169. package/src/tool/index.ts +0 -101
  170. package/src/typings.d.ts +0 -5
  171. package/src/util/animation.ts +0 -29
  172. package/src/util/browser.ts +0 -4
  173. package/src/util/compatible.ts +0 -15
  174. package/src/util/drag.ts +0 -220
  175. package/src/util/edge.ts +0 -1060
  176. package/src/util/geometry.ts +0 -55
  177. package/src/util/graph.ts +0 -46
  178. package/src/util/index.ts +0 -17
  179. package/src/util/matrix.ts +0 -129
  180. package/src/util/mobx.ts +0 -23
  181. package/src/util/node.ts +0 -543
  182. package/src/util/raf.ts +0 -28
  183. package/src/util/resize.ts +0 -606
  184. package/src/util/sampling.ts +0 -85
  185. package/src/util/theme.ts +0 -375
  186. package/src/util/uuid.ts +0 -26
  187. package/src/util/vector.ts +0 -93
  188. package/src/util/zIndex.ts +0 -6
  189. package/src/view/Anchor.tsx +0 -445
  190. package/src/view/Control.tsx +0 -512
  191. package/src/view/Graph.tsx +0 -141
  192. package/src/view/Rotate.tsx +0 -113
  193. package/src/view/behavior/dnd.ts +0 -162
  194. package/src/view/behavior/index.ts +0 -2
  195. package/src/view/behavior/snapline.ts +0 -16
  196. package/src/view/edge/AdjustPoint.tsx +0 -425
  197. package/src/view/edge/Arrow.tsx +0 -54
  198. package/src/view/edge/BaseEdge.tsx +0 -650
  199. package/src/view/edge/BezierEdge.tsx +0 -101
  200. package/src/view/edge/LineEdge.tsx +0 -81
  201. package/src/view/edge/PolylineEdge.tsx +0 -299
  202. package/src/view/edge/index.ts +0 -6
  203. package/src/view/index.ts +0 -8
  204. package/src/view/node/BaseNode.tsx +0 -571
  205. package/src/view/node/CircleNode.tsx +0 -21
  206. package/src/view/node/DiamondNode.tsx +0 -24
  207. package/src/view/node/EllipseNode.tsx +0 -22
  208. package/src/view/node/HtmlNode.tsx +0 -95
  209. package/src/view/node/PolygonNode.tsx +0 -28
  210. package/src/view/node/RectNode.tsx +0 -30
  211. package/src/view/node/TextNode.tsx +0 -39
  212. package/src/view/node/index.ts +0 -8
  213. package/src/view/overlay/BackgroundOverlay.tsx +0 -34
  214. package/src/view/overlay/BezierAdjustOverlay.tsx +0 -150
  215. package/src/view/overlay/CanvasOverlay.tsx +0 -288
  216. package/src/view/overlay/Grid.tsx +0 -162
  217. package/src/view/overlay/ModificationOverlay.tsx +0 -31
  218. package/src/view/overlay/OutlineOverlay.tsx +0 -170
  219. package/src/view/overlay/SnaplineOverlay.tsx +0 -44
  220. package/src/view/overlay/ToolOverlay.tsx +0 -65
  221. package/src/view/overlay/getTransformHoc.tsx +0 -50
  222. package/src/view/overlay/index.ts +0 -8
  223. package/src/view/shape/Circle.tsx +0 -41
  224. package/src/view/shape/Ellipse.tsx +0 -42
  225. package/src/view/shape/Line.tsx +0 -39
  226. package/src/view/shape/Path.tsx +0 -22
  227. package/src/view/shape/Polygon.tsx +0 -91
  228. package/src/view/shape/Polyline.tsx +0 -31
  229. package/src/view/shape/Rect.tsx +0 -44
  230. package/src/view/shape/Text.tsx +0 -169
  231. package/src/view/shape/index.ts +0 -8
  232. package/src/view/text/BaseText.tsx +0 -134
  233. package/src/view/text/LineText.tsx +0 -168
  234. package/src/view/text/index.ts +0 -2
  235. package/stats.html +0 -4842
  236. package/tsconfig.json +0 -18
@@ -1,95 +0,0 @@
1
- import { createRef } from 'preact/compat'
2
- import BaseNode from './BaseNode'
3
- import { GraphModel, HtmlNodeModel } from '../../model'
4
-
5
- export type IHtmlNodeProps = {
6
- model: HtmlNodeModel
7
- graphModel: GraphModel
8
- }
9
-
10
- export class HtmlNode<
11
- P extends IHtmlNodeProps = IHtmlNodeProps,
12
- > extends BaseNode<P> {
13
- ref = createRef()
14
- currentProperties?: string
15
- preProperties?: string
16
-
17
- get rootEl() {
18
- return this.ref.current
19
- }
20
-
21
- /**
22
- * @overridable 支持重写
23
- * 自定义HTML节点内容
24
- * @param {HTMLElement} rootEl 自定义HTML节点内容可以挂载的dom节点
25
- * @example
26
- * class CustomHtmlNode extends HtmlNode {
27
- * setHtml(rootEl) {
28
- * const input = document.createElement('input');
29
- * rootEl.appendChild(input)
30
- * }
31
- * }
32
- */
33
- setHtml(rootEl: SVGForeignObjectElement) {
34
- rootEl.appendChild(document.createElement('div'))
35
- }
36
-
37
- // TODO: 1. 应该在什么时机进行更新呢?2. 如何精细化控制
38
- confirmUpdate(rootEl: SVGForeignObjectElement) {
39
- this.setHtml(rootEl)
40
- }
41
-
42
- /**
43
- * @overridable 支持重写
44
- * 和react的shouldComponentUpdate类似,都是为了避免出发不必要的render.
45
- * 但是这里不一样的地方在于,setHtml方法,我们只在properties发生变化了后再触发。
46
- * 而x,y等这些坐标相关的方法发生了变化,不会再重新触发setHtml.
47
- */
48
- shouldUpdate() {
49
- if (this.preProperties && this.preProperties === this.currentProperties) {
50
- return false
51
- }
52
- this.preProperties = this.currentProperties
53
- return true
54
- }
55
-
56
- componentDidMount() {
57
- // console.log('HtmlNode --->>> componentDidMount - 初始化内容')
58
- if (this.shouldUpdate() && this.rootEl) {
59
- this.setHtml(this.rootEl)
60
- }
61
- }
62
-
63
- componentDidUpdate() {
64
- // console.log('HtmlNode --->>> componentDidUpdate - 更新节点内容')
65
- // DONE: 将 componentDidMount 和 componentDidUpdate 区分开,如果写在一次,渲染 React 组件会重复初始化,消耗过多资源
66
- // 为了保证历史兼容性,先将默认 HTML 节点的 setHtml 和 confirmUpdate 保持一直,用户可通过自定义的方式重新定义
67
- if (this.shouldUpdate() && this.rootEl) {
68
- this.confirmUpdate(this.rootEl)
69
- }
70
- }
71
-
72
- componentWillUnmount() {
73
- super.componentWillUnmount()
74
- this.rootEl.innerHTML = ''
75
- }
76
-
77
- getShape() {
78
- const { model } = this.props
79
- const { x, y, height, width } = model
80
- const style = model.getNodeStyle()
81
- this.currentProperties = JSON.stringify(model.properties)
82
- return (
83
- <foreignObject
84
- {...style}
85
- x={x - width / 2}
86
- y={y - height / 2}
87
- width={width}
88
- height={height}
89
- ref={this.ref}
90
- />
91
- )
92
- }
93
- }
94
-
95
- export default HtmlNode
@@ -1,28 +0,0 @@
1
- import BaseNode from './BaseNode'
2
- import { Polygon } from '../shape'
3
- import { GraphModel, PolygonNodeModel } from '../../model'
4
-
5
- export type IPolygonNodeProps = {
6
- model: PolygonNodeModel
7
- graphModel: GraphModel
8
- }
9
-
10
- export class PolygonNode<
11
- P extends IPolygonNodeProps = IPolygonNodeProps,
12
- > extends BaseNode<P> {
13
- getShape() {
14
- const { model } = this.props
15
- const { x, y, width, height, points } = model as PolygonNodeModel
16
- const style = model.getNodeStyle()
17
- const attr = {
18
- transform: `matrix(1 0 0 1 ${x - width / 2} ${y - height / 2})`,
19
- }
20
- return (
21
- <g {...attr}>
22
- <Polygon {...style} points={points} x={x} y={y} />
23
- </g>
24
- )
25
- }
26
- }
27
-
28
- export default PolygonNode
@@ -1,30 +0,0 @@
1
- import { createElement as h } from 'preact/compat'
2
- import BaseNode from './BaseNode'
3
- import { Rect } from '../shape'
4
- import { GraphModel, RectNodeModel } from '../../model'
5
-
6
- export type IRectNodeProps = {
7
- model: RectNodeModel
8
- graphModel: GraphModel
9
- }
10
-
11
- export class RectNode<
12
- P extends IRectNodeProps = IRectNodeProps,
13
- > extends BaseNode<P> {
14
- getShape(): h.JSX.Element | null {
15
- const { model } = this.props
16
- const style = model.getNodeStyle()
17
- return (
18
- <Rect
19
- {...style}
20
- x={model.x}
21
- y={model.y}
22
- width={model.width}
23
- height={model.height}
24
- radius={model.radius}
25
- />
26
- )
27
- }
28
- }
29
-
30
- export default RectNode
@@ -1,39 +0,0 @@
1
- import Rect from '../shape/Rect'
2
- import BaseNode from './BaseNode'
3
- import { GraphModel, TextNodeModel } from '../../model'
4
-
5
- export type ITextNodeProps = {
6
- model: TextNodeModel
7
- graphModel: GraphModel
8
- }
9
-
10
- export class TextNode<
11
- P extends ITextNodeProps = ITextNodeProps,
12
- > extends BaseNode<P> {
13
- getBackground() {
14
- const { model } = this.props
15
- const style = model.getTextStyle()
16
- // 背景框宽度,最长一行字节数/2 * fontsize + 2
17
- // 背景框宽度, 行数 * fontsize + 2
18
- // FIX: #1067
19
- const { width, height, x, y } = model
20
- const rectAttr = {
21
- ...style.background,
22
- x,
23
- y,
24
- width,
25
- height,
26
- }
27
- return <Rect {...rectAttr} />
28
- }
29
-
30
- getResizeControl() {
31
- return null
32
- }
33
-
34
- getShape() {
35
- return <g>{this.getBackground()}</g>
36
- }
37
- }
38
-
39
- export default TextNode
@@ -1,8 +0,0 @@
1
- export * from './BaseNode'
2
- export * from './RectNode'
3
- export * from './CircleNode'
4
- export * from './PolygonNode'
5
- export * from './DiamondNode'
6
- export * from './EllipseNode'
7
- export * from './TextNode'
8
- export * from './HtmlNode'
@@ -1,34 +0,0 @@
1
- import { Component } from 'preact/compat'
2
- import { isObject } from 'lodash-es'
3
- import { Options as LFOptions } from '../../options'
4
- import { observer } from '../..'
5
-
6
- /**
7
- * 背景配置, 支持css属性配置
8
- * https://developer.mozilla.org/zh-CN/docs/Web/CSS/background
9
- * @example
10
- * {
11
- * backgroundImage: "url('./img/grid.svg')",
12
- backgroundRepeat: 'repeat',
13
- * }
14
- */
15
- type IProps = {
16
- background: boolean | LFOptions.BackgroundConfig
17
- }
18
-
19
- @observer
20
- export class BackgroundOverlay extends Component<IProps> {
21
- render() {
22
- const { background } = this.props
23
- return (
24
- <div className="lf-background">
25
- <div
26
- style={isObject(background) ? background : {}}
27
- className="lf-background-area"
28
- />
29
- </div>
30
- )
31
- }
32
- }
33
-
34
- export default BackgroundOverlay
@@ -1,150 +0,0 @@
1
- import { Component } from 'preact/compat'
2
- import { Circle, Line } from '../shape'
3
- import { observer } from '../..'
4
- import LogicFlow from '../../LogicFlow'
5
- import { EventType, ModelType } from '../../constant'
6
- import { StepDrag, getBezierPoints, IDragParams } from '../../util'
7
- import { GraphModel, BezierEdgeModel } from '../../model'
8
-
9
- import Point = LogicFlow.Point
10
-
11
- type IProps = {
12
- graphModel: GraphModel
13
- }
14
-
15
- type IAnchorProps = {
16
- position: Point
17
- bezierModel: BezierEdgeModel
18
- graphModel: GraphModel
19
- type: string
20
- }
21
-
22
- type IState = {
23
- endX: number
24
- endY: number
25
- }
26
-
27
- // bezier曲线的可调整锚点
28
- export class BezierAdjustAnchor extends Component<IAnchorProps, IState> {
29
- dragHandler: StepDrag
30
-
31
- constructor() {
32
- super()
33
- this.dragHandler = new StepDrag({
34
- onDragging: this.onDragging,
35
- onDragEnd: this.onDragEnd,
36
- })
37
- }
38
-
39
- onDragging = ({ event }: IDragParams) => {
40
- const { graphModel, bezierModel, type } = this.props
41
- const {
42
- canvasOverlayPosition: { x, y },
43
- } = graphModel.getPointByClient({
44
- x: event!.clientX,
45
- y: event!.clientY,
46
- })
47
- bezierModel.updateAdjustAnchor(
48
- {
49
- x,
50
- y,
51
- },
52
- type,
53
- )
54
- graphModel.eventCenter.emit(EventType.EDGE_ADJUST, {
55
- data: bezierModel.getData(),
56
- })
57
- }
58
- onDragEnd = () => {
59
- const { bezierModel } = this.props
60
- bezierModel.isDragging = false
61
- }
62
-
63
- render() {
64
- const { position } = this.props
65
- const { x, y } = position
66
- const { bezierModel } = this.props
67
- const { adjustAnchor } = bezierModel.getEdgeStyle()
68
- return (
69
- <Circle
70
- className="lf-bezier-adjust-anchor"
71
- x={x}
72
- y={y}
73
- {...adjustAnchor}
74
- onPointerDown={(ev) => {
75
- // if (edgeAddable !== false) {
76
- this.dragHandler.handleMouseDown(ev)
77
- // }
78
- }}
79
- />
80
- )
81
- }
82
- }
83
-
84
- @observer
85
- export class BezierAdjustOverlay extends Component<IProps> {
86
- getBezierAdjust(bezier: BezierEdgeModel, graphModel: GraphModel) {
87
- const { path, id } = bezier
88
- const pointsList = getBezierPoints(path)
89
- const [start, sNext, ePre, end] = pointsList
90
- const { adjustLine } = bezier.getEdgeStyle()
91
- const result: any = [] // TODO: 类型定义
92
- result.push(
93
- <Line
94
- x1={start.x}
95
- y1={start.y}
96
- x2={sNext.x}
97
- y2={sNext.y}
98
- {...adjustLine}
99
- />,
100
- )
101
- result.push(
102
- <BezierAdjustAnchor
103
- position={sNext}
104
- bezierModel={bezier}
105
- graphModel={graphModel}
106
- key={`${id}_ePre`}
107
- type="sNext"
108
- />,
109
- )
110
- result.push(
111
- <Line x1={end.x} y1={end.y} x2={ePre.x} y2={ePre.y} {...adjustLine} />,
112
- )
113
- result.push(
114
- <BezierAdjustAnchor
115
- position={ePre}
116
- bezierModel={bezier}
117
- graphModel={graphModel}
118
- key={`${id}_sNext`}
119
- type="ePre"
120
- />,
121
- )
122
- return result
123
- }
124
-
125
- // 获取选中bezier曲线,调整操作线和锚点
126
- selectedBezierEdge() {
127
- const { graphModel } = this.props
128
- const edgeList = graphModel.edges
129
- const edgeAdjust: any = [] // TODO:类型定义
130
- for (let i = 0; i < edgeList.length; i++) {
131
- const edge = edgeList[i]
132
- if (
133
- edge.isSelected &&
134
- edge.modelType === ModelType.BEZIER_EDGE &&
135
- edge.draggable
136
- ) {
137
- edgeAdjust.push(
138
- this.getBezierAdjust(edge as BezierEdgeModel, graphModel),
139
- )
140
- }
141
- }
142
- return edgeAdjust
143
- }
144
-
145
- render() {
146
- return <g className="lf-bezier-adjust">{this.selectedBezierEdge()}</g>
147
- }
148
- }
149
-
150
- export default BezierAdjustOverlay
@@ -1,288 +0,0 @@
1
- import { Component } from 'preact/compat'
2
- import Dnd from '../behavior/dnd'
3
- import { observer } from '../..'
4
- import GraphModel from '../../model/GraphModel'
5
- import { EventType } from '../../constant'
6
- import { StepDrag, IDragParams } from '../../util'
7
-
8
- type IProps = {
9
- graphModel: GraphModel
10
- dnd: Dnd
11
- }
12
- type IState = {
13
- isDragging: boolean
14
- }
15
-
16
- @observer
17
- export class CanvasOverlay extends Component<IProps, IState> {
18
- stepDrag: StepDrag
19
- stepScrollX = 0
20
- stepScrollY = 0
21
- pointers = new Map<number, { x: number; y: number }>()
22
- pinchStartDistance?: number
23
- pinchStartScale?: number
24
- pinchLastCenterX?: number
25
- pinchLastCenterY?: number
26
- longPressTimer?: number
27
-
28
- constructor(props: IProps) {
29
- super()
30
- const {
31
- graphModel: { gridSize, eventCenter },
32
- } = props
33
- this.stepDrag = new StepDrag({
34
- onDragging: this.onDragging,
35
- onDragEnd: this.onDragEnd,
36
- step: gridSize,
37
- eventType: 'BLANK',
38
- isStopPropagation: false,
39
- eventCenter,
40
- model: undefined,
41
- })
42
- // 当 ctrl、cmd 键被按住的时候,可以放大缩小。
43
- this.state = {
44
- isDragging: false,
45
- }
46
- }
47
-
48
- // get InjectedProps() {
49
- // return this.props as InjectedProps;
50
- // }
51
- onDragging = ({ deltaX, deltaY }: IDragParams) => {
52
- if (this.longPressTimer) {
53
- clearTimeout(this.longPressTimer)
54
- this.longPressTimer = undefined
55
- }
56
- this.setState({
57
- isDragging: true,
58
- })
59
- const {
60
- graphModel: { transformModel, editConfigModel },
61
- } = this.props
62
- if (editConfigModel.stopMoveGraph === true) {
63
- return
64
- }
65
- transformModel.translate(deltaX, deltaY)
66
- }
67
- onDragEnd = () => {
68
- this.setState({
69
- isDragging: false,
70
- })
71
- }
72
- zoomHandler = (ev: WheelEvent) => {
73
- const {
74
- graphModel: { editConfigModel, transformModel, gridSize },
75
- graphModel,
76
- } = this.props
77
- const { deltaX: eX, deltaY: eY } = ev
78
- const { stopScrollGraph, stopZoomGraph } = editConfigModel
79
- // 如果没有禁止滚动移动画布, 并且当前触发的时候ctrl键、cmd键没有按住, 那么移动画布
80
- if (!stopScrollGraph && !ev.ctrlKey && !ev.metaKey) {
81
- ev.preventDefault()
82
- this.stepScrollX += eX
83
- this.stepScrollY += eY
84
- if (Math.abs(this.stepScrollX) >= gridSize) {
85
- const remainderX = this.stepScrollX % gridSize
86
- const moveDistance = this.stepScrollX - remainderX
87
- transformModel.translate(-moveDistance * transformModel.SCALE_X, 0)
88
- this.stepScrollX = remainderX
89
- }
90
- if (Math.abs(this.stepScrollY) >= gridSize) {
91
- const remainderY = this.stepScrollY % gridSize
92
- const moveDistanceY = this.stepScrollY - remainderY
93
- transformModel.translate(0, -moveDistanceY * transformModel.SCALE_Y)
94
- this.stepScrollY = remainderY
95
- }
96
- return
97
- }
98
- // 如果没有禁止缩放画布,那么进行缩放. 在禁止缩放画布后,按住 ctrl、cmd 键也不能缩放了。
99
- if (!stopZoomGraph) {
100
- ev.preventDefault()
101
- const position = graphModel.getPointByClient({
102
- x: ev.clientX,
103
- y: ev.clientY,
104
- })
105
- const { x, y } = position.canvasOverlayPosition
106
- transformModel.zoom(ev.deltaY < 0, [x, y])
107
- }
108
- }
109
- clickHandler = (ev: MouseEvent) => {
110
- // 点击空白处取消节点选中状态, 不包括冒泡过来的事件。
111
- const target = ev.target as HTMLElement
112
- if (target.getAttribute('name') === 'canvas-overlay') {
113
- const { graphModel } = this.props
114
- const { selectElements } = graphModel
115
- if (selectElements.size > 0) {
116
- graphModel.clearSelectElements()
117
- }
118
- graphModel.eventCenter.emit(EventType.BLANK_CLICK, { e: ev })
119
- }
120
- }
121
- handleContextMenu = (ev: MouseEvent) => {
122
- const target = ev.target as HTMLElement
123
- if (target.getAttribute('name') === 'canvas-overlay') {
124
- ev.preventDefault()
125
- const { graphModel } = this.props
126
- const position = graphModel.getPointByClient({
127
- x: ev.clientX,
128
- y: ev.clientY,
129
- })
130
- // graphModel.setElementState(ElementState.SHOW_MENU, position.domOverlayPosition);
131
- graphModel.eventCenter.emit(EventType.BLANK_CONTEXTMENU, {
132
- e: ev,
133
- position,
134
- })
135
- }
136
- }
137
- // 鼠标、触摸板 按下
138
- pointerDownHandler = (ev: PointerEvent) => {
139
- const {
140
- graphModel: {
141
- eventCenter,
142
- editConfigModel,
143
- transformModel: { SCALE_X },
144
- gridSize,
145
- },
146
- } = this.props
147
- this.pointers.set(ev.pointerId, { x: ev.clientX, y: ev.clientY })
148
- if (this.longPressTimer) {
149
- clearTimeout(this.longPressTimer)
150
- }
151
- if (ev.pointerType === 'touch') {
152
- this.longPressTimer = window.setTimeout(() => {
153
- this.handleContextMenu(ev)
154
- }, 500)
155
- }
156
- // 检测双指触摸,初始化捏合缩放
157
- if (this.pointers.size === 2) {
158
- const {
159
- graphModel: { transformModel, editConfigModel },
160
- } = this.props
161
- // 记录两指当前位置用于计算初始距离
162
- const pts = Array.from(this.pointers.values())
163
- const dx = pts[0].x - pts[1].x
164
- const dy = pts[0].y - pts[1].y
165
- const cx = (pts[0].x + pts[1].x) / 2
166
- const cy = (pts[0].y + pts[1].y) / 2
167
- // 记录捏合起始距离与当前缩放,后续按比例计算缩放
168
- this.pinchStartDistance = Math.hypot(dx, dy)
169
- this.pinchStartScale = transformModel.SCALE_X
170
- // 双指操作下取消画布拖拽,避免与捏合缩放冲突
171
- this.stepDrag.cancelDrag()
172
- this.pinchLastCenterX = cx
173
- this.pinchLastCenterY = cy
174
- editConfigModel.updateEditConfig({ isPinching: true })
175
- return
176
- }
177
- const { adjustEdge, adjustNodePosition, stopMoveGraph } = editConfigModel
178
- const target = ev.target as HTMLElement
179
- const isFrozenElement = !adjustEdge && !adjustNodePosition
180
- if (target.getAttribute('name') === 'canvas-overlay' || isFrozenElement) {
181
- if (stopMoveGraph !== true) {
182
- this.stepDrag.setStep(gridSize * SCALE_X)
183
- this.stepDrag.handleMouseDown(ev)
184
- } else {
185
- eventCenter.emit(EventType.BLANK_MOUSEDOWN, { e: ev })
186
- }
187
- // 为了处理画布移动的时候,编辑和菜单仍然存在的问题。
188
- this.clickHandler(ev)
189
- }
190
- }
191
- pointerMoveHandler = (ev: PointerEvent) => {
192
- // 记录当前指针位置(按 pointerId)
193
- this.pointers.set(ev.pointerId, { x: ev.clientX, y: ev.clientY })
194
- // 当已记录初始捏合距离且存在两指时,执行捏合缩放
195
- if (this.pinchStartDistance && this.pointers.size >= 2) {
196
- const {
197
- graphModel,
198
- graphModel: { editConfigModel, transformModel },
199
- } = this.props
200
- if (editConfigModel.stopZoomGraph) return
201
- // 取消触摸长按计时,避免捏合过程中误触发上下文菜单
202
- if (this.longPressTimer) {
203
- clearTimeout(this.longPressTimer)
204
- }
205
- // 计算两指间当前距离
206
- const pts = Array.from(this.pointers.values())
207
- const dx = pts[0].x - pts[1].x
208
- const dy = pts[0].y - pts[1].y
209
- const dist = Math.hypot(dx, dy)
210
- // 以初始缩放为基准,根据距离比例得到新的缩放比例
211
- const scale =
212
- (this.pinchStartScale ?? transformModel.SCALE_X) *
213
- (dist / this.pinchStartDistance)
214
- // 取两指中心作为缩放原点,并转换为画布坐标系
215
- const cx = (pts[0].x + pts[1].x) / 2
216
- const cy = (pts[0].y + pts[1].y) / 2
217
- const pos = graphModel.getPointByClient({ x: cx, y: cy })
218
- const { x, y } = pos.canvasOverlayPosition
219
- transformModel.zoom(scale, [x, y])
220
- // 双指中心位移驱动画布平移,配合缩放实现捏合移动;
221
- if (!editConfigModel.stopMoveGraph || editConfigModel.isPinching) {
222
- const deltaX =
223
- this.pinchLastCenterX === undefined ? 0 : cx - this.pinchLastCenterX
224
- const deltaY =
225
- this.pinchLastCenterY === undefined ? 0 : cy - this.pinchLastCenterY
226
- transformModel.translate(deltaX, deltaY)
227
- this.pinchLastCenterX = cx
228
- this.pinchLastCenterY = cy
229
- }
230
- ev.preventDefault()
231
- }
232
- }
233
- pointerUpHandler = (ev: PointerEvent) => {
234
- this.pointers.delete(ev.pointerId)
235
- if (this.longPressTimer) {
236
- clearTimeout(this.longPressTimer)
237
- this.longPressTimer = undefined
238
- }
239
- // 双指松开或仅剩一指:结束捏合手势并清理临时状态
240
- if (this.pointers.size < 2) {
241
- // 清空捏合距离与缩放起始值
242
- this.pinchStartDistance = undefined
243
- this.pinchStartScale = undefined
244
- // 清空上一帧的双指中心
245
- this.pinchLastCenterX = undefined
246
- this.pinchLastCenterY = undefined
247
- const {
248
- graphModel: { editConfigModel },
249
- } = this.props
250
- // 标记退出捏合,框选等交互可恢复
251
- editConfigModel.updateEditConfig({ isPinching: false })
252
- }
253
- }
254
-
255
- render() {
256
- const {
257
- graphModel: { transformModel },
258
- } = this.props
259
- const { transform } = transformModel.getTransformStyle()
260
- const { children } = this.props
261
- const { isDragging } = this.state
262
-
263
- return (
264
- <svg
265
- xmlns="http://www.w3.org/2000/svg"
266
- width="100%"
267
- height="100%"
268
- name="canvas-overlay"
269
- onWheel={this.zoomHandler}
270
- onPointerDown={this.pointerDownHandler}
271
- onPointerMove={this.pointerMoveHandler}
272
- onPointerUp={this.pointerUpHandler}
273
- onPointerCancel={this.pointerUpHandler}
274
- onContextMenu={this.handleContextMenu}
275
- style={{ touchAction: 'none', WebkitUserSelect: 'none' }}
276
- className={
277
- isDragging
278
- ? 'lf-canvas-overlay lf-dragging'
279
- : 'lf-canvas-overlay lf-drag-able'
280
- }
281
- >
282
- <g transform={transform}>{children}</g>
283
- </svg>
284
- )
285
- }
286
- }
287
-
288
- export default CanvasOverlay