diff --git a/src/frontend/ui.rs b/src/frontend/ui.rs index 309e31a..a573754 100644 --- a/src/frontend/ui.rs +++ b/src/frontend/ui.rs @@ -8,6 +8,70 @@ use ratatui::{ use crate::{App, frontend::Peers}; +impl App { + pub fn draw(&self, frame: &mut Frame) { + let [top, middle, bottom] = Layout::default() + .direction(Direction::Vertical) + .constraints([Constraint::Min(3), Constraint::Min(3), Constraint::Min(3)]) + .split(frame.area()) + .as_array() + .cloned() + .unwrap(); + + let [footer_left, footer_right] = Layout::default() + .direction(Direction::Horizontal) + .constraints([Constraint::Percentage(50), Constraint::Percentage(50)]) + .split(bottom) + .as_array() + .cloned() + .unwrap(); + + frame.render_widget(self, frame.area()); + network_info(frame, footer_left); + peers(&self.peers, frame, footer_right); + } +} + +fn peers(peers: &Peers, frame: &mut Frame, area: Rect) { + let mut items = Vec::with_capacity(peers.len()); + for (k, v) in peers.iter() { + let item = format!("{:?}: {} ({})", k, v.0, v.1); + let s = Line::from(item.yellow()); + + let item = ListItem::new(s); + items.push(item); + } + let title = Line::from(" Peers ".bold()).centered(); + let block = Block::default().title(title).borders(Borders::all()); + let list = List::new(items).block(block); + frame.render_widget(list, area); +} + +fn network_info(frame: &mut Frame, area: Rect) { + let udp: Line = format!(" UDP socket:\t\t{:?}", joecalsend::LISTENING_SOCKET_ADDR) + .yellow() + .into(); + let multicast: Line = format!( + " Multicast address:\t{:?}:{}", + joecalsend::MULTICAST_IP, + joecalsend::DEFAULT_PORT + ) + .yellow() + .into(); + let http: Line = format!(" HTTP address:\t\t{:?}", joecalsend::LISTENING_SOCKET_ADDR) + .yellow() + .into(); + let items = [ + ListItem::new(udp), + ListItem::new(multicast), + ListItem::new(http), + ]; + let title = Line::from(" Listeners ".bold()).centered(); + let block = Block::default().title(title).borders(Borders::all()); + let list = List::new(items).block(block); + frame.render_widget(list, area); +} + // helper function to create a centered rect using up certain percentage of the // available rect `r` fn centered_rect(percent_x: u16, percent_y: u16, r: Rect) -> Rect { @@ -31,71 +95,3 @@ fn centered_rect(percent_x: u16, percent_y: u16, r: Rect) -> Rect { ]) .split(popup_layout[1])[1] // Return the middle chunk } - -impl App { - pub fn draw(&self, frame: &mut Frame) { - let [top, middle, bottom] = Layout::default() - .direction(Direction::Vertical) - .constraints([Constraint::Min(3), Constraint::Min(3), Constraint::Min(3)]) - .split(frame.area()) - .as_array() - .cloned() - .unwrap(); - - let [footer_left, footer_right] = Layout::default() - .direction(Direction::Horizontal) - .constraints([Constraint::Percentage(50), Constraint::Percentage(50)]) - .split(bottom) - .as_array() - .cloned() - .unwrap(); - - frame.render_widget(self, frame.area()); - network_info(frame, footer_left); - peers(&self.peers, frame, footer_right); - - // match self.screen { - // _ => {} - // } - } -} - -fn peers(peers: &Peers, frame: &mut Frame, area: Rect) { - let mut items = Vec::with_capacity(peers.len()); - for (k, v) in peers.iter() { - let item = format!("{:?}: {} ({})", k, v.0, v.1); - let s = Line::from(item.yellow()); - - let item = ListItem::new(s); - items.push(item); - } - let title = Line::from(" Peers ".bold()).centered(); - let block = Block::default().title(title).borders(Borders::all()); - let list = List::new(items).block(block); - frame.render_widget(list, area); -} - -fn network_info(frame: &mut Frame, area: Rect) { - let udp: Line = format!("UDP socket: {:?}", joecalsend::LISTENING_SOCKET_ADDR) - .yellow() - .into(); - let multicast: Line = format!( - "Multicast address: {:?}:{}", - joecalsend::MULTICAST_IP, - joecalsend::DEFAULT_PORT - ) - .yellow() - .into(); - let http: Line = format!("HTTP address: {:?}", joecalsend::LISTENING_SOCKET_ADDR) - .yellow() - .into(); - let items = [ - ListItem::new(udp), - ListItem::new(multicast), - ListItem::new(http), - ]; - let title = Line::from(" Listeners ".bold()).centered(); - let block = Block::default().title(title).borders(Borders::all()); - let list = List::new(items).block(block); - frame.render_widget(list, area); -}