@logicflow/core 2.0.0-beta.6 → 2.0.0-beta.8

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 (222) hide show
  1. package/.turbo/turbo-build$colon$dev.log +2 -2
  2. package/.turbo/turbo-build.log +8 -8
  3. package/dist/index.min.js +4 -4
  4. package/es/LogicFlow.d.ts +19 -14
  5. package/es/LogicFlow.js +1 -2
  6. package/es/LogicFlow.js.map +1 -1
  7. package/es/event/eventArgs.d.ts +13 -4
  8. package/es/event/eventEmitter.d.ts +2 -2
  9. package/es/index.d.ts +1 -0
  10. package/es/index.js +1 -0
  11. package/es/index.js.map +1 -1
  12. package/es/keyboard/index.d.ts +1 -0
  13. package/es/keyboard/index.js +1 -0
  14. package/es/keyboard/index.js.map +1 -1
  15. package/es/keyboard/shortcut.d.ts +4 -0
  16. package/es/keyboard/shortcut.js +61 -0
  17. package/es/keyboard/shortcut.js.map +1 -1
  18. package/es/model/BaseModel.d.ts +15 -2
  19. package/es/model/EditConfigModel.d.ts +1 -1
  20. package/es/model/EditConfigModel.js +11 -11
  21. package/es/model/EditConfigModel.js.map +1 -1
  22. package/es/model/GraphModel.d.ts +12 -12
  23. package/es/model/GraphModel.js +3 -3
  24. package/es/model/GraphModel.js.map +1 -1
  25. package/es/model/edge/BaseEdgeModel.d.ts +9 -7
  26. package/es/model/edge/BaseEdgeModel.js +5 -2
  27. package/es/model/edge/BaseEdgeModel.js.map +1 -1
  28. package/es/model/edge/BezierEdgeModel.d.ts +2 -2
  29. package/es/model/edge/BezierEdgeModel.js +2 -1
  30. package/es/model/edge/BezierEdgeModel.js.map +1 -1
  31. package/es/model/edge/LineEdgeModel.js +2 -1
  32. package/es/model/edge/LineEdgeModel.js.map +1 -1
  33. package/es/model/edge/PolylineEdgeModel.js +2 -1
  34. package/es/model/edge/PolylineEdgeModel.js.map +1 -1
  35. package/es/model/node/BaseNodeModel.d.ts +35 -13
  36. package/es/model/node/BaseNodeModel.js +19 -17
  37. package/es/model/node/BaseNodeModel.js.map +1 -1
  38. package/es/model/node/CircleNodeModel.d.ts +2 -3
  39. package/es/model/node/CircleNodeModel.js +2 -5
  40. package/es/model/node/CircleNodeModel.js.map +1 -1
  41. package/es/model/node/DiamondNodeModel.d.ts +3 -4
  42. package/es/model/node/DiamondNodeModel.js +2 -5
  43. package/es/model/node/DiamondNodeModel.js.map +1 -1
  44. package/es/model/node/EllipseNodeModel.d.ts +3 -4
  45. package/es/model/node/EllipseNodeModel.js +2 -5
  46. package/es/model/node/EllipseNodeModel.js.map +1 -1
  47. package/es/model/node/HtmlNodeModel.d.ts +3 -4
  48. package/es/model/node/HtmlNodeModel.js +2 -12
  49. package/es/model/node/HtmlNodeModel.js.map +1 -1
  50. package/es/model/node/PolygonNodeModel.d.ts +3 -4
  51. package/es/model/node/PolygonNodeModel.js +2 -5
  52. package/es/model/node/PolygonNodeModel.js.map +1 -1
  53. package/es/model/node/RectNodeModel.d.ts +4 -5
  54. package/es/model/node/RectNodeModel.js +2 -5
  55. package/es/model/node/RectNodeModel.js.map +1 -1
  56. package/es/model/node/TextNodeModel.d.ts +14 -8
  57. package/es/model/node/TextNodeModel.js +2 -1
  58. package/es/model/node/TextNodeModel.js.map +1 -1
  59. package/es/util/edge.d.ts +1 -1
  60. package/es/util/index.d.ts +1 -0
  61. package/es/util/index.js +1 -0
  62. package/es/util/index.js.map +1 -1
  63. package/es/util/node.js +3 -0
  64. package/es/util/node.js.map +1 -1
  65. package/es/util/resize.d.ts +32 -0
  66. package/es/util/resize.js +197 -0
  67. package/es/util/resize.js.map +1 -0
  68. package/es/view/Anchor.d.ts +4 -3
  69. package/es/view/Control.d.ts +1 -1
  70. package/es/view/Control.js +72 -35
  71. package/es/view/Control.js.map +1 -1
  72. package/es/view/Graph.js +2 -1
  73. package/es/view/Graph.js.map +1 -1
  74. package/es/view/node/BaseNode.d.ts +2 -2
  75. package/es/view/node/BaseNode.js +15 -11
  76. package/es/view/node/BaseNode.js.map +1 -1
  77. package/es/view/node/CircleNode.d.ts +1 -1
  78. package/es/view/node/CircleNode.js.map +1 -1
  79. package/es/view/node/DiamondNode.d.ts +1 -1
  80. package/es/view/node/DiamondNode.js.map +1 -1
  81. package/es/view/node/EllipseNode.d.ts +1 -1
  82. package/es/view/node/EllipseNode.js.map +1 -1
  83. package/es/view/node/HtmlNode.d.ts +1 -1
  84. package/es/view/node/HtmlNode.js.map +1 -1
  85. package/es/view/node/PolygonNode.d.ts +1 -1
  86. package/es/view/node/PolygonNode.js.map +1 -1
  87. package/es/view/node/RectNode.d.ts +1 -1
  88. package/es/view/node/RectNode.js.map +1 -1
  89. package/es/view/node/TextNode.d.ts +1 -1
  90. package/es/view/node/TextNode.js.map +1 -1
  91. package/es/view/overlay/CanvasOverlay.js +4 -4
  92. package/es/view/overlay/CanvasOverlay.js.map +1 -1
  93. package/es/view/text/BaseText.js +1 -1
  94. package/es/view/text/BaseText.js.map +1 -1
  95. package/lib/LogicFlow.d.ts +19 -14
  96. package/lib/LogicFlow.js +2 -3
  97. package/lib/LogicFlow.js.map +1 -1
  98. package/lib/event/eventArgs.d.ts +13 -4
  99. package/lib/event/eventEmitter.d.ts +2 -2
  100. package/lib/index.d.ts +1 -0
  101. package/lib/index.js +1 -0
  102. package/lib/index.js.map +1 -1
  103. package/lib/keyboard/index.d.ts +1 -0
  104. package/lib/keyboard/index.js +15 -0
  105. package/lib/keyboard/index.js.map +1 -1
  106. package/lib/keyboard/shortcut.d.ts +4 -0
  107. package/lib/keyboard/shortcut.js +64 -1
  108. package/lib/keyboard/shortcut.js.map +1 -1
  109. package/lib/model/BaseModel.d.ts +15 -2
  110. package/lib/model/EditConfigModel.d.ts +1 -1
  111. package/lib/model/EditConfigModel.js +10 -10
  112. package/lib/model/EditConfigModel.js.map +1 -1
  113. package/lib/model/GraphModel.d.ts +12 -12
  114. package/lib/model/GraphModel.js +2 -2
  115. package/lib/model/GraphModel.js.map +1 -1
  116. package/lib/model/edge/BaseEdgeModel.d.ts +9 -7
  117. package/lib/model/edge/BaseEdgeModel.js +5 -2
  118. package/lib/model/edge/BaseEdgeModel.js.map +1 -1
  119. package/lib/model/edge/BezierEdgeModel.d.ts +2 -2
  120. package/lib/model/edge/BezierEdgeModel.js +2 -1
  121. package/lib/model/edge/BezierEdgeModel.js.map +1 -1
  122. package/lib/model/edge/LineEdgeModel.js +2 -1
  123. package/lib/model/edge/LineEdgeModel.js.map +1 -1
  124. package/lib/model/edge/PolylineEdgeModel.js +2 -1
  125. package/lib/model/edge/PolylineEdgeModel.js.map +1 -1
  126. package/lib/model/node/BaseNodeModel.d.ts +35 -13
  127. package/lib/model/node/BaseNodeModel.js +19 -17
  128. package/lib/model/node/BaseNodeModel.js.map +1 -1
  129. package/lib/model/node/CircleNodeModel.d.ts +2 -3
  130. package/lib/model/node/CircleNodeModel.js +2 -5
  131. package/lib/model/node/CircleNodeModel.js.map +1 -1
  132. package/lib/model/node/DiamondNodeModel.d.ts +3 -4
  133. package/lib/model/node/DiamondNodeModel.js +2 -5
  134. package/lib/model/node/DiamondNodeModel.js.map +1 -1
  135. package/lib/model/node/EllipseNodeModel.d.ts +3 -4
  136. package/lib/model/node/EllipseNodeModel.js +2 -5
  137. package/lib/model/node/EllipseNodeModel.js.map +1 -1
  138. package/lib/model/node/HtmlNodeModel.d.ts +3 -4
  139. package/lib/model/node/HtmlNodeModel.js +2 -12
  140. package/lib/model/node/HtmlNodeModel.js.map +1 -1
  141. package/lib/model/node/PolygonNodeModel.d.ts +3 -4
  142. package/lib/model/node/PolygonNodeModel.js +2 -5
  143. package/lib/model/node/PolygonNodeModel.js.map +1 -1
  144. package/lib/model/node/RectNodeModel.d.ts +4 -5
  145. package/lib/model/node/RectNodeModel.js +2 -5
  146. package/lib/model/node/RectNodeModel.js.map +1 -1
  147. package/lib/model/node/TextNodeModel.d.ts +14 -8
  148. package/lib/model/node/TextNodeModel.js +2 -1
  149. package/lib/model/node/TextNodeModel.js.map +1 -1
  150. package/lib/util/edge.d.ts +1 -1
  151. package/lib/util/index.d.ts +1 -0
  152. package/lib/util/index.js +1 -0
  153. package/lib/util/index.js.map +1 -1
  154. package/lib/util/node.js +3 -0
  155. package/lib/util/node.js.map +1 -1
  156. package/lib/util/resize.d.ts +32 -0
  157. package/lib/util/resize.js +204 -0
  158. package/lib/util/resize.js.map +1 -0
  159. package/lib/view/Anchor.d.ts +4 -3
  160. package/lib/view/Control.d.ts +1 -1
  161. package/lib/view/Control.js +71 -34
  162. package/lib/view/Control.js.map +1 -1
  163. package/lib/view/Graph.js +2 -1
  164. package/lib/view/Graph.js.map +1 -1
  165. package/lib/view/node/BaseNode.d.ts +2 -2
  166. package/lib/view/node/BaseNode.js +15 -11
  167. package/lib/view/node/BaseNode.js.map +1 -1
  168. package/lib/view/node/CircleNode.d.ts +1 -1
  169. package/lib/view/node/CircleNode.js.map +1 -1
  170. package/lib/view/node/DiamondNode.d.ts +1 -1
  171. package/lib/view/node/DiamondNode.js.map +1 -1
  172. package/lib/view/node/EllipseNode.d.ts +1 -1
  173. package/lib/view/node/EllipseNode.js.map +1 -1
  174. package/lib/view/node/HtmlNode.d.ts +1 -1
  175. package/lib/view/node/HtmlNode.js.map +1 -1
  176. package/lib/view/node/PolygonNode.d.ts +1 -1
  177. package/lib/view/node/PolygonNode.js.map +1 -1
  178. package/lib/view/node/RectNode.d.ts +1 -1
  179. package/lib/view/node/RectNode.js.map +1 -1
  180. package/lib/view/node/TextNode.d.ts +1 -1
  181. package/lib/view/node/TextNode.js.map +1 -1
  182. package/lib/view/overlay/CanvasOverlay.js +4 -4
  183. package/lib/view/overlay/CanvasOverlay.js.map +1 -1
  184. package/lib/view/text/BaseText.js +1 -1
  185. package/lib/view/text/BaseText.js.map +1 -1
  186. package/package.json +1 -1
  187. package/src/LogicFlow.tsx +18 -14
  188. package/src/event/eventArgs.ts +16 -4
  189. package/src/event/eventEmitter.ts +1 -1
  190. package/src/index.ts +1 -0
  191. package/src/keyboard/index.ts +2 -0
  192. package/src/keyboard/shortcut.ts +67 -0
  193. package/src/model/BaseModel.ts +16 -3
  194. package/src/model/EditConfigModel.ts +11 -11
  195. package/src/model/GraphModel.ts +3 -3
  196. package/src/model/edge/BaseEdgeModel.ts +17 -5
  197. package/src/model/edge/BezierEdgeModel.ts +2 -0
  198. package/src/model/edge/LineEdgeModel.ts +2 -0
  199. package/src/model/edge/PolylineEdgeModel.ts +2 -0
  200. package/src/model/node/BaseNodeModel.ts +27 -16
  201. package/src/model/node/CircleNodeModel.ts +6 -4
  202. package/src/model/node/DiamondNodeModel.ts +7 -5
  203. package/src/model/node/EllipseNodeModel.ts +7 -5
  204. package/src/model/node/HtmlNodeModel.ts +7 -6
  205. package/src/model/node/PolygonNodeModel.ts +7 -5
  206. package/src/model/node/RectNodeModel.ts +8 -7
  207. package/src/model/node/TextNodeModel.ts +14 -1
  208. package/src/util/index.ts +1 -0
  209. package/src/util/node.ts +4 -0
  210. package/src/util/resize.ts +286 -0
  211. package/src/view/Control.tsx +76 -57
  212. package/src/view/Graph.tsx +2 -1
  213. package/src/view/node/BaseNode.tsx +26 -13
  214. package/src/view/node/CircleNode.tsx +3 -1
  215. package/src/view/node/DiamondNode.tsx +3 -1
  216. package/src/view/node/EllipseNode.tsx +3 -1
  217. package/src/view/node/HtmlNode.tsx +3 -1
  218. package/src/view/node/PolygonNode.tsx +3 -1
  219. package/src/view/node/RectNode.tsx +3 -1
  220. package/src/view/node/TextNode.tsx +3 -1
  221. package/src/view/overlay/CanvasOverlay.tsx +4 -4
  222. package/src/view/text/BaseText.tsx +1 -1
