ui.rs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. use crate::app::App;
  2. use tui::{
  3. backend::Backend,
  4. layout::{Constraint, Direction, Layout},
  5. style::{Color, Modifier, Style},
  6. text::Spans,
  7. widgets::{Block, Borders, List, ListItem, Paragraph},
  8. Frame,
  9. };
  10. pub fn ui<B: Backend>(f: &mut Frame<B>, app: &mut App) {
  11. let slice = Layout::default()
  12. .direction(Direction::Horizontal)
  13. .margin(2)
  14. .constraints([Constraint::Percentage(50), Constraint::Percentage(50)].as_ref())
  15. .split(f.size());
  16. let nodes: Vec<ListItem> = app
  17. .node_list
  18. .node_id
  19. .iter()
  20. .map(|id| {
  21. let line1 = Spans::from(id.to_string());
  22. ListItem::new(vec![line1]).style(Style::default())
  23. })
  24. .collect();
  25. let nodes = List::new(nodes)
  26. .block(Block::default().borders(Borders::ALL))
  27. .highlight_style(Style::default().fg(Color::LightCyan).add_modifier(Modifier::BOLD));
  28. f.render_stateful_widget(nodes, slice[0], &mut app.node_list.state);
  29. let info: Vec<Spans> =
  30. app.node_info.infos.iter().map(|info| Spans::from(info.connections.to_string())).collect();
  31. let graph =
  32. Paragraph::new(info).block(Block::default().borders(Borders::ALL)).style(Style::default());
  33. f.render_widget(graph, slice[1]);
  34. }