@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.
- package/.turbo/turbo-build$colon$dev.log +2 -2
- package/.turbo/turbo-build.log +8 -8
- package/dist/index.min.js +4 -4
- package/es/LogicFlow.d.ts +19 -14
- package/es/LogicFlow.js +1 -2
- package/es/LogicFlow.js.map +1 -1
- package/es/event/eventArgs.d.ts +13 -4
- package/es/event/eventEmitter.d.ts +2 -2
- package/es/index.d.ts +1 -0
- package/es/index.js +1 -0
- package/es/index.js.map +1 -1
- package/es/keyboard/index.d.ts +1 -0
- package/es/keyboard/index.js +1 -0
- package/es/keyboard/index.js.map +1 -1
- package/es/keyboard/shortcut.d.ts +4 -0
- package/es/keyboard/shortcut.js +61 -0
- package/es/keyboard/shortcut.js.map +1 -1
- package/es/model/BaseModel.d.ts +15 -2
- package/es/model/EditConfigModel.d.ts +1 -1
- package/es/model/EditConfigModel.js +11 -11
- package/es/model/EditConfigModel.js.map +1 -1
- package/es/model/GraphModel.d.ts +12 -12
- package/es/model/GraphModel.js +3 -3
- package/es/model/GraphModel.js.map +1 -1
- package/es/model/edge/BaseEdgeModel.d.ts +9 -7
- package/es/model/edge/BaseEdgeModel.js +5 -2
- package/es/model/edge/BaseEdgeModel.js.map +1 -1
- package/es/model/edge/BezierEdgeModel.d.ts +2 -2
- package/es/model/edge/BezierEdgeModel.js +2 -1
- package/es/model/edge/BezierEdgeModel.js.map +1 -1
- package/es/model/edge/LineEdgeModel.js +2 -1
- package/es/model/edge/LineEdgeModel.js.map +1 -1
- package/es/model/edge/PolylineEdgeModel.js +2 -1
- package/es/model/edge/PolylineEdgeModel.js.map +1 -1
- package/es/model/node/BaseNodeModel.d.ts +35 -13
- package/es/model/node/BaseNodeModel.js +19 -17
- package/es/model/node/BaseNodeModel.js.map +1 -1
- package/es/model/node/CircleNodeModel.d.ts +2 -3
- package/es/model/node/CircleNodeModel.js +2 -5
- package/es/model/node/CircleNodeModel.js.map +1 -1
- package/es/model/node/DiamondNodeModel.d.ts +3 -4
- package/es/model/node/DiamondNodeModel.js +2 -5
- package/es/model/node/DiamondNodeModel.js.map +1 -1
- package/es/model/node/EllipseNodeModel.d.ts +3 -4
- package/es/model/node/EllipseNodeModel.js +2 -5
- package/es/model/node/EllipseNodeModel.js.map +1 -1
- package/es/model/node/HtmlNodeModel.d.ts +3 -4
- package/es/model/node/HtmlNodeModel.js +2 -12
- package/es/model/node/HtmlNodeModel.js.map +1 -1
- package/es/model/node/PolygonNodeModel.d.ts +3 -4
- package/es/model/node/PolygonNodeModel.js +2 -5
- package/es/model/node/PolygonNodeModel.js.map +1 -1
- package/es/model/node/RectNodeModel.d.ts +4 -5
- package/es/model/node/RectNodeModel.js +2 -5
- package/es/model/node/RectNodeModel.js.map +1 -1
- package/es/model/node/TextNodeModel.d.ts +14 -8
- package/es/model/node/TextNodeModel.js +2 -1
- package/es/model/node/TextNodeModel.js.map +1 -1
- package/es/util/edge.d.ts +1 -1
- package/es/util/index.d.ts +1 -0
- package/es/util/index.js +1 -0
- package/es/util/index.js.map +1 -1
- package/es/util/node.js +3 -0
- package/es/util/node.js.map +1 -1
- package/es/util/resize.d.ts +32 -0
- package/es/util/resize.js +197 -0
- package/es/util/resize.js.map +1 -0
- package/es/view/Anchor.d.ts +4 -3
- package/es/view/Control.d.ts +1 -1
- package/es/view/Control.js +72 -35
- package/es/view/Control.js.map +1 -1
- package/es/view/Graph.js +2 -1
- package/es/view/Graph.js.map +1 -1
- package/es/view/node/BaseNode.d.ts +2 -2
- package/es/view/node/BaseNode.js +15 -11
- package/es/view/node/BaseNode.js.map +1 -1
- package/es/view/node/CircleNode.d.ts +1 -1
- package/es/view/node/CircleNode.js.map +1 -1
- package/es/view/node/DiamondNode.d.ts +1 -1
- package/es/view/node/DiamondNode.js.map +1 -1
- package/es/view/node/EllipseNode.d.ts +1 -1
- package/es/view/node/EllipseNode.js.map +1 -1
- package/es/view/node/HtmlNode.d.ts +1 -1
- package/es/view/node/HtmlNode.js.map +1 -1
- package/es/view/node/PolygonNode.d.ts +1 -1
- package/es/view/node/PolygonNode.js.map +1 -1
- package/es/view/node/RectNode.d.ts +1 -1
- package/es/view/node/RectNode.js.map +1 -1
- package/es/view/node/TextNode.d.ts +1 -1
- package/es/view/node/TextNode.js.map +1 -1
- package/es/view/overlay/CanvasOverlay.js +4 -4
- package/es/view/overlay/CanvasOverlay.js.map +1 -1
- package/es/view/text/BaseText.js +1 -1
- package/es/view/text/BaseText.js.map +1 -1
- package/lib/LogicFlow.d.ts +19 -14
- package/lib/LogicFlow.js +2 -3
- package/lib/LogicFlow.js.map +1 -1
- package/lib/event/eventArgs.d.ts +13 -4
- package/lib/event/eventEmitter.d.ts +2 -2
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/keyboard/index.d.ts +1 -0
- package/lib/keyboard/index.js +15 -0
- package/lib/keyboard/index.js.map +1 -1
- package/lib/keyboard/shortcut.d.ts +4 -0
- package/lib/keyboard/shortcut.js +64 -1
- package/lib/keyboard/shortcut.js.map +1 -1
- package/lib/model/BaseModel.d.ts +15 -2
- package/lib/model/EditConfigModel.d.ts +1 -1
- package/lib/model/EditConfigModel.js +10 -10
- package/lib/model/EditConfigModel.js.map +1 -1
- package/lib/model/GraphModel.d.ts +12 -12
- package/lib/model/GraphModel.js +2 -2
- package/lib/model/GraphModel.js.map +1 -1
- package/lib/model/edge/BaseEdgeModel.d.ts +9 -7
- package/lib/model/edge/BaseEdgeModel.js +5 -2
- package/lib/model/edge/BaseEdgeModel.js.map +1 -1
- package/lib/model/edge/BezierEdgeModel.d.ts +2 -2
- package/lib/model/edge/BezierEdgeModel.js +2 -1
- package/lib/model/edge/BezierEdgeModel.js.map +1 -1
- package/lib/model/edge/LineEdgeModel.js +2 -1
- package/lib/model/edge/LineEdgeModel.js.map +1 -1
- package/lib/model/edge/PolylineEdgeModel.js +2 -1
- package/lib/model/edge/PolylineEdgeModel.js.map +1 -1
- package/lib/model/node/BaseNodeModel.d.ts +35 -13
- package/lib/model/node/BaseNodeModel.js +19 -17
- package/lib/model/node/BaseNodeModel.js.map +1 -1
- package/lib/model/node/CircleNodeModel.d.ts +2 -3
- package/lib/model/node/CircleNodeModel.js +2 -5
- package/lib/model/node/CircleNodeModel.js.map +1 -1
- package/lib/model/node/DiamondNodeModel.d.ts +3 -4
- package/lib/model/node/DiamondNodeModel.js +2 -5
- package/lib/model/node/DiamondNodeModel.js.map +1 -1
- package/lib/model/node/EllipseNodeModel.d.ts +3 -4
- package/lib/model/node/EllipseNodeModel.js +2 -5
- package/lib/model/node/EllipseNodeModel.js.map +1 -1
- package/lib/model/node/HtmlNodeModel.d.ts +3 -4
- package/lib/model/node/HtmlNodeModel.js +2 -12
- package/lib/model/node/HtmlNodeModel.js.map +1 -1
- package/lib/model/node/PolygonNodeModel.d.ts +3 -4
- package/lib/model/node/PolygonNodeModel.js +2 -5
- package/lib/model/node/PolygonNodeModel.js.map +1 -1
- package/lib/model/node/RectNodeModel.d.ts +4 -5
- package/lib/model/node/RectNodeModel.js +2 -5
- package/lib/model/node/RectNodeModel.js.map +1 -1
- package/lib/model/node/TextNodeModel.d.ts +14 -8
- package/lib/model/node/TextNodeModel.js +2 -1
- package/lib/model/node/TextNodeModel.js.map +1 -1
- package/lib/util/edge.d.ts +1 -1
- package/lib/util/index.d.ts +1 -0
- package/lib/util/index.js +1 -0
- package/lib/util/index.js.map +1 -1
- package/lib/util/node.js +3 -0
- package/lib/util/node.js.map +1 -1
- package/lib/util/resize.d.ts +32 -0
- package/lib/util/resize.js +204 -0
- package/lib/util/resize.js.map +1 -0
- package/lib/view/Anchor.d.ts +4 -3
- package/lib/view/Control.d.ts +1 -1
- package/lib/view/Control.js +71 -34
- package/lib/view/Control.js.map +1 -1
- package/lib/view/Graph.js +2 -1
- package/lib/view/Graph.js.map +1 -1
- package/lib/view/node/BaseNode.d.ts +2 -2
- package/lib/view/node/BaseNode.js +15 -11
- package/lib/view/node/BaseNode.js.map +1 -1
- package/lib/view/node/CircleNode.d.ts +1 -1
- package/lib/view/node/CircleNode.js.map +1 -1
- package/lib/view/node/DiamondNode.d.ts +1 -1
- package/lib/view/node/DiamondNode.js.map +1 -1
- package/lib/view/node/EllipseNode.d.ts +1 -1
- package/lib/view/node/EllipseNode.js.map +1 -1
- package/lib/view/node/HtmlNode.d.ts +1 -1
- package/lib/view/node/HtmlNode.js.map +1 -1
- package/lib/view/node/PolygonNode.d.ts +1 -1
- package/lib/view/node/PolygonNode.js.map +1 -1
- package/lib/view/node/RectNode.d.ts +1 -1
- package/lib/view/node/RectNode.js.map +1 -1
- package/lib/view/node/TextNode.d.ts +1 -1
- package/lib/view/node/TextNode.js.map +1 -1
- package/lib/view/overlay/CanvasOverlay.js +4 -4
- package/lib/view/overlay/CanvasOverlay.js.map +1 -1
- package/lib/view/text/BaseText.js +1 -1
- package/lib/view/text/BaseText.js.map +1 -1
- package/package.json +1 -1
- package/src/LogicFlow.tsx +18 -14
- package/src/event/eventArgs.ts +16 -4
- package/src/event/eventEmitter.ts +1 -1
- package/src/index.ts +1 -0
- package/src/keyboard/index.ts +2 -0
- package/src/keyboard/shortcut.ts +67 -0
- package/src/model/BaseModel.ts +16 -3
- package/src/model/EditConfigModel.ts +11 -11
- package/src/model/GraphModel.ts +3 -3
- package/src/model/edge/BaseEdgeModel.ts +17 -5
- package/src/model/edge/BezierEdgeModel.ts +2 -0
- package/src/model/edge/LineEdgeModel.ts +2 -0
- package/src/model/edge/PolylineEdgeModel.ts +2 -0
- package/src/model/node/BaseNodeModel.ts +27 -16
- package/src/model/node/CircleNodeModel.ts +6 -4
- package/src/model/node/DiamondNodeModel.ts +7 -5
- package/src/model/node/EllipseNodeModel.ts +7 -5
- package/src/model/node/HtmlNodeModel.ts +7 -6
- package/src/model/node/PolygonNodeModel.ts +7 -5
- package/src/model/node/RectNodeModel.ts +8 -7
- package/src/model/node/TextNodeModel.ts +14 -1
- package/src/util/index.ts +1 -0
- package/src/util/node.ts +4 -0
- package/src/util/resize.ts +286 -0
- package/src/view/Control.tsx +76 -57
- package/src/view/Graph.tsx +2 -1
- package/src/view/node/BaseNode.tsx +26 -13
- package/src/view/node/CircleNode.tsx +3 -1
- package/src/view/node/DiamondNode.tsx +3 -1
- package/src/view/node/EllipseNode.tsx +3 -1
- package/src/view/node/HtmlNode.tsx +3 -1
- package/src/view/node/PolygonNode.tsx +3 -1
- package/src/view/node/RectNode.tsx +3 -1
- package/src/view/node/TextNode.tsx +3 -1
- package/src/view/overlay/CanvasOverlay.tsx +4 -4
- 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]:
|
|
15
|
+
[key: string]: unknown
|
|
17
16
|
}
|
|
18
17
|
|
|
19
|
-
export class HtmlNodeModel
|
|
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
|
|
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]:
|
|
22
|
+
[key: string]: unknown
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
export class PolygonNodeModel
|
|
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
|
|
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
|
|
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]:
|
|
15
|
+
[key: string]: unknown
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
export class RectNodeModel
|
|
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:
|
|
23
|
+
// @observable properties: P
|
|
22
24
|
|
|
23
|
-
constructor(data: LogicFlow.NodeConfig
|
|
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
|
|
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
package/src/util/node.ts
CHANGED
|
@@ -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
|
+
}
|
package/src/view/Control.tsx
CHANGED
|
@@ -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
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
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
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
//
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
//
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
//
|
|
290
|
-
|
|
291
|
-
//
|
|
292
|
-
|
|
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={
|
|
339
|
-
height={
|
|
357
|
+
width={25}
|
|
358
|
+
height={25}
|
|
340
359
|
fill="transparent"
|
|
341
360
|
stroke="transparent"
|
|
342
361
|
onMouseDown={this.dragHandler.handleMouseDown}
|
package/src/view/Graph.tsx
CHANGED
|
@@ -47,7 +47,8 @@ class Graph extends Component<IGraphProps> {
|
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
componentDidUpdate() {
|
|
50
|
-
this.props.graphModel.
|
|
50
|
+
const data = this.props.graphModel.modelToGraphData()
|
|
51
|
+
this.props.graphModel.eventCenter.emit(EventType.GRAPH_UPDATED, { data })
|
|
51
52
|
}
|
|
52
53
|
|
|
53
54
|
componentWillUnmount() {
|