@@ -3,7 +3,6 @@ import { Model } from '../BaseModel'
3
3
  import { ModelType } from '../../constant'
4
4
 
5
5
  import AnchorConfig = Model.AnchorConfig
6
- import { observable } from 'mobx'
7
6
  import LogicFlow from '../../LogicFlow'
8
7
  import GraphModel from '../GraphModel'
9
8
 
@@ -13,16 +12,18 @@ export type IHtmlNodeProperties = {
13
12
  style?: LogicFlow.CommonTheme
14
13
  textStyle?: LogicFlow.CommonTheme
15
14
 
16
- [key: string]: any
15
+ [key: string]: unknown
17
16
  }
18
17
 
19
- export class HtmlNodeModel extends BaseNodeModel {
18
+ export class HtmlNodeModel<
19
+ P extends IHtmlNodeProperties = IHtmlNodeProperties,
20
+ > extends BaseNodeModel<P> {
20
21
  modelType = ModelType.HTML_NODE
21
- @observable properties: IHtmlNodeProperties = {}
22
+ // @observable properties: IHtmlNodeProperties = {}
22
23
 
23
- constructor(data: LogicFlow.NodeConfig, graphModel: GraphModel) {
24
+ constructor(data: LogicFlow.NodeConfig<P>, graphModel: GraphModel) {
24
25
  super(data, graphModel)
25
- this.properties = data.properties || {}
26
+ // this.properties = data.properties || {}
26
27
 
27
28
  this.setAttributes()
28
29
  }
@@ -19,10 +19,12 @@ export type IPolygonNodeProperties = {
19
19
  style?: LogicFlow.CommonTheme
20
20
  textStyle?: LogicFlow.CommonTheme
21
21
 
22
- [key: string]: any
22
+ [key: string]: unknown
23
23
  }
24
24
 
25
- export class PolygonNodeModel extends BaseNodeModel {
25
+ export class PolygonNodeModel<
26
+ P extends IPolygonNodeProperties = IPolygonNodeProperties,
27
+ > extends BaseNodeModel<P> {
26
28
  modelType = ModelType.POLYGON_NODE
27
29
  @observable points: PointTuple[] = [
28
30
  [50, 0],
@@ -36,11 +38,11 @@ export class PolygonNodeModel extends BaseNodeModel {
36
38
  // [10, 78],
37
39
  // [160, 198], // 五角星
38
40
  ]
39
- @observable properties: IPolygonNodeProperties = {}
41
+ // @observable properties: IPolygonNodeProperties = {}
40
42
 
41
- constructor(data: NodeConfig, graphModel: GraphModel) {
43
+ constructor(data: NodeConfig<P>, graphModel: GraphModel) {
42
44
  super(data, graphModel)
43
- this.properties = data.properties || {}
45
+ // this.properties = data.properties || {}
44
46
 
45
47
  this.setAttributes()
46
48
  }
@@ -5,26 +5,28 @@ import GraphModel from '../GraphModel'
5
5
  import LogicFlow from '../../LogicFlow'
6
6
  import { ModelType } from '../../constant'
7
7
 
8
- export type IRectNodeModel = {
8
+ export type IRectNodeProperties = {
9
9
  width?: number
10
10
  height?: number
11
11
  radius?: number
12
12
  style?: LogicFlow.CommonTheme
13
13
  textStyle?: LogicFlow.CommonTheme
14
14
 
15
- [key: string]: any
15
+ [key: string]: unknown
16
16
  }
17
17
 
18
- export class RectNodeModel extends BaseNodeModel {
18
+ export class RectNodeModel<
19
+ P extends IRectNodeProperties = IRectNodeProperties,
20
+ > extends BaseNodeModel<P> {
19
21
  modelType = ModelType.RECT_NODE
20
22
  @observable radius = 0
21
- @observable properties: IRectNodeModel = {}
23
+ // @observable properties: P
22
24
 
23
- constructor(data: LogicFlow.NodeConfig, graphModel: GraphModel) {
25
+ constructor(data: LogicFlow.NodeConfig<P>, graphModel: GraphModel) {
24
26
  super(data, graphModel)
25
27
 
26
28
  // TODO:类字段初始化会覆盖 super、setAttributes 中设置的属性
27
- this.properties = data.properties || {}
29
+ // this.properties = data.properties || {}
28
30
  // TODO: bug here, 上面更新 properties 会触发 setAttributes,下面再主动调用,会导致触发两次
29
31
  this.setAttributes()
30
32
  }
@@ -48,7 +50,6 @@ export class RectNodeModel extends BaseNodeModel {
48
50
  { x: x - width / 2, y, id: `${this.id}_3` },
49
51
  ]
50
52
  }
51
-
52
53
  getNodeStyle() {
53
54
  const style = super.getNodeStyle()
54
55
  const { rect } = this.graphModel.theme
@@ -3,18 +3,31 @@ import { computed } from 'mobx'
3
3
  import BaseNodeModel from './BaseNodeModel'
4
4
  import { ModelType } from '../../constant'
5
5
  import { getSvgTextWidthHeight } from '../../util'
6
+ import LogicFlow from '../../LogicFlow'
6
7
 
7
- export class TextNodeModel extends BaseNodeModel {
8
+ export type ITextNodeProperties = {
9
+ style?: LogicFlow.CommonTheme
10
+ textStyle?: LogicFlow.CommonTheme
11
+
12
+ [key: string]: unknown
13
+ }
14
+
15
+ export class TextNodeModel<
16
+ P extends ITextNodeProperties = ITextNodeProperties,
17
+ > extends BaseNodeModel<P> {
8
18
  modelType = ModelType.TEXT_NODE
9
19
 
10
20
  getTextStyle() {
11
21
  const style = super.getTextStyle()
12
22
  const { text } = this.graphModel.theme
23
+ const { textStyle } = this.properties
13
24
  return {
14
25
  ...style,
15
26
  ...cloneDeep(text),
27
+ ...cloneDeep(textStyle),
16
28
  }
17
29
  }
30
+
18
31
  @computed get width(): number {
19
32
  const rows = String(this.text.value).split(/[\r\n]/g)
20
33
  const { fontSize } = this.getTextStyle()
package/src/util/index.ts CHANGED
@@ -9,6 +9,7 @@ export * from './matrix'
9
9
  export * from './mobx'
10
10
  export * from './node'
11
11
  export * from './raf'
12
+ export * from './resize'
12
13
  export * from './sampling'
13
14
  export * from './theme'
14
15
  export * from './uuid'
package/src/util/node.ts CHANGED
@@ -413,6 +413,10 @@ export const pickNodeConfig = (data: NodeConfig): NodeConfig => {
413
413
  'properties',
414
414
  'virtual', // 区域节点是否为dnd添加的虚拟节点
415
415
  'rotate',
416
+
417
+ // TODO: 确认是否可以加到此处
418
+ 'resizable',
419
+ 'rotatable',
416
420
  ])
417
421
  return nodeData
418
422
  }
@@ -0,0 +1,286 @@
1
+ import { ResizeControl, ResizeControlIndex } from '../view/Control'
2
+ import { cloneDeep, find, forEach } from 'lodash-es'
3
+ import { BaseNodeModel, GraphModel } from '../model'
4
+ import { EventType } from '../constant'
5
+
6
+ import ResizeInfo = ResizeControl.ResizeInfo
7
+ import ResizeNodeData = ResizeControl.ResizeNodeData
8
+
9
+ /**
10
+ * 计算 Control 拖动后,节点的高度信息
11
+ * @param index
12
+ * @param resizeInfo
13
+ * @param pct
14
+ * @param freezeWidth
15
+ * @param freezeHeight
16
+ */
17
+ export const recalcResizeInfo = (
18
+ index: ResizeControlIndex,
19
+ resizeInfo: ResizeInfo,
20
+ pct = 1,
21
+ freezeWidth = false,
22
+ freezeHeight = false,
23
+ ): ResizeInfo => {
24
+ const nextResizeInfo = cloneDeep(resizeInfo)
25
+ let { deltaX, deltaY } = nextResizeInfo
26
+ const { width, height, PCTResizeInfo } = nextResizeInfo
27
+ if (PCTResizeInfo) {
28
+ const sensitivity = 4 // 越低越灵敏
29
+ let deltaScale = 0
30
+ let combineDelta = 0
31
+ switch (index) {
32
+ case ResizeControlIndex.LEFT_TOP:
33
+ combineDelta = (deltaX * -1 - deltaY) / sensitivity
34
+ break
35
+ case ResizeControlIndex.RIGHT_TOP:
36
+ combineDelta = (deltaX - deltaY) / sensitivity
37
+ break
38
+ case ResizeControlIndex.RIGHT_BOTTOM:
39
+ combineDelta = (deltaX + deltaY) / sensitivity
40
+ break
41
+ case ResizeControlIndex.LEFT_BOTTOM:
42
+ combineDelta = (deltaX * -1 + deltaY) / sensitivity
43
+ break
44
+ default:
45
+ break
46
+ }
47
+
48
+ if (combineDelta !== 0) {
49
+ deltaScale =
50
+ Math.round(
51
+ (combineDelta / PCTResizeInfo.ResizeBasis.basisHeight) * 100000,
52
+ ) / 1000
53
+ }
54
+
55
+ PCTResizeInfo.ResizePCT.widthPCT = Math.max(
56
+ Math.min(
57
+ PCTResizeInfo.ResizePCT.widthPCT + deltaScale,
58
+ PCTResizeInfo.ScaleLimit.maxScaleLimit,
59
+ ),
60
+ PCTResizeInfo.ScaleLimit.minScaleLimit,
61
+ )
62
+ PCTResizeInfo.ResizePCT.heightPCT = Math.max(
63
+ Math.min(
64
+ PCTResizeInfo.ResizePCT.heightPCT + deltaScale,
65
+ PCTResizeInfo.ScaleLimit.maxScaleLimit,
66
+ ),
67
+ PCTResizeInfo.ScaleLimit.minScaleLimit,
68
+ )
69
+
70
+ const spcWidth = Math.round(
71
+ (PCTResizeInfo.ResizePCT.widthPCT *
72
+ PCTResizeInfo.ResizeBasis.basisWidth) /
73
+ 100,
74
+ )
75
+ const spcHeight = Math.round(
76
+ (PCTResizeInfo.ResizePCT.heightPCT *
77
+ PCTResizeInfo.ResizeBasis.basisHeight) /
78
+ 100,
79
+ )
80
+
81
+ switch (index) {
82
+ case ResizeControlIndex.LEFT_TOP:
83
+ deltaX = width - spcWidth
84
+ deltaY = height - spcHeight
85
+ break
86
+ case ResizeControlIndex.RIGHT_TOP:
87
+ deltaX = spcWidth - width
88
+ deltaY = height - spcHeight
89
+ break
90
+ case ResizeControlIndex.RIGHT_BOTTOM:
91
+ deltaX = spcWidth - width
92
+ deltaY = spcHeight - height
93
+ break
94
+ case ResizeControlIndex.LEFT_BOTTOM:
95
+ deltaX = width - spcWidth
96
+ deltaY = spcHeight - height
97
+ break
98
+ default:
99
+ break
100
+ }
101
+ return nextResizeInfo
102
+ }
103
+
104
+ // 如果限制了宽/高不变,对应的 width/height 保持一致
105
+ switch (index) {
106
+ case ResizeControlIndex.LEFT_TOP:
107
+ nextResizeInfo.width = freezeWidth ? width : width - deltaX * pct
108
+ nextResizeInfo.height = freezeHeight ? height : height - deltaY * pct
109
+ break
110
+ case ResizeControlIndex.RIGHT_TOP:
111
+ nextResizeInfo.width = freezeWidth ? width : width + deltaX * pct
112
+ nextResizeInfo.height = freezeHeight ? height : height - deltaY * pct
113
+ break
114
+ case ResizeControlIndex.RIGHT_BOTTOM:
115
+ nextResizeInfo.width = freezeWidth ? width : width + deltaX * pct
116
+ nextResizeInfo.height = freezeHeight ? height : height + deltaY * pct
117
+ break
118
+ case ResizeControlIndex.LEFT_BOTTOM:
119
+ nextResizeInfo.width = freezeWidth ? width : width - deltaX * pct
120
+ nextResizeInfo.height = freezeHeight ? height : height + deltaY * pct
121
+ break
122
+ default:
123
+ break
124
+ }
125
+
126
+ return nextResizeInfo
127
+ }
128
+
129
+ export const updateEdgePointByAnchors = (
130
+ nodeModel: BaseNodeModel,
131
+ graphModel: GraphModel,
132
+ ) => {
133
+ // https://github.com/didi/LogicFlow/issues/807
134
+ // https://github.com/didi/LogicFlow/issues/875
135
+ // 之前的做法,比如Rect是使用getRectResizeEdgePoint()计算边的point缩放后的位置
136
+ // getRectResizeEdgePoint()考虑了瞄点在四条边以及在4个圆角的情况
137
+ // 使用的是一种等比例缩放的模式,比如:
138
+ // const pct = (y - beforeNode.y) / (beforeNode.height / 2 - radius)
139
+ // afterPoint.y = afterNode.y + (afterNode.height / 2 - radius) * pct
140
+ // 但是用户自定义的getDefaultAnchor()不一定是按照比例编写的
141
+ // 它可能是 x: x + 20:每次缩放都会保持在x右边20的位置,因此用户自定义瞄点时,然后产生无法跟随的问题
142
+ // 现在的做法是:直接获取用户自定义瞄点的位置,然后用这个位置作为边的新的起点,而不是自己进行计算
143
+ const { id, anchors } = nodeModel
144
+ const edges = graphModel.getNodeEdges(id)
145
+ // 更新边
146
+ forEach(edges, (edge) => {
147
+ if (edge.sourceNodeId === id) {
148
+ // 边是以该节点为 sourceNode 时
149
+ const anchorItem = find(
150
+ anchors,
151
+ (anchor) => anchor.id === edge.sourceAnchorId,
152
+ )
153
+
154
+ if (anchorItem) {
155
+ edge.updateStartPoint({
156
+ x: anchorItem.x,
157
+ y: anchorItem.y,
158
+ })
159
+ }
160
+ } else if (edge.targetNodeId === id) {
161
+ // 边是以该节点为 targetNode 时
162
+ const anchorItem = find(
163
+ anchors,
164
+ (anchor) => anchor.id === edge.targetAnchorId,
165
+ )
166
+
167
+ if (anchorItem) {
168
+ edge.updateEndPoint({
169
+ x: anchorItem.x,
170
+ y: anchorItem.y,
171
+ })
172
+ }
173
+ }
174
+ })
175
+ }
176
+
177
+ export const triggerResizeEvent = (
178
+ preNodeData: ResizeNodeData,
179
+ curNodeData: ResizeNodeData,
180
+ deltaX: number,
181
+ deltaY: number,
182
+ index: number,
183
+ nodeModel: BaseNodeModel,
184
+ graphModel: GraphModel,
185
+ ) => {
186
+ graphModel.eventCenter.emit(EventType.NODE_RESIZE, {
187
+ preData: preNodeData,
188
+ data: curNodeData,
189
+ deltaX,
190
+ deltaY,
191
+ index,
192
+ model: nodeModel,
193
+ })
194
+ }
195
+
196
+ // TODO:确认 handleResize 函数的类型定义
197
+ // export type IHandleResizeParams = {
198
+ // deltaX: number
199
+ // deltaY: number
200
+ // index: ResizeControlIndex
201
+ // nodeModel: BaseNodeModel
202
+ // graphModel: GraphModel
203
+ // cancelCallback?: () => void
204
+ // }
205
+
206
+ /**
207
+ * 处理节点的 resize 事件,提出来放到 utils 中,方便在外面(extension)中使用
208
+ * @param deltaX
209
+ * @param deltaY
210
+ * @param index
211
+ * @param nodeModel
212
+ * @param graphModel
213
+ * @param cancelCallback
214
+ */
215
+ export const handleResize = ({
216
+ deltaX,
217
+ deltaY,
218
+ index,
219
+ nodeModel,
220
+ graphModel,
221
+ cancelCallback,
222
+ }) => {
223
+ const {
224
+ r, // circle
225
+ rx, // ellipse/diamond
226
+ ry,
227
+ width, // rect/html
228
+ height,
229
+ PCTResizeInfo,
230
+
231
+ minWidth,
232
+ minHeight,
233
+ maxWidth,
234
+ maxHeight,
235
+ } = nodeModel
236
+ const isFreezeWidth = minWidth === maxWidth
237
+ const isFreezeHeight = minHeight === maxHeight
238
+
239
+ const resizeInfo = {
240
+ width: r || rx || width,
241
+ height: r || ry || height,
242
+ deltaX,
243
+ deltaY,
244
+ PCTResizeInfo,
245
+ }
246
+
247
+ const pct = r || (rx && ry) ? 1 / 2 : 1
248
+ const nextSize = recalcResizeInfo(
249
+ index,
250
+ resizeInfo,
251
+ pct,
252
+ isFreezeWidth,
253
+ isFreezeHeight,
254
+ )
255
+
256
+ // 限制放大缩小的最大最小范围
257
+ if (
258
+ nextSize.width < minWidth ||
259
+ nextSize.width > maxWidth ||
260
+ nextSize.height < minHeight ||
261
+ nextSize.height > maxHeight
262
+ ) {
263
+ // this.dragHandler.cancelDrag()
264
+ cancelCallback?.()
265
+ return
266
+ }
267
+ // 如果限制了宽高不变,对应的 x/y 不产生位移
268
+ nextSize.deltaX = isFreezeWidth ? 0 : nextSize.deltaX
269
+ nextSize.deltaY = isFreezeWidth ? 0 : nextSize.deltaY
270
+
271
+ const preNodeData = nodeModel.getData()
272
+ const curNodeData = nodeModel.resize(nextSize)
273
+
274
+ // 更新边
275
+ updateEdgePointByAnchors(nodeModel, graphModel)
276
+ // 触发 resize 事件
277
+ triggerResizeEvent(
278
+ preNodeData,
279
+ curNodeData,
280
+ deltaX,
281
+ deltaY,
282
+ index,
283
+ nodeModel,
284
+ graphModel,
285
+ )
286
+ }
@@ -2,7 +2,7 @@ import { createElement as h, Component } from 'preact/compat'
2
2
  import { cloneDeep, find, forEach, map } from 'lodash-es'
3
3
  import { Rect } from './shape'
4
4
  import LogicFlow from '../LogicFlow'
5
- import { getNodeBBox, IDragParams, StepDrag } from '../util'
5
+ import { getNodeBBox, IDragParams, StepDrag, handleResize } from '../util'
6
6
  import { BaseNodeModel, GraphModel } from '../model'
7
7
 
8
8
  import NodeData = LogicFlow.NodeData
@@ -104,11 +104,17 @@ export class ResizeControl extends Component<
104
104
  triggerResizeEvent = (
105
105
  preNodeData: ResizeNodeData,
106
106
  curNodeData: ResizeNodeData,
107
+ deltaX,
108
+ deltaY,
109
+ index,
107
110
  nodeModel: BaseNodeModel,
108
111
  ) => {
109
112
  this.graphModel.eventCenter.emit(EventType.NODE_RESIZE, {
110
113
  preData: preNodeData,
111
114
  data: curNodeData,
115
+ deltaX,
116
+ deltaY,
117
+ index,
112
118
  model: nodeModel,
113
119
  })
114
120
  }
@@ -234,62 +240,75 @@ export class ResizeControl extends Component<
234
240
  }
235
241
 
236
242
  resizeNode = ({ deltaX, deltaY }: VectorData) => {
237
- // TODO: 调用每个节点中更新缩放时的方法 updateNode 函数,用来各节点缩放的方法
238
- // 1. 计算当前 Control 的一些信息,
239
- const {
240
- r, // circle
241
- rx, // ellipse/diamond
242
- ry,
243
- width, // rect/html
244
- height,
245
- PCTResizeInfo,
246
-
247
- minWidth,
248
- minHeight,
249
- maxWidth,
250
- maxHeight,
251
- } = this.nodeModel
252
- const isFreezeWidth = minWidth === maxWidth
253
- const isFreezeHeight = minHeight === maxHeight
254
-
255
- const resizeInfo = {
256
- width: r || rx || width,
257
- height: r || ry || height,
243
+ const { index } = this
244
+ const { model, graphModel } = this.props
245
+
246
+ // DONE: 调用每个节点中更新缩放时的方法 updateNode 函数,用来各节点缩放的方法
247
+ handleResize({
258
248
  deltaX,
259
249
  deltaY,
260
- PCTResizeInfo,
261
- }
262
-
263
- const pct = r || (rx && ry) ? 1 / 2 : 1
264
- const nextSize = this.recalcResizeInfo(
265
- this.index,
266
- resizeInfo,
267
- pct,
268
- isFreezeWidth,
269
- isFreezeHeight,
270
- )
271
-
272
- // 限制放大缩小的最大最小范围
273
- if (
274
- nextSize.width < minWidth ||
275
- nextSize.width > maxWidth ||
276
- nextSize.height < minHeight ||
277
- nextSize.height > maxHeight
278
- ) {
279
- this.dragHandler.cancelDrag()
280
- return
281
- }
282
- // 如果限制了宽高不变,对应的 x/y 不产生位移
283
- nextSize.deltaX = isFreezeWidth ? 0 : nextSize.deltaX
284
- nextSize.deltaY = isFreezeWidth ? 0 : nextSize.deltaY
285
-
286
- const preNodeData = this.nodeModel.getData()
287
- const curNodeData = this.nodeModel.resize(nextSize)
288
-
289
- // 更新边
290
- this.updateEdgePointByAnchors()
291
- // 触发 resize 事件
292
- this.triggerResizeEvent(preNodeData, curNodeData, this.nodeModel)
250
+ index,
251
+ nodeModel: model,
252
+ graphModel,
253
+ cancelCallback: () => {
254
+ this.dragHandler.cancelDrag()
255
+ },
256
+ })
257
+ // 1. 计算当前 Control 的一些信息,
258
+ // const {
259
+ // r, // circle
260
+ // rx, // ellipse/diamond
261
+ // ry,
262
+ // width, // rect/html
263
+ // height,
264
+ // PCTResizeInfo,
265
+ //
266
+ // minWidth,
267
+ // minHeight,
268
+ // maxWidth,
269
+ // maxHeight,
270
+ // } = this.nodeModel
271
+ // const isFreezeWidth = minWidth === maxWidth
272
+ // const isFreezeHeight = minHeight === maxHeight
273
+ //
274
+ // const resizeInfo = {
275
+ // width: r || rx || width,
276
+ // height: r || ry || height,
277
+ // deltaX,
278
+ // deltaY,
279
+ // PCTResizeInfo,
280
+ // }
281
+ //
282
+ // const pct = r || (rx && ry) ? 1 / 2 : 1
283
+ // const nextSize = this.recalcResizeInfo(
284
+ // this.index,
285
+ // resizeInfo,
286
+ // pct,
287
+ // isFreezeWidth,
288
+ // isFreezeHeight,
289
+ // )
290
+ //
291
+ // // 限制放大缩小的最大最小范围
292
+ // if (
293
+ // nextSize.width < minWidth ||
294
+ // nextSize.width > maxWidth ||
295
+ // nextSize.height < minHeight ||
296
+ // nextSize.height > maxHeight
297
+ // ) {
298
+ // this.dragHandler.cancelDrag()
299
+ // return
300
+ // }
301
+ // // 如果限制了宽高不变,对应的 x/y 不产生位移
302
+ // nextSize.deltaX = isFreezeWidth ? 0 : nextSize.deltaX
303
+ // nextSize.deltaY = isFreezeWidth ? 0 : nextSize.deltaY
304
+ //
305
+ // const preNodeData = this.nodeModel.getData()
306
+ // const curNodeData = this.nodeModel.resize(nextSize)
307
+ //
308
+ // // 更新边
309
+ // this.updateEdgePointByAnchors()
310
+ // // 触发 resize 事件
311
+ // this.triggerResizeEvent(preNodeData, curNodeData, deltaX, deltaY, this.index, this.nodeModel)
293
312
  }
294
313
 
295
314
  onDragging = ({ deltaX, deltaY }: IDragParams) => {
@@ -335,8 +354,8 @@ export class ResizeControl extends Component<
335
354
  className="lf-resize-control-content"
336
355
  x={x}
337
356
  y={y}
338
- width={30}
339
- height={30}
357
+ width={25}
358
+ height={25}
340
359
  fill="transparent"
341
360
  stroke="transparent"
342
361
  onMouseDown={this.dragHandler.handleMouseDown}
@@ -47,7 +47,8 @@ class Graph extends Component<IGraphProps> {
47
47
  }
48
48
 
49
49
  componentDidUpdate() {
50
- this.props.graphModel.eventCenter.emit(EventType.GRAPH_UPDATED, {})
50
+ const data = this.props.graphModel.modelToGraphData()
51
+ this.props.graphModel.eventCenter.emit(EventType.GRAPH_UPDATED, { data })
51
52
  }
52
53
 
53
54
  componentWillUnmount() {