@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,650 +0,0 @@
1
- import { createElement as h, Component, createRef } from 'preact/compat'
2
- import { Circle } from '../shape'
3
- import { LineText } from '../text'
4
- import LogicFlow from '../../LogicFlow'
5
- import { GraphModel, BaseEdgeModel, PolylineEdgeModel } from '../../model'
6
- import { ElementState, EventType, ModelType, TextMode } from '../../constant'
7
- import {
8
- isMultipleSelect,
9
- getClosestPointOfPolyline,
10
- degrees,
11
- getThetaOfVector,
12
- } from '../../util'
13
- import AdjustPoint, { AdjustType } from './AdjustPoint'
14
-
15
- import ArrowInfo = LogicFlow.ArrowInfo
16
- import Point = LogicFlow.Point
17
-
18
- type IProps = {
19
- model: BaseEdgeModel
20
- graphModel: GraphModel
21
- }
22
- export type IEdgeState = {
23
- hover: boolean
24
- }
25
-
26
- export abstract class BaseEdge<P extends IProps> extends Component<
27
- P,
28
- IEdgeState
29
- > {
30
- static isObserved: boolean = false
31
- static extendsKey?: string
32
- mouseUpDrag?: boolean
33
-
34
- startTime?: number
35
- contextMenuTime?: number
36
- clickTimer?: number
37
- longPressTimer?: number
38
- textRef = createRef()
39
-
40
- constructor() {
41
- super()
42
- }
43
-
44
- /**
45
- * 不支持重写,请使用getEdge
46
- */
47
- getShape() {
48
- return <g>{this.getEdge()}</g>
49
- }
50
-
51
- /**
52
- * @deprecated 请使用model.getTextStyle
53
- */
54
- getTextStyle() {}
55
-
56
- /**
57
- * @overridable 可重写,自定义边文本DOM
58
- */
59
- getText(): h.JSX.Element | null {
60
- const { model, graphModel } = this.props
61
- const { editConfigModel } = graphModel
62
-
63
- // 当 边文本模式非 TEXT 时,不显示文本
64
- if (editConfigModel.edgeTextMode !== TextMode.TEXT) return null
65
- // 文本被编辑的时候,显示编辑框,不显示文本。
66
- if (model.state === ElementState.TEXT_EDIT) return null
67
-
68
- if (model.text) {
69
- let draggable = false
70
- if (editConfigModel.edgeTextDraggable && model.text.draggable) {
71
- draggable = true
72
- }
73
- return (
74
- <LineText
75
- ref={this.textRef}
76
- editable={
77
- editConfigModel.edgeTextEdit && (model.text.editable ?? true)
78
- }
79
- model={model}
80
- graphModel={graphModel}
81
- draggable={draggable}
82
- />
83
- )
84
- }
85
- return null
86
- }
87
-
88
- /**
89
- * @deprecated
90
- */
91
- getArrowInfo(): ArrowInfo {
92
- const { model } = this.props
93
- const { startPoint, endPoint, isSelected } = model
94
- const { hover } = this.state as IEdgeState
95
- return {
96
- start: startPoint,
97
- end: endPoint,
98
- hover,
99
- isSelected,
100
- }
101
- }
102
-
103
- getLastTwoPoints(): [Point, Point] {
104
- const { model } = this.props
105
- const { startPoint, endPoint } = model
106
- return [startPoint, endPoint]
107
- }
108
-
109
- /**
110
- * @deprecated 请使用model.getArrowStyle
111
- */
112
- getArrowStyle() {
113
- console.error(
114
- 'getArrowStyle is deprecated in 1.2.0, please use model.getArrowStyle',
115
- )
116
- return null
117
- }
118
-
119
- /**
120
- * 定义边的箭头,不支持重写。请使用getStartArrow和getEndArrow
121
- */
122
- private getArrow(): h.JSX.Element | null {
123
- const { model } = this.props
124
- const { id } = model
125
- const { refY = 0, refX = 2 } = model.getArrowStyle()
126
- const [start, end] = this.getLastTwoPoints()
127
- let theta: string | number = 'auto'
128
- // 防止无效点和零长度向量以避免 NaN 方向
129
- if (start && end) {
130
- const dx = end.x - start.x
131
- const dy = end.y - start.y
132
- // 仅在有实际方向时才计算
133
- if (dx !== 0 || dy !== 0) {
134
- const computed = degrees(
135
- getThetaOfVector({
136
- x: dx,
137
- y: dy,
138
- z: 0,
139
- }),
140
- )
141
- if (Number.isFinite(computed) && !Number.isNaN(computed)) {
142
- theta = computed
143
- }
144
- }
145
- }
146
- return (
147
- <g>
148
- <defs>
149
- <marker
150
- id={`marker-start-${id}`}
151
- refX={-refX}
152
- refY={refY}
153
- overflow="visible"
154
- orient="auto"
155
- markerUnits="userSpaceOnUse"
156
- >
157
- {this.getStartArrow()}
158
- </marker>
159
- <marker
160
- id={`marker-end-${id}`}
161
- refX={refX}
162
- refY={refY}
163
- overflow="visible"
164
- orient={theta}
165
- markerUnits="userSpaceOnUse"
166
- // transform={`rotate(${degrees(theta)})`}
167
- >
168
- {this.getEndArrow()}
169
- </marker>
170
- </defs>
171
- </g>
172
- )
173
- }
174
-
175
- /**
176
- * Private helper method to generate arrow path based on type and parameters
177
- */
178
- private getArrowPath(
179
- arrowType: string,
180
- props: {
181
- stroke?: string
182
- fill?: string
183
- strokeWidth?: number
184
- offset: number
185
- verticalLength: number
186
- strokeLinecap?: string
187
- strokeLinejoin?: string
188
- transform?: string
189
- },
190
- ): h.JSX.Element {
191
- const {
192
- stroke,
193
- fill = stroke,
194
- strokeWidth,
195
- offset = 10,
196
- verticalLength,
197
- strokeLinecap,
198
- strokeLinejoin,
199
- transform,
200
- } = props
201
- let arrowPath = ''
202
-
203
- switch (arrowType) {
204
- case 'solid':
205
- arrowPath = `M${-offset / 4},0 L${(3 * offset) / 4},${verticalLength} L${(3 * offset) / 4},-${verticalLength} Z`
206
- break
207
- case 'hollow':
208
- arrowPath = `M${-offset / 4},0 L${(3 * offset) / 4},${verticalLength} L${-offset / 4},0 L${(3 * offset) / 4},-${verticalLength} L${-offset / 4},0 Z`
209
- break
210
- case 'diamond':
211
- arrowPath = `M${-offset / 2},0 L0,${verticalLength} L${offset / 2},0 L0,-${verticalLength} L${-offset / 2},0 Z`
212
- break
213
- case 'circle':
214
- arrowPath = `M${-offset / 2},0 A${offset / 4},${offset / 4} 0 1,0 ${offset / 2},0 A${offset / 4},${offset / 4} 0 1,0 ${-offset / 2},0 Z`
215
- break
216
- default:
217
- arrowPath = ''
218
- break
219
- }
220
- return (
221
- <path
222
- d={arrowPath}
223
- stroke={stroke}
224
- fill={fill}
225
- strokeWidth={strokeWidth}
226
- strokeLinecap={strokeLinecap as any}
227
- strokeLinejoin={strokeLinejoin as any}
228
- transform={transform}
229
- />
230
- )
231
- }
232
-
233
- /**
234
- * @overridable 可重写,自定义边起点箭头形状。
235
- * @example
236
- * getStartArrow() {
237
- * const { model } = this.props;
238
- * const { stroke, strokeWidth, offset, verticalLength } = model.getArrowStyle();
239
- * return (
240
- * h('path', {
241
- * d: ''
242
- * })
243
- * )
244
- * }
245
- */
246
- getStartArrow(): h.JSX.Element | null {
247
- const { model } = this.props
248
- const {
249
- stroke,
250
- strokeWidth,
251
- offset,
252
- verticalLength,
253
- startArrowType = 'none',
254
- strokeLinecap,
255
- strokeLinejoin,
256
- } = model.getArrowStyle()
257
-
258
- return this.getArrowPath(startArrowType, {
259
- stroke,
260
- strokeWidth,
261
- offset,
262
- verticalLength,
263
- strokeLinecap,
264
- strokeLinejoin,
265
- })
266
- }
267
-
268
- /**
269
- * @overridable 可重写,自定义边终点箭头形状。
270
- * @example
271
- * getEndArrow() {
272
- * const { model } = this.props;
273
- * const { stroke, strokeWidth, offset, verticalLength } = model.getArrowStyle();
274
- * return (
275
- * h('path', {
276
- * d: ''
277
- * })
278
- * )
279
- * }
280
- */
281
- getEndArrow(): h.JSX.Element | null {
282
- const { model } = this.props
283
- const {
284
- stroke,
285
- strokeWidth,
286
- offset,
287
- verticalLength,
288
- endArrowType = 'solid',
289
- strokeLinecap,
290
- strokeLinejoin,
291
- } = model.getArrowStyle()
292
-
293
- return this.getArrowPath(endArrowType, {
294
- stroke,
295
- strokeWidth,
296
- offset,
297
- verticalLength,
298
- strokeLinecap,
299
- strokeLinejoin,
300
- transform: 'rotate(180)',
301
- })
302
- }
303
-
304
- /**
305
- * @overridable 可重写,自定义调整边连接节点形状。在开启了adjustEdgeStartAndEnd的时候,会显示调整点。
306
- * @param x 调整点x坐标
307
- * @param y 调整点y坐标
308
- * @param model
309
- * @example
310
- * getAdjustPointShape(x, y) {
311
- * const { model } = this.props;
312
- * const style = model.getAdjustPointStyle();
313
- * return (
314
- * h('circle', {
315
- * ...style,
316
- * x,
317
- * y
318
- * })
319
- * )
320
- * }
321
- */
322
- getAdjustPointShape(
323
- x: number,
324
- y: number,
325
- model: BaseEdgeModel,
326
- ): h.JSX.Element | null {
327
- const style = model.getAdjustPointStyle()
328
- return (
329
- <Circle
330
- className="lf-edge-adjust-point"
331
- {...style}
332
- {...{
333
- x,
334
- y,
335
- }}
336
- />
337
- )
338
- }
339
-
340
- /**
341
- * 不支持重写。请使用getAdjustPointShape
342
- */
343
- private getAdjustPoints() {
344
- const { model, graphModel } = this.props
345
- const {
346
- editConfigModel: {
347
- adjustEdgeStartAndEnd,
348
- adjustEdgeStart,
349
- adjustEdgeEnd,
350
- },
351
- } = graphModel
352
- const start = model.getAdjustStart()
353
- const end = model.getAdjustEnd()
354
-
355
- return (
356
- <g>
357
- {adjustEdgeStartAndEnd && adjustEdgeStart && (
358
- <AdjustPoint
359
- type={AdjustType.SOURCE}
360
- {...start}
361
- getAdjustPointShape={this.getAdjustPointShape}
362
- edgeModel={model}
363
- graphModel={graphModel}
364
- />
365
- )}
366
- {adjustEdgeStartAndEnd && adjustEdgeEnd && (
367
- <AdjustPoint
368
- type={AdjustType.TARGET}
369
- {...end}
370
- getAdjustPointShape={this.getAdjustPointShape}
371
- edgeModel={model}
372
- graphModel={graphModel}
373
- />
374
- )}
375
- </g>
376
- )
377
- }
378
-
379
- /**
380
- * @deprecated
381
- */
382
- getAnimation() {
383
- console.error(
384
- 'getAnimation is deprecated in 1.2.0, please use model.getEdgeAnimationStyle',
385
- )
386
- }
387
-
388
- /**
389
- * @overridable 可重写,在完全自定义边的时候,可以重写此方法,来自定义边的选区。
390
- */
391
- public getAppendWidth() {
392
- return <g />
393
- }
394
-
395
- /**
396
- * 不建议重写,此方法为扩大边选区,方便用户点击选中边。
397
- * 如果需要自定义边选区,请使用getAppendWidth。
398
- */
399
- getAppend() {
400
- return <g className="lf-edge-append">{this.getAppendWidth()}</g>
401
- }
402
-
403
- /**
404
- * 不支持重写,如果想要基于hover状态设置不同的样式,请在model中使用isHovered属性。
405
- */
406
- handleHover = (hovered: boolean, ev: MouseEvent) => {
407
- const {
408
- model,
409
- graphModel: { eventCenter },
410
- } = this.props
411
- model.setHovered(hovered)
412
- const eventName = hovered
413
- ? EventType.EDGE_MOUSEENTER
414
- : EventType.EDGE_MOUSELEAVE
415
- const nodeData = model.getData()
416
- eventCenter.emit(eventName, {
417
- data: nodeData,
418
- e: ev,
419
- })
420
- }
421
- /**
422
- * 不支持重写,如果想要基于hover状态设置不同的样式,请在model中使用isHovered属性。
423
- */
424
- setHoverOn = (ev: MouseEvent) => {
425
- // ! hover多次触发, onMouseOver + onMouseEnter
426
- const {
427
- model: { isHovered },
428
- } = this.props
429
- if (isHovered) return
430
- this.textRef && this.textRef.current && this.textRef.current.setHoverOn()
431
- this.handleHover(true, ev)
432
- }
433
- /**
434
- * 不支持重写,如果想要基于hover状态设置不同的样式,请在model中使用isHovered属性。
435
- */
436
- setHoverOff = (ev: MouseEvent) => {
437
- const {
438
- model: { isHovered },
439
- } = this.props
440
- if (!isHovered) return
441
- this.textRef && this.textRef.current && this.textRef.current.setHoverOff()
442
- this.handleHover(false, ev)
443
- }
444
- /**
445
- * 不支持重写,如果想要基于contextmenu事件做处理,请监听edge:contextmenu事件。
446
- */
447
- handleContextMenu = (ev: MouseEvent) => {
448
- ev.preventDefault()
449
- // 节点右击也会触发时间,区分右击和点击(mouseup)
450
- this.contextMenuTime = new Date().getTime()
451
- if (this.clickTimer) {
452
- clearTimeout(this.clickTimer)
453
- }
454
- const { model, graphModel } = this.props
455
- const { editConfigModel } = graphModel
456
- const position = graphModel.getPointByClient({
457
- x: ev.clientX,
458
- y: ev.clientY,
459
- })
460
- graphModel.setElementStateById(
461
- model.id,
462
- ElementState.SHOW_MENU,
463
- position.domOverlayPosition,
464
- )
465
- // 静默模式下点击节点不变更节点层级
466
- if (!editConfigModel.isSilentMode) {
467
- this.toFront()
468
- }
469
- if (!model.isSelected) {
470
- graphModel.selectEdgeById(model.id)
471
- }
472
- // 边数据
473
- const edgeData = model?.getData()
474
- graphModel.eventCenter.emit(EventType.EDGE_CONTEXTMENU, {
475
- data: edgeData,
476
- e: ev,
477
- position,
478
- })
479
- }
480
- /**
481
- * 不支持重写
482
- */
483
- handleMouseDown = (e: PointerEvent) => {
484
- e.stopPropagation()
485
- this.startTime = new Date().getTime()
486
- if (this.longPressTimer) {
487
- clearTimeout(this.longPressTimer)
488
- }
489
- if (e.pointerType === 'touch') {
490
- this.longPressTimer = window.setTimeout(() => {
491
- if (!this.props.model.isDragging) {
492
- this.handleContextMenu(e)
493
- }
494
- }, 500)
495
- }
496
- }
497
- handleMouseUp = () => {
498
- const { model } = this.props
499
- this.mouseUpDrag = model.isDragging
500
- if (this.longPressTimer) {
501
- clearTimeout(this.longPressTimer)
502
- this.longPressTimer = undefined
503
- }
504
- }
505
- /**
506
- * 不支持重写
507
- */
508
- handleClick = (e: MouseEvent) => {
509
- if (!this.startTime) return
510
- if (this.mouseUpDrag) return // 如果是拖拽,不触发click事件。
511
- const isRightClick = e.button === 2
512
- if (isRightClick) return
513
- // 这里 IE 11不能正确显示
514
- const isDoubleClick = e.detail === 2
515
- const { model, graphModel } = this.props
516
- const edgeData = model?.getData()
517
- const position = graphModel.getPointByClient({
518
- x: e.clientX,
519
- y: e.clientY,
520
- })
521
- if (isDoubleClick) {
522
- const { editConfigModel, textEditElement } = graphModel
523
- const { id, text, modelType } = model
524
- // 当前边正在编辑,需要先重置状态才能变更文本框位置
525
- if (textEditElement && textEditElement.id === id) {
526
- graphModel.setElementStateById(id, ElementState.DEFAULT)
527
- }
528
- // 边文案可编辑状态,才可以进行文案编辑
529
- if (editConfigModel.edgeTextEdit && text.editable) {
530
- model.setSelected(false)
531
- graphModel.setElementStateById(id, ElementState.TEXT_EDIT)
532
- }
533
- if (modelType === ModelType.POLYLINE_EDGE) {
534
- const polylineEdgeModel = model as PolylineEdgeModel
535
- const {
536
- canvasOverlayPosition: { x, y },
537
- } = graphModel.getPointByClient({
538
- x: e.x,
539
- y: e.y,
540
- })
541
- polylineEdgeModel.dbClickPosition = getClosestPointOfPolyline(
542
- {
543
- x,
544
- y,
545
- },
546
- polylineEdgeModel.points,
547
- )
548
- }
549
- graphModel.eventCenter.emit(EventType.EDGE_DBCLICK, {
550
- data: edgeData,
551
- e,
552
- position,
553
- })
554
- } else {
555
- // 单击
556
- // 边右击也会触发mouseup事件,判断是否有右击,如果有右击则取消点击事件触发
557
- // 边数据
558
- graphModel.eventCenter.emit(EventType.ELEMENT_CLICK, {
559
- data: edgeData,
560
- e,
561
- position,
562
- })
563
- graphModel.eventCenter.emit(EventType.EDGE_CLICK, {
564
- data: edgeData,
565
- e,
566
- position,
567
- })
568
- }
569
- const { editConfigModel } = graphModel
570
- graphModel.selectEdgeById(model.id, isMultipleSelect(e, editConfigModel))
571
- // 静默模式下点击节点不变更节点层级
572
- if (!editConfigModel.isSilentMode) {
573
- this.toFront()
574
- }
575
- }
576
-
577
- handleFocus = () => {
578
- const { model, graphModel } = this.props
579
- graphModel.eventCenter.emit(EventType.EDGE_FOCUS, {
580
- data: model.getData(),
581
- })
582
- }
583
-
584
- handleBlur = () => {
585
- const { model, graphModel } = this.props
586
- graphModel.eventCenter.emit(EventType.EDGE_BLUR, {
587
- data: model.getData(),
588
- })
589
- }
590
-
591
- /**
592
- * @overridable 支持重写, 此方法为获取边的形状,如果需要自定义边的形状,请重写此方法。
593
- * @example https://docs.logic-flow.cn/docs/#/zh/guide/basic/edge?id=%e5%9f%ba%e4%ba%8e-react-%e7%bb%84%e4%bb%b6%e8%87%aa%e5%ae%9a%e4%b9%89%e8%be%b9
594
- */
595
- getEdge(): h.JSX.Element | null {
596
- return null
597
- }
598
-
599
- /**
600
- * @overridable 支持重写, 此方法为边在被选中时将其置顶,如果不需要此功能,可以重写此方法。
601
- */
602
- toFront() {
603
- const { graphModel, model } = this.props
604
- graphModel.toFront(model.id)
605
- }
606
-
607
- /**
608
- * 不建议重写,如果要自定义边的形状,请重写getEdge方法。
609
- */
610
- render() {
611
- const {
612
- model: { isSelected, isHitable, isShowAdjustPoint },
613
- } = this.props
614
- return (
615
- <g>
616
- <g
617
- className={[
618
- 'lf-edge',
619
- !isHitable && 'pointer-none',
620
- isSelected && 'lf-edge-selected',
621
- ]
622
- .filter(Boolean)
623
- .join(' ')}
624
- style={{
625
- touchAction: 'none',
626
- WebkitTouchCallout: 'none',
627
- }}
628
- onClick={this.handleClick}
629
- onContextMenu={this.handleContextMenu}
630
- onPointerDown={this.handleMouseDown}
631
- onPointerUp={this.handleMouseUp}
632
- onPointerCancel={this.handleMouseUp}
633
- onMouseOver={this.setHoverOn}
634
- onMouseEnter={this.setHoverOn}
635
- onMouseLeave={this.setHoverOff}
636
- onFocus={this.handleFocus}
637
- onBlur={this.handleBlur}
638
- >
639
- {this.getShape()}
640
- {this.getAppend()}
641
- {this.getText()}
642
- {this.getArrow()}
643
- </g>
644
- {isShowAdjustPoint && isSelected ? this.getAdjustPoints() : ''}
645
- </g>
646
- )
647
- }
648
- }
649
-
650
- export default BaseEdge