11import 'dart:math' ;
2-
32import 'package:flutter/material.dart' ;
43import 'package:graphview/GraphView.dart' ;
54
@@ -9,6 +8,10 @@ class LayeredGraphViewPage extends StatefulWidget {
98}
109
1110class _LayeredGraphViewPageState extends State <LayeredGraphViewPage > {
11+ GraphViewController _controller = GraphViewController ();
12+ final Random r = Random ();
13+ int nextNodeId = 0 ;
14+
1215 @override
1316 Widget build (BuildContext context) {
1417 return Scaffold (
@@ -52,7 +55,7 @@ class _LayeredGraphViewPageState extends State<LayeredGraphViewPage> {
5255 ),
5356 ),
5457 Container (
55- width: 100 ,
58+ width: 120 ,
5659 child: Column (
5760 children: [
5861 Text ('Alignment' ),
@@ -82,63 +85,83 @@ class _LayeredGraphViewPageState extends State<LayeredGraphViewPage> {
8285 setState (() {});
8386 },
8487 child: Text ('Add' ),
85- )
88+ ),
89+ ElevatedButton (
90+ onPressed: () => _navigateToRandomNode (),
91+ child: Text ('Go to Node $nextNodeId ' ),
92+ ),
93+ ElevatedButton (
94+ onPressed: () => _controller.resetView (),
95+ child: Text ('Reset View' ),
96+ ),
97+ ElevatedButton (
98+ onPressed: () => _controller.zoomToFit (),
99+ child: Text ("Zoom to fit" ),
100+ ),
86101 ],
87102 ),
88103 Expanded (
89- child: InteractiveViewer (
90- constrained: false ,
91- boundaryMargin: EdgeInsets .all (100 ),
92- minScale: 0.0001 ,
93- maxScale: 10.6 ,
94- child: GraphView (
95- graph: graph,
96- algorithm: SugiyamaAlgorithm (builder),
97- paint: Paint ()
98- ..color = Colors .green
99- ..strokeWidth = 1
100- ..style = PaintingStyle .stroke,
101- builder: (Node node) {
102- // I can decide what widget should be shown here based on the id
103- var a = node.key! .value as int ? ;
104- return rectangleWidget (a);
105- },
106- )),
104+ child: GraphView .builder (
105+ controller: _controller,
106+ graph: graph,
107+ algorithm: SugiyamaAlgorithm (builder),
108+ paint: Paint ()
109+ ..color = Colors .green
110+ ..strokeWidth = 1
111+ ..style = PaintingStyle .stroke,
112+ builder: (Node node) {
113+ var a = node.key! .value as int ? ;
114+ return rectangleWidget (a);
115+ },
116+ ),
107117 ),
108118 ],
109119 ));
110120 }
111121
112- Random r = Random ();
113-
114122 Widget rectangleWidget (int ? a) {
115123 return Container (
116124 padding: EdgeInsets .all (16 ),
117125 decoration: BoxDecoration (
118- borderRadius : BorderRadius . circular ( 4 ) ,
126+ shape : BoxShape .circle ,
119127 boxShadow: [
120128 BoxShadow (color: Colors .blue[100 ]! , spreadRadius: 1 ),
121129 ],
122130 ),
123- child: Text ('Node ${a }' ));
131+ child: Text ('${a }' ));
124132 }
125133
126134 final Graph graph = Graph ();
127-
128135 SugiyamaConfiguration builder = SugiyamaConfiguration ()
129136 ..bendPointShape = CurvedBendPointShape (curveLength: 20 );
130137
138+ void _navigateToRandomNode () {
139+ if (graph.nodes.isEmpty) return ;
140+
141+ final randomNode = graph.nodes.firstWhere (
142+ (node) => node.key != null && node.key! .value == nextNodeId,
143+ orElse: () => graph.nodes.first,
144+ );
145+ final nodeId = randomNode.key! ;
146+ _controller.animateToNode (nodeId);
147+
148+ setState (() {
149+ nextNodeId = r.nextInt (graph.nodes.length) + 1 ;
150+ });
151+ }
152+
131153 @override
132154 void initState () {
133155 super .initState ();
156+ final node0 = Node .Id (0 );
134157 final node1 = Node .Id (1 );
135158 final node2 = Node .Id (2 );
136159 final node3 = Node .Id (3 );
137160 final node4 = Node .Id (4 );
138161 final node5 = Node .Id (5 );
139162 final node6 = Node .Id (6 );
140- final node8 = Node .Id (7 );
141- final node7 = Node .Id (8 );
163+ final node7 = Node .Id (7 );
164+ final node8 = Node .Id (8 );
142165 final node9 = Node .Id (9 );
143166 final node10 = Node .Id (10 );
144167 final node11 = Node .Id (11 );
@@ -152,49 +175,38 @@ class _LayeredGraphViewPageState extends State<LayeredGraphViewPage> {
152175 final node19 = Node .Id (19 );
153176 final node20 = Node .Id (20 );
154177 final node21 = Node .Id (21 );
155- final node22 = Node .Id (22 );
156- final node23 = Node .Id (23 );
157178
158- graph.addEdge (node1, node13, paint: Paint ()..color = Colors .red);
159- graph.addEdge (node1, node21);
160- graph.addEdge (node1, node4);
161- graph.addEdge (node1, node3);
162- graph.addEdge (node2, node3);
163- graph.addEdge (node2, node20);
164- graph.addEdge (node3, node4);
165- graph.addEdge (node3, node5);
166- graph.addEdge (node3, node23);
167- graph.addEdge (node4, node6);
168- graph.addEdge (node5, node7);
169- graph.addEdge (node6, node8);
170- graph.addEdge (node6, node16);
171- graph.addEdge (node6, node23);
172- graph.addEdge (node7, node9);
173- graph.addEdge (node8, node10);
174- graph.addEdge (node8, node11);
175- graph.addEdge (node9, node12);
176- graph.addEdge (node10, node13);
177- graph.addEdge (node10, node14);
178- graph.addEdge (node10, node15);
179- graph.addEdge (node11, node15);
180- graph.addEdge (node11, node16);
181- graph.addEdge (node12, node20);
182- graph.addEdge (node13, node17);
183- graph.addEdge (node14, node17);
184- graph.addEdge (node14, node18);
185- graph.addEdge (node16, node18);
186- graph.addEdge (node16, node19);
187- graph.addEdge (node16, node20);
188- graph.addEdge (node18, node21);
189- graph.addEdge (node19, node22);
190- graph.addEdge (node21, node23);
191- graph.addEdge (node22, node23);
192- graph.addEdge (node1, node22);
193- graph.addEdge (node7, node8);
179+ // Adding edges based on parent-child relationships
180+ graph.addEdge (node8, node0);
181+ graph.addEdge (node2, node11);
182+ graph.addEdge (node11, node3);
183+ graph.addEdge (node12, node4);
184+ graph.addEdge (node4, node9);
185+ graph.addEdge (node18, node5);
186+ graph.addEdge (node9, node6);
187+ graph.addEdge (node15, node6);
188+ graph.addEdge (node17, node6);
189+ graph.addEdge (node3, node7);
190+ graph.addEdge (node17, node7);
191+ graph.addEdge (node20, node7);
192+ graph.addEdge (node21, node7);
193+ graph.addEdge (node0, node16);
194+ graph.addEdge (node21, node10);
195+ graph.addEdge (node16, node10);
196+ graph.addEdge (node21, node12);
197+ graph.addEdge (node4, node13);
198+ graph.addEdge (node12, node13);
199+ graph.addEdge (node1, node14);
200+ graph.addEdge (node8, node14);
201+ graph.addEdge (node9, node18);
202+ graph.addEdge (node19, node17);
194203
195204 builder
196205 ..nodeSeparation = (15 )
197206 ..levelSeparation = (15 )
198207 ..orientation = SugiyamaConfiguration .ORIENTATION_TOP_BOTTOM ;
208+
209+ // Set initial random node for navigation
210+ nextNodeId = r.nextInt (22 ); // 0-21 nodes exist
199211 }
200- }
212+ }
0 commit comments