1+ @page " /Christmas"
2+ @implements IDisposable
3+ @using KristofferStrube .Blazor .GraphEditor
4+
5+ <PageTitle >Blazor.GraphEditor - Christmas</PageTitle >
6+
7+ <h1 >Christmas</h1 >
8+ <div style =" height :70vh ;" >
9+ <GraphEditor @ref =GraphEditor
10+ TNode =" Point"
11+ TEdge =" Edge"
12+ NodeIdMapper =" n => n.Id"
13+ NodeColorMapper =@(_ => "#FF4444")
14+ NodeRadiusMapper="_ => 20"
15+ EdgeFromMapper="e => e.From"
16+ EdgeToMapper="e => e.To"
17+ EdgeWidthMapper="e => e.Width"
18+ EdgeSpringLengthMapper="e => e.Length" />
19+ </div >
20+
21+ @code {
22+ private List <Point > points = new ();
23+ private List <Edge > edges = new ();
24+
25+ private GraphEditor .GraphEditor <Point , Edge > GraphEditor = default ! ;
26+ private bool running = true ;
27+
28+ protected override async Task OnAfterRenderAsync (bool firstRender )
29+ {
30+ if (! firstRender ) return ;
31+ while (! GraphEditor .IsReadyToLoad )
32+ {
33+ await Task .Delay (50 );
34+ }
35+
36+ await GraphEditor .LoadGraph (points , edges );
37+
38+ await Task .WhenAll (
39+ Layout (),
40+ AddEdges ()
41+ );
42+ }
43+
44+ private async Task Layout ()
45+ {
46+ while (running )
47+ {
48+ await GraphEditor .ForceDirectedLayout ();
49+ if (edges .Count > 0 )
50+ GraphEditor .SVGEditor .FitViewportToAllShapes (delta : 0 . 1 );
51+ await Task .Delay (10 );
52+ }
53+ }
54+
55+ private async Task AddEdges ()
56+ {
57+ List <Point > pointsToAdd = Enumerable .Range (0 , 12 )
58+ .Select (i => new Point (i .ToString ()))
59+ .ToList ();
60+
61+ List <Edge > edgesToAdd = [
62+ .. Enumerable .Range (0 , 12 ).Select (i => new Edge (pointsToAdd [i ], pointsToAdd [(i + 1 ) % 12 ], Width : 5 )),
63+ new (pointsToAdd [0 ], pointsToAdd [6 ], 250 ),
64+ new (pointsToAdd [0 ], pointsToAdd [4 ], 200 ),
65+ new (pointsToAdd [0 ], pointsToAdd [8 ], 200 ),
66+ new (pointsToAdd [0 ], pointsToAdd [3 ], 200 ),
67+ new (pointsToAdd [0 ], pointsToAdd [9 ], 200 ),
68+ new (pointsToAdd [0 ], pointsToAdd [5 ], 200 ),
69+ new (pointsToAdd [0 ], pointsToAdd [7 ], 200 ),
70+ new (pointsToAdd [0 ], pointsToAdd [2 ], 170 ),
71+ new (pointsToAdd [0 ], pointsToAdd [10 ], 170 ),
72+ ];
73+
74+ for (int i = 0 ; i < edgesToAdd .Count && running ; i ++ )
75+ {
76+ Edge edge = edgesToAdd [i ];
77+
78+ if (! points .Contains (edge .From ))
79+ points .Add (edge .From );
80+ if (! points .Contains (edge .To ))
81+ points .Add (edge .To );
82+
83+ edges .Add (edgesToAdd [i ]);
84+
85+ await GraphEditor .UpdateGraph (points , edges );
86+ await Task .Delay (200 );
87+ }
88+ }
89+
90+ public record Point (string Id );
91+
92+ public record Edge (Point From , Point To , float Length = 100 , float Width = 1 );
93+
94+ public void Dispose ()
95+ {
96+ running = false ;
97+ }
98+ }
0 commit comments