ui.rs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. use crate::view::View;
  2. use tui::{
  3. backend::Backend,
  4. layout::{Alignment, Constraint, Direction, Layout, Rect},
  5. style::Style,
  6. text::{Span, 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 mut lines = vec![Spans::from(id.to_string())];
  22. lines.push(Spans::from(""));
  23. lines.push(Spans::from(""));
  24. lines.push(Spans::from(""));
  25. lines.push(Spans::from(""));
  26. lines.push(Spans::from(""));
  27. lines.push(Spans::from(""));
  28. ListItem::new(lines).style(Style::default())
  29. })
  30. .collect();
  31. let nodes =
  32. List::new(nodes).block(Block::default().borders(Borders::ALL)).highlight_symbol(">> ");
  33. f.render_stateful_widget(nodes, slice[0], &mut view.id_list.state);
  34. let index = view.info_list.index;
  35. render_info_left(view.clone(), f, index);
  36. render_info_right(view.clone(), f, index, slice);
  37. }
  38. fn render_info_left<B: Backend>(view: View, f: &mut Frame<'_, B>, _index: usize) {
  39. let slice = Layout::default()
  40. .direction(Direction::Horizontal)
  41. .horizontal_margin(8)
  42. .vertical_margin(4)
  43. .constraints([Constraint::Percentage(100)].as_ref())
  44. .split(f.size());
  45. let info = &view.info_list.infos;
  46. let mut titles = Vec::new();
  47. for id in &view.id_list.node_id {
  48. match info.get(id) {
  49. Some(_) => {
  50. titles.push(Spans::from(Span::styled("Outgoing:", Style::default())));
  51. titles.push(Spans::from(""));
  52. titles.push(Spans::from(""));
  53. titles.push(Spans::from(Span::styled("Incoming:", Style::default())));
  54. titles.push(Spans::from(""));
  55. titles.push(Spans::from(""));
  56. titles.push(Spans::from(""));
  57. }
  58. None => {
  59. // TODO
  60. }
  61. }
  62. }
  63. let title_graph = Paragraph::new(titles).style(Style::default()).alignment(Alignment::Left);
  64. f.render_widget(title_graph, slice[0]);
  65. let slice = Layout::default()
  66. .direction(Direction::Horizontal)
  67. .horizontal_margin(6)
  68. .vertical_margin(4)
  69. .constraints([Constraint::Percentage(47), Constraint::Percentage(53)].as_ref())
  70. .split(f.size());
  71. let mut msgs = Vec::new();
  72. for id in &view.id_list.node_id {
  73. match info.get(id) {
  74. Some(connects) => {
  75. msgs.push(Spans::from(""));
  76. msgs.push(Spans::from(format!("[R: {}]", connects.outgoing[0].message)));
  77. msgs.push(Spans::from(format!("[S: {}]", connects.outgoing[1].message)));
  78. msgs.push(Spans::from(""));
  79. msgs.push(Spans::from(format!("[R: {}]", connects.incoming[0].message)));
  80. msgs.push(Spans::from(format!("[S: {}]", connects.incoming[1].message)));
  81. msgs.push(Spans::from(""));
  82. }
  83. None => {
  84. // TODO
  85. }
  86. }
  87. }
  88. let msg_graph = Paragraph::new(msgs).style(Style::default()).alignment(Alignment::Right);
  89. f.render_widget(msg_graph, slice[0]);
  90. let slice = Layout::default()
  91. .direction(Direction::Horizontal)
  92. .horizontal_margin(10)
  93. .vertical_margin(4)
  94. .constraints([Constraint::Percentage(45), Constraint::Percentage(55)].as_ref())
  95. .split(f.size());
  96. let mut ids = Vec::new();
  97. for id in &view.id_list.node_id {
  98. match info.get(id) {
  99. Some(connects) => {
  100. ids.push(Spans::from(""));
  101. ids.push(Spans::from(format!("{}", connects.outgoing[0].id)));
  102. ids.push(Spans::from(format!("{}", connects.outgoing[1].id)));
  103. ids.push(Spans::from(""));
  104. ids.push(Spans::from(format!("{}", connects.incoming[0].id)));
  105. ids.push(Spans::from(format!("{}", connects.incoming[1].id)));
  106. ids.push(Spans::from(""));
  107. }
  108. None => {
  109. // TODO
  110. }
  111. }
  112. }
  113. let id_graph = Paragraph::new(ids).style(Style::default()).alignment(Alignment::Left);
  114. f.render_widget(id_graph, slice[0]);
  115. }
  116. fn render_info_right<B: Backend>(
  117. _view: View,
  118. f: &mut Frame<'_, B>,
  119. _index: usize,
  120. slice: Vec<Rect>,
  121. ) {
  122. let span = vec![];
  123. let graph =
  124. Paragraph::new(span).block(Block::default().borders(Borders::ALL)).style(Style::default());
  125. f.render_widget(graph, slice[1]);
  126. }