Skip to main content

RenderedGraph

Struct RenderedGraph 

Source
pub struct RenderedGraph<N, E> { /* private fields */ }
Expand description

A rendered graph ready for display in a TUI.

The graph structure is immutable after creation, but colors and styles can be modified at any time.

Implementations§

Source§

impl<N: Display + Clone, E: Display + Clone> RenderedGraph<N, E>

Source

pub fn from_graph(graph: DiGraph<N, E>) -> Self

Create a new rendered graph from a petgraph DiGraph.

Source

pub fn builder() -> RenderedGraphBuilder<N, E>

Create a builder for more configuration options.

Examples found in repository?
examples/circular.rs (line 20)
9fn main() {
10    // Create a graph with circular edges (T <-> U)
11    let mut graph: DiGraph<&str, &str> = DiGraph::new();
12
13    let t = graph.add_node("T: Task");
14    let u = graph.add_node("U: User");
15
16    // Bidirectional edges - these would overlap without parallel edge handling
17    graph.add_edge(t, u, "question");
18    graph.add_edge(u, t, "answer");
19
20    let mut rendered = RenderedGraph::builder()
21        .graph(graph)
22        .border_style(BoxBorder::Single)
23        .gravity(1.0)
24        .repulsion_constant(15000.0) // Increased to separate nodes horizontally
25        .build();
26
27    println!("Running physics simulation...");
28    rendered.run_simulation();
29    println!("Converged after {} iterations\n", rendered.iterations());
30
31    let grid = rendered.render_to_grid();
32    let (width, height) = grid.size();
33
34    println!("Grid size: {}x{}\n", width, height);
35
36    grid.print();
37}
More examples
Hide additional examples
examples/basic.rs (line 25)
7fn main() {
8    // Create a simple state machine graph
9    let mut graph: DiGraph<&str, &str> = DiGraph::new();
10
11    let start = graph.add_node("Start");
12    let loading = graph.add_node("Loading");
13    let ready = graph.add_node("Ready");
14    let error = graph.add_node("Error");
15    let done = graph.add_node("Done");
16
17    graph.add_edge(start, loading, "init");
18    graph.add_edge(loading, ready, "success");
19    graph.add_edge(loading, error, "fail");
20    graph.add_edge(ready, done, "complete");
21    graph.add_edge(error, loading, "retry");
22    graph.add_edge(error, done, "abort");
23
24    // Create rendered graph with custom settings
25    let mut rendered = RenderedGraph::builder()
26        .graph(graph)
27        .border_style(BoxBorder::Rounded)
28        .gravity(1.0)
29        .build();
30
31    // Run physics simulation
32    println!("Running physics simulation...");
33    rendered.run_simulation();
34    println!("Converged after {} iterations", rendered.iterations());
35
36    // Customize colors
37    rendered.set_node_border_color(start, Color::Green);
38    rendered.set_node_border_color(error, Color::Red);
39    rendered.set_node_text_color(error, Color::Red);
40    rendered.set_node_border_color(done, Color::Blue);
41
42    // Render to grid and print
43    let grid = rendered.render_to_grid();
44    let (width, height) = grid.size();
45
46    println!("\nRendered graph ({}x{}):\n", width, height);
47
48    // Print grid using the built-in print method
49    grid.print();
50}
examples/tui.rs (line 31)
12fn main() -> io::Result<()> {
13    // Create a state machine graph
14    let mut graph: DiGraph<&str, &str> = DiGraph::new();
15
16    let idle = graph.add_node("Idle");
17    let running = graph.add_node("Running");
18    let paused = graph.add_node("Paused");
19    let complete = graph.add_node("Complete");
20    let failed = graph.add_node("Failed");
21
22    let e_start = graph.add_edge(idle, running, "start");
23    let e_pause = graph.add_edge(running, paused, "pause");
24    let e_resume = graph.add_edge(paused, running, "resume");
25    let e_finish = graph.add_edge(running, complete, "finish");
26    let e_fail = graph.add_edge(running, failed, "error");
27    let e_reset = graph.add_edge(complete, idle, "reset");
28    let e_retry = graph.add_edge(failed, idle, "retry");
29
30    // Create rendered graph
31    let mut rendered = RenderedGraph::builder()
32        .graph(graph)
33        .border_style(BoxBorder::Rounded)
34        .gravity(0.8)
35        .spring_constant(0.05)
36        .repulsion_constant(8000.0)
37        .build();
38
39    // Run physics simulation
40    rendered.run_simulation();
41
42    // Apply colors based on state meaning
43    rendered.set_node_border_color(idle, Color::Gray);
44    rendered.set_node_border_color(running, Color::Green);
45    rendered.set_node_text_color(running, Color::Green);
46    rendered.set_node_border_color(paused, Color::Yellow);
47    rendered.set_node_text_color(paused, Color::Yellow);
48    rendered.set_node_border_color(complete, Color::Blue);
49    rendered.set_node_text_color(complete, Color::Blue);
50    rendered.set_node_border_color(failed, Color::Red);
51    rendered.set_node_text_color(failed, Color::Red);
52
53    // Color edges
54    rendered.set_edge_color(e_start, Color::Green);
55    rendered.set_edge_color(e_pause, Color::Yellow);
56    rendered.set_edge_color(e_resume, Color::Green);
57    rendered.set_edge_color(e_finish, Color::Blue);
58    rendered.set_edge_color(e_fail, Color::Red);
59    rendered.set_edge_color(e_reset, Color::Gray);
60    rendered.set_edge_color(e_retry, Color::Yellow);
61
62    // Run TUI
63    let mut terminal = ratatui::init();
64    let result = run_app(&mut terminal, &mut rendered);
65    ratatui::restore();
66    result
67}
Source

