@@ -7,7 +7,7 @@ import createEngine, {
7
7
DiagramEngine ,
8
8
PathFindingLinkFactory
9
9
} from '@projectstorm/react-diagrams' ;
10
- import * as React from 'react' ;
10
+ import { useLayoutEffect , useRef } from 'react' ;
11
11
import { DemoButton , DemoWorkspaceWidget } from '../helpers/DemoWorkspaceWidget' ;
12
12
import { CanvasWidget } from '@projectstorm/react-canvas-core' ;
13
13
import { DemoCanvasWidget } from '../helpers/DemoCanvasWidget' ;
@@ -33,72 +33,82 @@ function connectNodes(nodeFrom, nodeTo, engine: DiagramEngine) {
33
33
/**
34
34
* Tests auto distribution
35
35
*/
36
- class DemoWidget extends React . Component < { model : DiagramModel ; engine : DiagramEngine } , any > {
37
- engine : DagreEngine ;
38
-
39
- constructor ( props ) {
40
- super ( props ) ;
41
- this . engine = new DagreEngine ( {
42
- graph : {
43
- rankdir : 'RL' ,
44
- ranker : 'longest-path' ,
45
- marginx : 25 ,
46
- marginy : 25
47
- } ,
48
- includeLinks : true ,
49
- nodeMargin : 25
50
- } ) ;
51
- }
36
+ function genDagreEngine ( ) {
37
+ return new DagreEngine ( {
38
+ graph : {
39
+ rankdir : 'RL' ,
40
+ ranker : 'longest-path' ,
41
+ marginx : 25 ,
42
+ marginy : 25
43
+ } ,
44
+ includeLinks : true ,
45
+ nodeMargin : 25
46
+ } ) ;
47
+ }
52
48
53
- autoDistribute = ( ) => {
54
- this . engine . redistribute ( this . props . model ) ;
55
-
56
- // only happens if pathfing is enabled (check line 25)
57
- this . reroute ( ) ;
58
- this . props . engine . repaintCanvas ( ) ;
59
- } ;
60
-
61
- autoRefreshLinks = ( ) => {
62
- this . engine . refreshLinks ( this . props . model ) ;
63
-
64
- // only happens if pathfing is enabled (check line 25)
65
- this . reroute ( ) ;
66
- this . props . engine . repaintCanvas ( ) ;
67
- } ;
68
- componentDidMount ( ) : void {
69
- setTimeout ( ( ) => {
70
- this . autoDistribute ( ) ;
71
- } , 500 ) ;
72
- }
49
+ function autoDistribute ( engine : DiagramEngine ) {
50
+ const model = engine . getModel ( ) ;
51
+
52
+ const dagreEngine = genDagreEngine ( ) ;
53
+ dagreEngine . redistribute ( model ) ;
54
+
55
+ reroute ( engine ) ;
56
+ engine . repaintCanvas ( ) ;
57
+ }
58
+
59
+ function autoRefreshLinks ( engine : DiagramEngine ) {
60
+ const model = engine . getModel ( ) ;
73
61
74
- reroute ( ) {
75
- this . props . engine
62
+ const dagreEngine = genDagreEngine ( ) ;
63
+ dagreEngine . refreshLinks ( model ) ;
64
+
65
+ // only happens if pathfing is enabled (check line 29)
66
+ reroute ( engine ) ;
67
+ engine . repaintCanvas ( ) ;
68
+ }
69
+
70
+ function reroute ( engine : DiagramEngine ) {
71
+ engine
76
72
. getLinkFactories ( )
77
73
. getFactory < PathFindingLinkFactory > ( PathFindingLinkFactory . NAME )
78
74
. calculateRoutingMatrix ( ) ;
75
+ }
76
+
77
+ function DemoWidget ( props ) {
78
+ const engine = props . engine ;
79
+
80
+ useLayoutEffect ( ( ) => {
81
+ autoDistribute ( engine ) ;
82
+ } , [ ] ) ;
83
+
84
+ const redistribute = ( ) => {
85
+ autoDistribute ( engine ) ;
79
86
}
80
87
81
- render ( ) {
82
- return (
83
- < DemoWorkspaceWidget
84
- buttons = {
85
- < div >
86
- < DemoButton onClick = { this . autoDistribute } > Re-distribute</ DemoButton >
87
- < DemoButton onClick = { this . autoRefreshLinks } > Refresh Links</ DemoButton >
88
- </ div >
89
- }
90
- >
91
- < DemoCanvasWidget >
92
- < CanvasWidget engine = { this . props . engine } />
93
- </ DemoCanvasWidget >
94
- </ DemoWorkspaceWidget >
95
- ) ;
88
+ const refreshLinks = ( ) => {
89
+ autoRefreshLinks ( engine ) ;
96
90
}
91
+
92
+ return (
93
+ < DemoWorkspaceWidget
94
+ buttons = {
95
+ < div >
96
+ < DemoButton onClick = { redistribute } > Re-distribute</ DemoButton >
97
+ < DemoButton onClick = { refreshLinks } > Refresh Links</ DemoButton >
98
+ </ div >
99
+ }
100
+ >
101
+ < DemoCanvasWidget >
102
+ < CanvasWidget engine = { engine } />
103
+ </ DemoCanvasWidget >
104
+ </ DemoWorkspaceWidget >
105
+ ) ;
97
106
}
98
107
99
108
export default ( ) => {
100
109
//1) setup the diagram engine
101
- let engine = createEngine ( ) ;
110
+ const engineRef = useRef ( createEngine ( ) ) ;
111
+ let engine = engineRef . current ;
102
112
103
113
//2) setup the diagram model
104
114
let model = new DiagramModel ( ) ;
0 commit comments