@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,512 +0,0 @@
1
- import { createElement as h, Component } from 'preact/compat'
2
- import { find, forEach, map, cloneDeep } from 'lodash-es'
3
- import { Rect } from './shape'
4
- import LogicFlow from '../LogicFlow'
5
- import { getNodeBBox, IDragParams, StepDrag, handleResize } from '../util'
6
- import { BaseNodeModel, GraphModel } from '../model'
7
-
8
- import NodeData = LogicFlow.NodeData
9
- import VectorData = LogicFlow.VectorData
10
- import { EventType } from '../constant'
11
- import ResizeNodeData = ResizeControl.ResizeNodeData
12
- import ResizeInfo = ResizeControl.ResizeInfo
13
- import ControlItemProps = ResizeControl.ControlItemProps
14
-
15
- export enum ResizeControlIndex {
16
- LEFT_TOP = 0,
17
- RIGHT_TOP = 1,
18
- RIGHT_BOTTOM = 2,
19
- LEFT_BOTTOM = 3,
20
- }
21
-
22
- export type IResizeControlProps = {
23
- model: BaseNodeModel
24
- graphModel: GraphModel
25
- } & ControlItemProps
26
-
27
- export type IResizeControlState = {
28
- startX: number
29
- startY: number
30
- endX: number
31
- endY: number
32
- dragging: boolean
33
- }
34
-
35
- export class ResizeControl extends Component<
36
- IResizeControlProps,
37
- IResizeControlState
38
- > {
39
- readonly index: ResizeControlIndex
40
- readonly nodeModel: BaseNodeModel
41
- readonly graphModel: GraphModel
42
- readonly dragHandler: StepDrag
43
-
44
- //判断Shift键状态
45
- private isShiftPressed = false
46
-
47
- constructor(props: IResizeControlProps) {
48
- super()
49
- const { index, model, graphModel } = props
50
- this.index = index
51
- this.nodeModel = model
52
- this.graphModel = graphModel
53
-
54
- this.dragHandler = new StepDrag({
55
- onDragStart: this.onDragStart,
56
- onDragging: this.onDragging,
57
- onDragEnd: this.onDragEnd,
58
- step: graphModel.gridSize,
59
- })
60
-
61
- this.bindKeyboardEvents()
62
- }
63
-
64
- //绑定键盘事件监听
65
- bindKeyboardEvents = () => {
66
- document.addEventListener('keydown', this.handleKeyDown)
67
- document.addEventListener('keyup', this.handleKeyUp)
68
- }
69
-
70
- //处理键盘按下事件
71
- handleKeyDown = (event: KeyboardEvent) => {
72
- if (event.key === 'Shift') {
73
- this.isShiftPressed = true
74
- }
75
- }
76
-
77
- handleKeyUp = (event: KeyboardEvent) => {
78
- if (event.key === 'Shift') {
79
- this.isShiftPressed = false
80
- }
81
- }
82
-
83
- componentWillUnmount() {
84
- this.dragHandler.destroy()
85
- document.removeEventListener('keydown', this.handleKeyDown)
86
- document.removeEventListener('keyup', this.handleKeyUp)
87
- }
88
-
89
- updateEdgePointByAnchors = () => {
90
- // https://github.com/didi/LogicFlow/issues/807
91
- // https://github.com/didi/LogicFlow/issues/875
92
- // 之前的做法,比如Rect是使用getRectResizeEdgePoint()计算边的point缩放后的位置
93
- // getRectResizeEdgePoint()考虑了瞄点在四条边以及在4个圆角的情况
94
- // 使用的是一种等比例缩放的模式,比如:
95
- // const pct = (y - beforeNode.y) / (beforeNode.height / 2 - radius)
96
- // afterPoint.y = afterNode.y + (afterNode.height / 2 - radius) * pct
97
- // 但是用户自定义的getDefaultAnchor()不一定是按照比例编写的
98
- // 它可能是 x: x + 20:每次缩放都会保持在x右边20的位置,因此用户自定义瞄点时,然后产生无法跟随的问题
99
- // 现在的做法是:直接获取用户自定义瞄点的位置,然后用这个位置作为边的新的起点,而不是自己进行计算
100
- const { id, anchors } = this.nodeModel
101
- const edges = this.graphModel.getNodeEdges(id)
102
- // 更新边
103
- forEach(edges, (edge) => {
104
- if (edge.sourceNodeId === id) {
105
- // 边是以该节点为 sourceNode 时
106
- const anchorItem = find(
107
- anchors,
108
- (anchor) => anchor.id === edge.sourceAnchorId,
109
- )
110
-
111
- if (anchorItem) {
112
- edge.updateStartPoint({
113
- x: anchorItem.x,
114
- y: anchorItem.y,
115
- })
116
- }
117
- } else if (edge.targetNodeId === id) {
118
- // 边是以该节点为 targetNode 时
119
- const anchorItem = find(
120
- anchors,
121
- (anchor) => anchor.id === edge.targetAnchorId,
122
- )
123
-
124
- if (anchorItem) {
125
- edge.updateEndPoint({
126
- x: anchorItem.x,
127
- y: anchorItem.y,
128
- })
129
- }
130
- }
131
- })
132
- }
133
-
134
- triggerResizeEvent = (
135
- preNodeData: ResizeNodeData,
136
- curNodeData: ResizeNodeData,
137
- deltaX,
138
- deltaY,
139
- index,
140
- nodeModel: BaseNodeModel,
141
- ) => {
142
- this.graphModel.eventCenter.emit(EventType.NODE_RESIZE, {
143
- preData: preNodeData,
144
- data: curNodeData,
145
- deltaX,
146
- deltaY,
147
- index,
148
- model: nodeModel,
149
- })
150
- }
151
-
152
- /**
153
- * 计算 Control 拖动后,节点的高度信息
154
- * @param index
155
- * @param resizeInfo
156
- * @param pct
157
- * @param freezeWidth
158
- * @param freezeHeight
159
- */
160
- recalcResizeInfo = (
161
- index: ResizeControlIndex,
162
- resizeInfo: ResizeInfo,
163
- pct = 1,
164
- freezeWidth = false,
165
- freezeHeight = false,
166
- ): ResizeInfo => {
167
- const nextResizeInfo = cloneDeep(resizeInfo)
168
- let { deltaX, deltaY } = nextResizeInfo
169
- const { width, height, PCTResizeInfo } = nextResizeInfo
170
- if (PCTResizeInfo) {
171
- const sensitivity = 4 // 越低越灵敏
172
- let deltaScale = 0
173
- let combineDelta = 0
174
- switch (index) {
175
- case ResizeControlIndex.LEFT_TOP:
176
- combineDelta = (deltaX * -1 - deltaY) / sensitivity
177
- break
178
- case ResizeControlIndex.RIGHT_TOP:
179
- combineDelta = (deltaX - deltaY) / sensitivity
180
- break
181
- case ResizeControlIndex.RIGHT_BOTTOM:
182
- combineDelta = (deltaX + deltaY) / sensitivity
183
- break
184
- case ResizeControlIndex.LEFT_BOTTOM:
185
- combineDelta = (deltaX * -1 + deltaY) / sensitivity
186
- break
187
- default:
188
- break
189
- }
190
-
191
- if (combineDelta !== 0) {
192
- deltaScale =
193
- Math.round(
194
- (combineDelta / PCTResizeInfo.ResizeBasis.basisHeight) * 100000,
195
- ) / 1000
196
- }
197
-
198
- PCTResizeInfo.ResizePCT.widthPCT = Math.max(
199
- Math.min(
200
- PCTResizeInfo.ResizePCT.widthPCT + deltaScale,
201
- PCTResizeInfo.ScaleLimit.maxScaleLimit,
202
- ),
203
- PCTResizeInfo.ScaleLimit.minScaleLimit,
204
- )
205
- PCTResizeInfo.ResizePCT.heightPCT = Math.max(
206
- Math.min(
207
- PCTResizeInfo.ResizePCT.heightPCT + deltaScale,
208
- PCTResizeInfo.ScaleLimit.maxScaleLimit,
209
- ),
210
- PCTResizeInfo.ScaleLimit.minScaleLimit,
211
- )
212
-
213
- const spcWidth = Math.round(
214
- (PCTResizeInfo.ResizePCT.widthPCT *
215
- PCTResizeInfo.ResizeBasis.basisWidth) /
216
- 100,
217
- )
218
- const spcHeight = Math.round(
219
- (PCTResizeInfo.ResizePCT.heightPCT *
220
- PCTResizeInfo.ResizeBasis.basisHeight) /
221
- 100,
222
- )
223
-
224
- switch (index) {
225
- case ResizeControlIndex.LEFT_TOP:
226
- deltaX = width - spcWidth
227
- deltaY = height - spcHeight
228
- break
229
- case ResizeControlIndex.RIGHT_TOP:
230
- deltaX = spcWidth - width
231
- deltaY = height - spcHeight
232
- break
233
- case ResizeControlIndex.RIGHT_BOTTOM:
234
- deltaX = spcWidth - width
235
- deltaY = spcHeight - height
236
- break
237
- case ResizeControlIndex.LEFT_BOTTOM:
238
- deltaX = width - spcWidth
239
- deltaY = spcHeight - height
240
- break
241
- default:
242
- break
243
- }
244
- return nextResizeInfo
245
- }
246
-
247
- // 如果限制了宽/高不变,对应的 width/height 保持一致
248
- switch (index) {
249
- case ResizeControlIndex.LEFT_TOP:
250
- nextResizeInfo.width = freezeWidth ? width : width - deltaX * pct
251
- nextResizeInfo.height = freezeHeight ? height : height - deltaY * pct
252
- break
253
- case ResizeControlIndex.RIGHT_TOP:
254
- nextResizeInfo.width = freezeWidth ? width : width + deltaX * pct
255
- nextResizeInfo.height = freezeHeight ? height : height - deltaY * pct
256
- break
257
- case ResizeControlIndex.RIGHT_BOTTOM:
258
- nextResizeInfo.width = freezeWidth ? width : width + deltaX * pct
259
- nextResizeInfo.height = freezeHeight ? height : height + deltaY * pct
260
- break
261
- case ResizeControlIndex.LEFT_BOTTOM:
262
- nextResizeInfo.width = freezeWidth ? width : width - deltaX * pct
263
- nextResizeInfo.height = freezeHeight ? height : height + deltaY * pct
264
- break
265
- default:
266
- break
267
- }
268
-
269
- return nextResizeInfo
270
- }
271
-
272
- resizeNode = ({ deltaX, deltaY }: VectorData) => {
273
- const { index } = this
274
- const { model, graphModel, x, y } = this.props
275
- // DONE: 调用每个节点中更新缩放时的方法 updateNode 函数,用来各节点缩放的方法
276
- handleResize({
277
- x,
278
- y,
279
- deltaX,
280
- deltaY,
281
- index,
282
- nodeModel: model,
283
- graphModel,
284
- forceProportional: this.isShiftPressed,
285
- cancelCallback: () => {
286
- this.dragHandler.cancelDrag()
287
- },
288
- })
289
- // 1. 计算当前 Control 的一些信息,
290
- // const {
291
- // r, // circle
292
- // rx, // ellipse/diamond
293
- // ry,
294
- // width, // rect/html
295
- // height,
296
- // PCTResizeInfo,
297
- //
298
- // minWidth,
299
- // minHeight,
300
- // maxWidth,
301
- // maxHeight,
302
- // } = this.nodeModel
303
- // const isFreezeWidth = minWidth === maxWidth
304
- // const isFreezeHeight = minHeight === maxHeight
305
- //
306
- // const resizeInfo = {
307
- // width: r || rx || width,
308
- // height: r || ry || height,
309
- // deltaX,
310
- // deltaY,
311
- // PCTResizeInfo,
312
- // }
313
- //
314
- // const pct = r || (rx && ry) ? 1 / 2 : 1
315
- // const nextSize = this.recalcResizeInfo(
316
- // this.index,
317
- // resizeInfo,
318
- // pct,
319
- // isFreezeWidth,
320
- // isFreezeHeight,
321
- // )
322
- //
323
- // // 限制放大缩小的最大最小范围
324
- // if (
325
- // nextSize.width < minWidth ||
326
- // nextSize.width > maxWidth ||
327
- // nextSize.height < minHeight ||
328
- // nextSize.height > maxHeight
329
- // ) {
330
- // this.dragHandler.cancelDrag()
331
- // return
332
- // }
333
- // // 如果限制了宽高不变,对应的 x/y 不产生位移
334
- // nextSize.deltaX = isFreezeWidth ? 0 : nextSize.deltaX
335
- // nextSize.deltaY = isFreezeWidth ? 0 : nextSize.deltaY
336
- //
337
- // const preNodeData = this.nodeModel.getData()
338
- // const curNodeData = this.nodeModel.resize(nextSize)
339
- //
340
- // // 更新边
341
- // this.updateEdgePointByAnchors()
342
- // // 触发 resize 事件
343
- // this.triggerResizeEvent(preNodeData, curNodeData, deltaX, deltaY, this.index, this.nodeModel)
344
- }
345
-
346
- onDragStart = () => {
347
- this.graphModel.selectNodeById(this.nodeModel.id)
348
- }
349
-
350
- onDragging = ({ deltaX, deltaY }: IDragParams) => {
351
- const { transformModel } = this.graphModel
352
- const [dx, dy] = transformModel.fixDeltaXY(deltaX, deltaY)
353
- this.resizeNode({
354
- deltaX: dx,
355
- deltaY: dy,
356
- })
357
- }
358
-
359
- // 由于将拖拽放大缩小改成丝滑模式,这个时候需要再拖拽结束的时候,将节点的位置更新到 grid 上。
360
- onDragEnd = () => {
361
- // TODO: 确认下面该代码是否还需要(应该是默认让节点拖拽以 gridSize 为步长移动)
362
- // const { gridSize = 1 } = this.graphModel
363
- // const x = gridSize * Math.round(this.nodeModel.x / gridSize)
364
- // const y = gridSize * Math.round(this.nodeModel.y / gridSize)
365
- const x = this.nodeModel.x
366
- const y = this.nodeModel.y
367
- this.nodeModel.moveTo(x, y)
368
-
369
- // 先触发 onDragging() -> 更新边 -> 再触发用户自定义的 getDefaultAnchor(),所以 onDragging()
370
- // 拿到的 anchors 是滞后的,为了正确的设置最终的位置,应该在拖拽结束的时候,再设置一次边的 Point 位置,
371
- // 此时拿到的 anchors 是最新的
372
- this.updateEdgePointByAnchors()
373
- }
374
-
375
- render(): h.JSX.Element {
376
- const { x, y, direction, model } = this.props
377
- const { width, height, ...restStyle } = model.getResizeControlStyle()
378
- return (
379
- <g className={`lf-resize-control lf-resize-control-${direction}`}>
380
- <Rect
381
- className="lf-resize-control-content"
382
- x={x}
383
- y={y}
384
- width={width ?? 7}
385
- height={height ?? 7}
386
- {...restStyle}
387
- />
388
- <Rect
389
- className="lf-resize-control-content"
390
- x={x}
391
- y={y}
392
- width={25}
393
- height={25}
394
- fill="transparent"
395
- stroke="transparent"
396
- onPointerDown={this.dragHandler.handleMouseDown}
397
- />
398
- </g>
399
- )
400
- }
401
- }
402
-
403
- interface IResizeControlGroupProps {
404
- style: LogicFlow.CommonTheme
405
- model: BaseNodeModel
406
- graphModel: GraphModel
407
- }
408
-
409
- export class ResizeControlGroup extends Component<IResizeControlGroupProps> {
410
- constructor() {
411
- super()
412
- }
413
-
414
- getResizeControl(): h.JSX.Element[] {
415
- const { model, graphModel } = this.props
416
- const { minX, minY, maxX, maxY } = getNodeBBox(model)
417
-
418
- const controlList: ControlItemProps[] = [
419
- {
420
- index: ResizeControlIndex.LEFT_TOP,
421
- direction: 'nw',
422
- x: minX,
423
- y: minY,
424
- }, // 左上角
425
- {
426
- index: ResizeControlIndex.RIGHT_TOP,
427
- direction: 'ne',
428
- x: maxX,
429
- y: minY,
430
- }, // 右上角
431
- {
432
- index: ResizeControlIndex.RIGHT_BOTTOM,
433
- direction: 'se',
434
- x: maxX,
435
- y: maxY,
436
- }, // 右下角
437
- {
438
- index: ResizeControlIndex.LEFT_BOTTOM,
439
- direction: 'sw',
440
- x: minX,
441
- y: maxY,
442
- }, // 左下角
443
- ]
444
-
445
- return map(controlList, (control) => (
446
- <ResizeControl {...control} model={model} graphModel={graphModel} />
447
- ))
448
- }
449
-
450
- getResizeOutline() {
451
- const { model } = this.props
452
- const { x, y, width, height } = model
453
- const style = model.getResizeOutlineStyle()
454
- return <Rect {...style} x={x} y={y} width={width} height={height} />
455
- }
456
-
457
- render(): h.JSX.Element {
458
- return (
459
- <g className="lf-resize-control-group">
460
- {this.getResizeOutline()}
461
- {this.getResizeControl()}
462
- </g>
463
- )
464
- }
465
- }
466
-
467
- export namespace ResizeControl {
468
- export type RectShapeResizeProps = {
469
- width: number
470
- height: number
471
- }
472
-
473
- export type PolygonShapeResizerProps = {
474
- rx: number
475
- ry: number
476
- }
477
- export type ResizeProps = RectShapeResizeProps | PolygonShapeResizerProps
478
-
479
- export type ResizeInfo = {
480
- width: number
481
- height: number
482
- deltaX: number
483
- deltaY: number
484
- PCTResizeInfo?: PCTResizeParams
485
- }
486
- export type ResizeNodeData = NodeData & Partial<ResizeProps>
487
-
488
- export type Direction = 'nw' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w'
489
- export type ControlItemProps = {
490
- index: ResizeControlIndex
491
- direction: Direction
492
- x: number
493
- y: number
494
- }
495
-
496
- export type PCTResizeParams = {
497
- ResizePCT: {
498
- widthPCT: number
499
- heightPCT: number
500
- }
501
- ResizeBasis: {
502
- basisWidth: number
503
- basisHeight: number
504
- }
505
- ScaleLimit: {
506
- maxScaleLimit: number
507
- minScaleLimit: number
508
- }
509
- }
510
- }
511
-
512
- export default ResizeControlGroup
@@ -1,141 +0,0 @@
1
- import { Component, ComponentType } from 'preact/compat'
2
- import { map, throttle } from 'lodash-es'
3
- import {
4
- CanvasOverlay,
5
- ToolOverlay,
6
- BackgroundOverlay,
7
- Grid,
8
- SnaplineOverlay,
9
- OutlineOverlay,
10
- BezierAdjustOverlay,
11
- ModificationOverlay,
12
- } from './overlay'
13
- import DnD from './behavior/dnd'
14
- import { observer } from '..'
15
- import Tool from '../tool'
16
- import { Options as LFOptions } from '../options'
17
- import {
18
- GraphModel,
19
- BaseEdgeModel,
20
- BaseNodeModel,
21
- SnaplineModel,
22
- } from '../model'
23
- import { EventType } from '../constant'
24
-
25
- type IGraphProps = {
26
- getView: (type: string) => ComponentType<any> | undefined
27
- tool: Tool
28
- options: LFOptions.Definition
29
- dnd: DnD
30
- snaplineModel?: SnaplineModel
31
- graphModel: GraphModel
32
- }
33
-
34
- type ContainerStyle = {
35
- width?: string
36
- height?: string
37
- }
38
-
39
- @observer
40
- class Graph extends Component<IGraphProps> {
41
- private handleResize = () => {
42
- const { graphModel, options } = this.props
43
- const { width, height, isContainerWidth, isContainerHeight } = graphModel
44
- let resizeWidth: number | undefined = width
45
- let resizeHeight: number | undefined = height
46
- let needUpdate = false
47
- if (isContainerWidth) {
48
- resizeWidth = undefined
49
- needUpdate = true
50
- }
51
- if (isContainerHeight) {
52
- resizeHeight = undefined
53
- needUpdate = true
54
- }
55
- if (needUpdate) {
56
- graphModel.resize(resizeWidth, resizeHeight)
57
- }
58
- options.width = width
59
- options.height = height
60
- }
61
- private throttleResize = throttle(this.handleResize, 200)
62
-
63
- componentDidMount() {
64
- window.addEventListener('resize', this.throttleResize)
65
- }
66
-
67
- componentDidUpdate() {
68
- const data = this.props.graphModel.modelToGraphData()
69
- this.props.graphModel.eventCenter.emit(EventType.GRAPH_UPDATED, { data })
70
- }
71
-
72
- componentWillUnmount() {
73
- window.removeEventListener('resize', this.throttleResize)
74
- }
75
-
76
- getComponent(
77
- model: BaseEdgeModel | BaseNodeModel,
78
- graphModel: GraphModel,
79
- overlay = 'canvas-overlay',
80
- ) {
81
- const { getView } = this.props
82
- // https://juejin.cn/post/7046639346656493582 - 几种方式来声明React Component的类型
83
- const View = getView(model.type)
84
- if (View) {
85
- return (
86
- <View
87
- key={model.id}
88
- model={model}
89
- graphModel={graphModel}
90
- overlay={overlay}
91
- />
92
- )
93
- }
94
- return null
95
- }
96
-
97
- render() {
98
- const { graphModel, tool, options, dnd, snaplineModel } = this.props
99
- const style: ContainerStyle = {}
100
- // 如果初始化的时候,不传宽高,则默认为父容器宽高。
101
- if (options.width) {
102
- style.width = `${graphModel.width}px`
103
- }
104
- if (options.height) {
105
- style.height = `${graphModel.height}px`
106
- }
107
- const { fakeNode, editConfigModel, background } = graphModel
108
- const { adjustEdge } = editConfigModel
109
- return (
110
- <div className="lf-graph" flow-id={graphModel.flowId} style={style}>
111
- {/* 元素层 */}
112
- <CanvasOverlay graphModel={graphModel} dnd={dnd}>
113
- <g className="lf-base">
114
- {map(graphModel.sortElements, (nodeModel) =>
115
- this.getComponent(nodeModel, graphModel),
116
- )}
117
- </g>
118
- {fakeNode ? this.getComponent(fakeNode, graphModel) : ''}
119
- </CanvasOverlay>
120
- {/* 虚线边框 */}
121
- <ModificationOverlay graphModel={graphModel}>
122
- <OutlineOverlay graphModel={graphModel} />
123
- {adjustEdge ? <BezierAdjustOverlay graphModel={graphModel} /> : ''}
124
- {options.snapline !== false ? (
125
- <SnaplineOverlay snaplineModel={snaplineModel} />
126
- ) : (
127
- ''
128
- )}
129
- </ModificationOverlay>
130
- {/* 工具层:插件 */}
131
- <ToolOverlay graphModel={graphModel} tool={tool} />
132
- {/* 画布背景 */}
133
- {background && <BackgroundOverlay background={background} />}
134
- {/* 画布网格 */}
135
- <Grid graphModel={graphModel} />
136
- </div>
137
- )
138
- }
139
- }
140
-
141
- export default Graph