pub fn graph(&self) -> &DiGraph<N, E>

Get a reference to the underlying graph.

Source

pub fn physics_config(&self) -> &PhysicsConfig

Get the physics configuration.

Source

pub fn set_physics_config(&mut self, config: PhysicsConfig)

Set the physics configuration.

Source

pub fn tick(&mut self)

Advance the physics simulation by one step.

Source

pub fn is_stable(&self) -> bool

Check if the simulation has converged.

Source

pub fn run_simulation(&mut self)

Run the physics simulation until stable.

Examples found in repository?
examples/circular.rs (line 28)
9fn main() {
10    // Create a graph with circular edges (T <-> U)
11    let mut graph: DiGraph<&str, &str> = DiGraph::new();
12
13    let t = graph.add_node("T: Task");
14    let u = graph.add_node("U: User");
15
16    // Bidirectional edges - these would overlap without parallel edge handling
17    graph.add_edge(t, u, "question");
18    graph.add_edge(u, t, "answer");
19
20    let mut rendered = RenderedGraph::builder()
21        .graph(graph)
22        .border_style(BoxBorder::Single)
23        .gravity(1.0)
24        .repulsion_constant(15000.0) // Increased to separate nodes horizontally
25        .build();
26
27    println!("Running physics simulation...");
28    rendered.run_simulation();
29    println!("Converged after {} iterations\n", rendered.iterations());
30
31    let grid = rendered.render_to_grid();
32    let (width, height) = grid.size();
33
34    println!("Grid size: {}x{}\n", width, height);
35
36    grid.print();
37}
More examples
Hide additional examples
examples/basic.rs (line 33)
7fn main() {
8    // Create a simple state machine graph
9    let mut graph: DiGraph<&str, &str> = DiGraph::new();
10
11    let start = graph.add_node("Start");
12    let loading = graph.add_node("Loading");
13    let ready = graph.add_node("Ready");
14    let error = graph.add_node("Error");
15    let done = graph.add_node("Done");
16
17    graph.add_edge(start, loading, "init");
18    graph.add_edge(loading, ready, "success");
19    graph.add_edge(loading, error, "fail");
20    graph.add_edge(ready, done, "complete");
21    graph.add_edge(error, loading, "retry");
22    graph.add_edge(error, done, "abort");
23
24    // Create rendered graph with custom settings
25    let mut rendered = RenderedGraph::builder()
26        .graph(graph)
27        .border_style(BoxBorder::Rounded)
28        .gravity(1.0)
29        .build();
30
31    // Run physics simulation
32    println!("Running physics simulation...");
33    rendered.run_simulation();
34    println!("Converged after {} iterations", rendered.iterations());
35
36    // Customize colors
37    rendered.set_node_border_color(start, Color::Green);
38    rendered.set_node_border_color(error, Color::Red);
39    rendered.set_node_text_color(error, Color::Red);
40    rendered.set_node_border_color(done, Color::Blue);
41
42    // Render to grid and print
43    let grid = rendered.render_to_grid();
44    let (width, height) = grid.size();
45
46    println!("\nRendered graph ({}x{}):\n", width, height);
47
48    // Print grid using the built-in print method
49    grid.print();
50}
examples/tui.rs (line 40)
12fn main() -> io::Result<()> {
13    // Create a state machine graph
14    let mut graph: DiGraph<&str, &str> = DiGraph::new();
15
16    let idle = graph.add_node("Idle");
17    let running = graph.add_node("Running");
18    let paused = graph.add_node("Paused");
19    let complete = graph.add_node("Complete");
20    let failed = graph.add_node("Failed");
21
22    let e_start = graph.add_edge(idle, running, "start");
23    let e_pause = graph.add_edge(running, paused, "pause");
24    let e_resume = graph.add_edge(paused, running, "resume");
25    let e_finish = graph.add_edge(running, complete, "finish");
26    let e_fail = graph.add_edge(running, failed, "error");
27    let e_reset = graph.add_edge(complete, idle, "reset");
28    let e_retry = graph.add_edge(failed, idle, "retry");
29
30    // Create rendered graph
31    let mut rendered = RenderedGraph::builder()
32        .graph(graph)
33        .border_style(BoxBorder::Rounded)
34        .gravity(0.8)
35        .spring_constant(0.05)
36        .repulsion_constant(8000.0)
37        .build();
38
39    // Run physics simulation
40    rendered.run_simulation();
41
42    // Apply colors based on state meaning
43    rendered.set_node_border_color(idle, Color::Gray);
44    rendered.set_node_border_color(running, Color::Green);
45    rendered.set_node_text_color(running, Color::Green);
46    rendered.set_node_border_color(paused, Color::Yellow);
47    rendered.set_node_text_color(paused, Color::Yellow);
48    rendered.set_node_border_color(complete, Color::Blue);
49    rendered.set_node_text_color(complete, Color::Blue);
50    rendered.set_node_border_color(failed, Color::Red);
51    rendered.set_node_text_color(failed, Color::Red);
52
53    // Color edges
54    rendered.set_edge_color(e_start, Color::Green);
55    rendered.set_edge_color(e_pause, Color::Yellow);
56    rendered.set_edge_color(e_resume, Color::Green);
57    rendered.set_edge_color(e_finish, Color::Blue);
58    rendered.set_edge_color(e_fail, Color::Red);
59    rendered.set_edge_color(e_reset, Color::Gray);
60    rendered.set_edge_color(e_retry, Color::Yellow);
61
62    // Run TUI
63    let mut terminal = ratatui::init();
64    let result = run_app(&mut terminal, &mut rendered);
65    ratatui::restore();
66    result
67}
Source

