ui.rs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. use crate::view::View;
  2. use tui::{
  3. backend::Backend,
  4. layout::{Constraint, Direction, Layout, Rect},
  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>, mut view: View) {
  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> = view
  17. .id_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 view.id_list.state);
  29. let index = view.info_list.index;
  30. render_info(view, f, index, slice);
  31. }
  32. fn render_info<B: Backend>(view: View, f: &mut Frame<'_, B>, index: usize, slice: Vec<Rect>) {
  33. let info = &view.info_list.infos;
  34. let id = &info[index].id;
  35. let i0 = info[index].incoming.clone();
  36. let o0 = info[index].outgoing.clone();
  37. let span = vec![
  38. Spans::from(format!("NodeId: {}", id)),
  39. Spans::from(format!("Outgoing connections: {:?}", i0)),
  40. Spans::from(format!("Incoming connections: {:?}", o0)),
  41. ];
  42. let graph =
  43. Paragraph::new(span).block(Block::default().borders(Borders::ALL)).style(Style::default());
  44. f.render_widget(graph, slice[1]);
  45. }