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