pub fn iterations(&self) -> usize

Get the number of iterations run so far.

Examples found in repository?
examples/circular.rs (line 29)
9fn main() {
10    // Create a graph with circular edges (T <-> U)
11    let mut graph: DiGraph<&str, &str> = DiGraph::new();
12
13    let t = graph.add_node("T: Task");
14    let u = graph.add_node("U: User");
15
16    // Bidirectional edges - these would overlap without parallel edge handling
17    graph.add_edge(t, u, "question");
18    graph.add_edge(u, t, "answer");
19
20    let mut rendered = RenderedGraph::builder()
21        .graph(graph)
22        .border_style(BoxBorder::Single)
23        .gravity(1.0)
24        .repulsion_constant(15000.0) // Increased to separate nodes horizontally
25        .build();
26
27    println!("Running physics simulation...");
28    rendered.run_simulation();
29    println!("Converged after {} iterations\n", rendered.iterations());
30
31    let grid = rendered.render_to_grid();
32    let (width, height) = grid.size();
33
34    println!("Grid size: {}x{}\n", width, height);
35
36    grid.print();
37}
More examples
Hide additional examples
examples/basic.rs (line 34)
7fn main() {
8    // Create a simple state machine graph
9    let mut graph: DiGraph<&str, &str> = DiGraph::new();
10
11    let start = graph.add_node("Start");
12    let loading = graph.add_node("Loading");
13    let ready = graph.add_node("Ready");
14    let error = graph.add_node("Error");
15    let done = graph.add_node("Done");
16
17    graph.add_edge(start, loading, "init");
18    graph.add_edge(loading, ready, "success");
19    graph.add_edge(loading, error, "fail");
20    graph.add_edge(ready, done, "complete");
21    graph.add_edge(error, loading, "retry");
22    graph.add_edge(error, done, "abort");
23
24    // Create rendered graph with custom settings
25    let mut rendered = RenderedGraph::builder()
26        .graph(graph)
27        .border_style(BoxBorder::Rounded)
28        .gravity(1.0)
29        .build();
30
31    // Run physics simulation
32    println!("Running physics simulation...");
33    rendered.run_simulation();
34    println!("Converged after {} iterations", rendered.iterations());
35
36    // Customize colors
37    rendered.set_node_border_color(start, Color::Green);
38    rendered.set_node_border_color(error, Color::Red);
39    rendered.set_node_text_color(error, Color::Red);
40    rendered.set_node_border_color(done, Color::Blue);
41
42    // Render to grid and print
43    let grid = rendered.render_to_grid();
44    let (width, height) = grid.size();
45
46    println!("\nRendered graph ({}x{}):\n", width, height);
47
48    // Print grid using the built-in print method
49    grid.print();
50}
Source

