use crate::view::View; use tui::{ backend::Backend, layout::{Constraint, Direction, Layout, Rect}, style::{Color, Modifier, Style}, text::Spans, widgets::{Block, Borders, List, ListItem, Paragraph}, Frame, }; pub fn ui(f: &mut Frame<'_, B>, mut view: View) { let slice = Layout::default() .direction(Direction::Horizontal) .margin(2) .constraints([Constraint::Percentage(50), Constraint::Percentage(50)].as_ref()) .split(f.size()); let nodes: Vec = view .id_list .node_id .iter() .map(|id| { let line1 = Spans::from(id.to_string()); ListItem::new(vec![line1]).style(Style::default()) }) .collect(); let nodes = List::new(nodes) .block(Block::default().borders(Borders::ALL)) .highlight_style(Style::default().fg(Color::LightCyan).add_modifier(Modifier::BOLD)); f.render_stateful_widget(nodes, slice[0], &mut view.id_list.state); let index = view.info_list.index; render_info(view, f, index, slice); } fn render_info(view: View, f: &mut Frame<'_, B>, index: usize, slice: Vec) { let info = &view.info_list.infos; let id = &info[index].id; let i0 = info[index].incoming.clone(); let o0 = info[index].outgoing.clone(); let span = vec![ Spans::from(format!("NodeId: {}", id)), Spans::from(format!("Outgoing connections: {:?}", i0)), Spans::from(format!("Incoming connections: {:?}", o0)), ]; let graph = Paragraph::new(span).block(Block::default().borders(Borders::ALL)).style(Style::default()); f.render_widget(graph, slice[1]); }