pub fn set_node_border_color(&mut self, node: NodeIndex, color: Color)

Set the border color of a node.

Examples found in repository?
examples/basic.rs (line 37)
7fn main() {
8    // Create a simple state machine graph
9    let mut graph: DiGraph<&str, &str> = DiGraph::new();
10
11    let start = graph.add_node("Start");
12    let loading = graph.add_node("Loading");
13    let ready = graph.add_node("Ready");
14    let error = graph.add_node("Error");
15    let done = graph.add_node("Done");
16
17    graph.add_edge(start, loading, "init");
18    graph.add_edge(loading, ready, "success");
19    graph.add_edge(loading, error, "fail");
20    graph.add_edge(ready, done, "complete");
21    graph.add_edge(error, loading, "retry");
22    graph.add_edge(error, done, "abort");
23
24    // Create rendered graph with custom settings
25    let mut rendered = RenderedGraph::builder()
26        .graph(graph)
27        .border_style(BoxBorder::Rounded)
28        .gravity(1.0)
29        .build();
30
31    // Run physics simulation
32    println!("Running physics simulation...");
33    rendered.run_simulation();
34    println!("Converged after {} iterations", rendered.iterations());
35
36    // Customize colors
37    rendered.set_node_border_color(start, Color::Green);
38    rendered.set_node_border_color(error, Color::Red);
39    rendered.set_node_text_color(error, Color::Red);
40    rendered.set_node_border_color(done, Color::Blue);
41
42    // Render to grid and print
43    let grid = rendered.render_to_grid();
44    let (width, height) = grid.size();
45
46    println!("\nRendered graph ({}x{}):\n", width, height);
47
48    // Print grid using the built-in print method
49    grid.print();
50}
More examples
Hide additional examples
examples/tui.rs (line 43)
12fn main() -> io::Result<()> {
13    // Create a state machine graph
14    let mut graph: DiGraph<&str, &str> = DiGraph::new();
15
16    let idle = graph.add_node("Idle");
17    let running = graph.add_node("Running");
18    let paused = graph.add_node("Paused");
19    let complete = graph.add_node("Complete");
20    let failed = graph.add_node("Failed");
21
22    let e_start = graph.add_edge(idle, running, "start");
23    let e_pause = graph.add_edge(running, paused, "pause");
24    let e_resume = graph.add_edge(paused, running, "resume");
25    let e_finish = graph.add_edge(running, complete, "finish");
26    let e_fail = graph.add_edge(running, failed, "error");
27    let e_reset = graph.add_edge(complete, idle, "reset");
28    let e_retry = graph.add_edge(failed, idle, "retry");
29
30    // Create rendered graph
31    let mut rendered = RenderedGraph::builder()
32        .graph(graph)
33        .border_style(BoxBorder::Rounded)
34        .gravity(0.8)
35        .spring_constant(0.05)
36        .repulsion_constant(8000.0)
37        .build();
38
39    // Run physics simulation
40    rendered.run_simulation();
41
42    // Apply colors based on state meaning
43    rendered.set_node_border_color(idle, Color::Gray);
44    rendered.set_node_border_color(running, Color::Green);
45    rendered.set_node_text_color(running, Color::Green);
46    rendered.set_node_border_color(paused, Color::Yellow);
47    rendered.set_node_text_color(paused, Color::Yellow);
48    rendered.set_node_border_color(complete, Color::Blue);
49    rendered.set_node_text_color(complete, Color::Blue);
50    rendered.set_node_border_color(failed, Color::Red);
51    rendered.set_node_text_color(failed, Color::Red);
52
53    // Color edges
54    rendered.set_edge_color(e_start, Color::Green);
55    rendered.set_edge_color(e_pause, Color::Yellow);
56    rendered.set_edge_color(e_resume, Color::Green);
57    rendered.set_edge_color(e_finish, Color::Blue);
58    rendered.set_edge_color(e_fail, Color::Red);
59    rendered.set_edge_color(e_reset, Color::Gray);
60    rendered.set_edge_color(e_retry, Color::Yellow);
61
62    // Run TUI
63    let mut terminal = ratatui::init();
64    let result = run_app(&mut terminal, &mut rendered);
65    ratatui::restore();
66    result
67}
Source

pub fn set_node_text_color(&mut self, node: NodeIndex, color: Color)

Set the text color of a node.

Examples found in repository?
examples/basic.rs (line 39)
7fn main() {
8    // Create a simple state machine graph
9    let mut graph: DiGraph<&str, &str> = DiGraph::new();
10
11    let start = graph.add_node("Start");
12    let loading = graph.add_node("Loading");
13    let ready = graph.add_node("Ready");
14    let error = graph.add_node("Error");
15    let done = graph.add_node("Done");
16
17    graph.add_edge(start, loading, "init");
18    graph.add_edge(loading, ready, "success");
19    graph.add_edge(loading, error, "fail");
20    graph.add_edge(ready, done, "complete");
21    graph.add_edge(error, loading, "retry");
22    graph.add_edge(error, done, "abort");
23
24    // Create rendered graph with custom settings
25    let mut rendered = RenderedGraph::builder()
26        .graph(graph)
27        .border_style(BoxBorder::Rounded)
28        .gravity(1.0)
29        .build();
30
31    // Run physics simulation
32    println!("Running physics simulation...");
33    rendered.run_simulation();
34    println!("Converged after {} iterations", rendered.iterations());
35
36    // Customize colors
37    rendered.set_node_border_color(start, Color::Green);
38    rendered.set_node_border_color(error, Color::Red);
39    rendered.set_node_text_color(error, Color::Red);
40    rendered.set_node_border_color(done, Color::Blue);
41
42    // Render to grid and print
43    let grid = rendered.render_to_grid();
44    let (width, height) = grid.size();
45
46    println!("\nRendered graph ({}x{}):\n", width, height);
47
48    // Print grid using the built-in print method
49    grid.print();
50}
More examples
Hide additional examples
examples/tui.rs (line 45)
12fn main() -> io::Result<()> {
13    // Create a state machine graph
14    let mut graph: DiGraph<&str, &str> = DiGraph::new();
15
16    let idle = graph.add_node("Idle");
17    let running = graph.add_node("Running");
18    let paused = graph.add_node("Paused");
19    let complete = graph.add_node("Complete");
20    let failed = graph.add_node("Failed");
21
22    let e_start = graph.add_edge(idle, running, "start");
23    let e_pause = graph.add_edge(running, paused, "pause");
24    let e_resume = graph.add_edge(paused, running, "resume");
25    let e_finish = graph.add_edge(running, complete, "finish");
26    let e_fail = graph.add_edge(running, failed, "error");
27    let e_reset = graph.add_edge(complete, idle, "reset");
28    let e_retry = graph.add_edge(failed, idle, "retry");
29
30    // Create rendered graph
31    let mut rendered = RenderedGraph::builder()
32        .graph(graph)
33        .border_style(BoxBorder::Rounded)
34        .gravity(0.8)
35        .spring_constant(0.05)
36        .repulsion_constant(8000.0)
37        .build();
38
39    // Run physics simulation
40    rendered.run_simulation();
41
42    // Apply colors based on state meaning
43    rendered.set_node_border_color(idle, Color::Gray);
44    rendered.set_node_border_color(running, Color::Green);
45    rendered.set_node_text_color(running, Color::Green);
46    rendered.set_node_border_color(paused, Color::Yellow);
47    rendered.set_node_text_color(paused, Color::Yellow);
48    rendered.set_node_border_color(complete, Color::Blue);
49    rendered.set_node_text_color(complete, Color::Blue);
50    rendered.set_node_border_color(failed, Color::Red);
51    rendered.set_node_text_color(failed, Color::Red);
52
53    // Color edges
54    rendered.set_edge_color(e_start, Color::Green);
55    rendered.set_edge_color(e_pause, Color::Yellow);
56    rendered.set_edge_color(e_resume, Color::Green);
57    rendered.set_edge_color(e_finish, Color::Blue);
58    rendered.set_edge_color(e_fail, Color::Red);
59    rendered.set_edge_color(e_reset, Color::Gray);
60    rendered.set_edge_color(e_retry, Color::Yellow);
61
62    // Run TUI
63    let mut terminal = ratatui::init();
64    let result = run_app(&mut terminal, &mut rendered);
65    ratatui::restore();
66    result
67}
Source

pub fn set_node_colors(&mut self, node: NodeIndex, border: Color, text: Color)

Set both border and text color of a node.

Source

pub fn set_edge_color(&mut self, edge: EdgeIndex, color: Color)

Set the line color of an edge.

Examples found in repository?
examples/tui.rs (line 54)
12fn main() -> io::Result<()> {
13    // Create a state machine graph
14    let mut graph: DiGraph<&str, &str> = DiGraph::new();
15
16    let idle = graph.add_node("Idle");
17    let running = graph.add_node("Running");
18    let paused = graph.add_node("Paused");
19    let complete = graph.add_node("Complete");
20    let failed = graph.add_node("Failed");
21
22    let e_start = graph.add_edge(idle, running, "start");
23    let e_pause = graph.add_edge(running, paused, "pause");
24    let e_resume = graph.add_edge(paused, running, "resume");
25    let e_finish = graph.add_edge(running, complete, "finish");
26    let e_fail = graph.add_edge(running, failed, "error");
27    let e_reset = graph.add_edge(complete, idle, "reset");
28    let e_retry = graph.add_edge(failed, idle, "retry");
29
30    // Create rendered graph
31    let mut rendered = RenderedGraph::builder()
32        .graph(graph)
33        .border_style(BoxBorder::Rounded)
34        .gravity(0.8)
35        .spring_constant(0.05)
36        .repulsion_constant(8000.0)
37        .build();
38
39    // Run physics simulation
40    rendered.run_simulation();
41
42    // Apply colors based on state meaning
43    rendered.set_node_border_color(idle, Color::Gray);
44    rendered.set_node_border_color(running, Color::Green);
45    rendered.set_node_text_color(running, Color::Green);
46    rendered.set_node_border_color(paused, Color::Yellow);
47    rendered.set_node_text_color(paused, Color::Yellow);
48    rendered.set_node_border_color(complete, Color::Blue);
49    rendered.set_node_text_color(complete, Color::Blue);
50    rendered.set_node_border_color(failed, Color::Red);
51    rendered.set_node_text_color(failed, Color::Red);
52
53    // Color edges
54    rendered.set_edge_color(e_start, Color::Green);
55    rendered.set_edge_color(e_pause, Color::Yellow);
56    rendered.set_edge_color(e_resume, Color::Green);
57    rendered.set_edge_color(e_finish, Color::Blue);
58    rendered.set_edge_color(e_fail, Color::Red);
59    rendered.set_edge_color(e_reset, Color::Gray);
60    rendered.set_edge_color(e_retry, Color::Yellow);
61
62    // Run TUI
63    let mut terminal = ratatui::init();
64    let result = run_app(&mut terminal, &mut rendered);
65    ratatui::restore();
66    result
67}
Source

pub fn set_edge_text_color(&mut self, edge: EdgeIndex, color: Color)

Set the text color of an edge label.

Source

pub fn set_edge_colors(&mut self, edge: EdgeIndex, line: Color, text: Color)

Set both line and text color of an edge.

Source

pub fn set_all_node_border_colors(&mut self, color: Color)

Set border color for all nodes.

Source

pub fn set_all_node_text_colors(&mut self, color: Color)

Set text color for all nodes.

Source

pub fn set_all_edge_colors(&mut self, color: Color)

Set line color for all edges.

Source

pub fn reset_node_styles(&mut self)

Reset all node styles to default.

Source

pub fn reset_edge_styles(&mut self)

Reset all edge styles to default.

Source

pub fn set_default_node_style(&mut self, style: NodeStyle)

Set the default node style (used for new nodes and reset).

Source

pub fn set_default_edge_style(&mut self, style: EdgeStyle)

Set the default edge style.

Source

pub fn set_border_style(&mut self, border: BoxBorder)

Set the box border style for all nodes.

Source

pub fn set_scaling_mode(&mut self, mode: ScalingMode)

Set the scaling mode for handling large graphs.

Source

pub fn auto_scale(&mut self, max_width: usize)

Auto-detect and apply appropriate scaling mode based on terminal width.

Source

pub fn render_to_grid(&mut self) -> CharGrid

Render the graph to a character grid.

Examples found in repository?
examples/circular.rs (line 31)
9fn main() {
10    // Create a graph with circular edges (T <-> U)
11    let mut graph: DiGraph<&str, &str> = DiGraph::new();
12
13    let t = graph.add_node("T: Task");
14    let u = graph.add_node("U: User");
15
16    // Bidirectional edges - these would overlap without parallel edge handling
17    graph.add_edge(t, u, "question");
18    graph.add_edge(u, t, "answer");
19
20    let mut rendered = RenderedGraph::builder()
21        .graph(graph)
22        .border_style(BoxBorder::Single)
23        .gravity(1.0)
24        .repulsion_constant(15000.0) // Increased to separate nodes horizontally
25        .build();
26
27    println!("Running physics simulation...");
28    rendered.run_simulation();
29    println!("Converged after {} iterations\n", rendered.iterations());
30
31    let grid = rendered.render_to_grid();
32    let (width, height) = grid.size();
33
34    println!("Grid size: {}x{}\n", width, height);
35
36    grid.print();
37}
More examples
Hide additional examples
examples/basic.rs (line 43)
7fn main() {
8    // Create a simple state machine graph
9    let mut graph: DiGraph<&str, &str> = DiGraph::new();
10
11    let start = graph.add_node("Start");
12    let loading = graph.add_node("Loading");
13    let ready = graph.add_node("Ready");
14    let error = graph.add_node("Error");
15    let done = graph.add_node("Done");
16
17    graph.add_edge(start, loading, "init");
18    graph.add_edge(loading, ready, "success");
19    graph.add_edge(loading, error, "fail");
20    graph.add_edge(ready, done, "complete");
21    graph.add_edge(error, loading, "retry");
22    graph.add_edge(error, done, "abort");
23
24    // Create rendered graph with custom settings
25    let mut rendered = RenderedGraph::builder()
26        .graph(graph)
27        .border_style(BoxBorder::Rounded)
28        .gravity(1.0)
29        .build();
30
31    // Run physics simulation
32    println!("Running physics simulation...");
33    rendered.run_simulation();
34    println!("Converged after {} iterations", rendered.iterations());
35
36    // Customize colors
37    rendered.set_node_border_color(start, Color::Green);
38    rendered.set_node_border_color(error, Color::Red);
39    rendered.set_node_text_color(error, Color::Red);
40    rendered.set_node_border_color(done, Color::Blue);
41
42    // Render to grid and print
43    let grid = rendered.render_to_grid();
44    let (width, height) = grid.size();
45
46    println!("\nRendered graph ({}x{}):\n", width, height);
47
48    // Print grid using the built-in print method
49    grid.print();
50}
Source

pub fn widget(&mut self) -> GraphWidget<'_, N, E>

Create a widget for rendering with ratatui.

Examples found in repository?
examples/tui.rs (line 80)
69fn run_app<N, E>(
70    terminal: &mut DefaultTerminal,
71    rendered: &mut RenderedGraph<N, E>,
72) -> io::Result<()>
73where
74    N: std::fmt::Display + Clone,
75    E: std::fmt::Display + Clone,
76{
77    loop {
78        terminal.draw(|frame| {
79            let area = frame.area();
80            frame.render_widget(rendered.widget(), area);
81        })?;
82
83        if let Event::Key(key) = event::read()? {
84            if key.code == KeyCode::Char('q') || key.code == KeyCode::Esc {
85                break;
86            }
87        }
88    }
89    Ok(())
90}

Auto Trait Implementations§

§

impl<N, E> Freeze for RenderedGraph<N, E>

§

impl<N, E> RefUnwindSafe for RenderedGraph<N, E>

§

impl<N, E> Send for RenderedGraph<N, E>
where N: Send, E: Send,

§

impl<N, E> Sync for RenderedGraph<N, E>
where N: Sync, E: Sync,

§

impl<N, E> Unpin for RenderedGraph<N, E>
where N: Unpin, E: Unpin,

§

impl<N, E> UnwindSafe for RenderedGraph<N, E>
where N: UnwindSafe, E: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.