joecalsend/src/frontend/widgets.rs
2025-07-28 15:51:00 -07:00

76 lines
2 KiB
Rust

use ratatui::{
buffer::Buffer,
layout::Rect,
style::Stylize,
text::Line,
widgets::{Block, Borders, List, ListItem, Padding, Widget},
};
use super::Peers;
#[derive(Debug, Clone)]
pub struct PeersWidget<'p> {
pub peers: &'p Peers,
}
impl<'p> Widget for PeersWidget<'p> {
fn render(self, area: Rect, buf: &mut Buffer)
where
Self: Sized,
{
let mut items = Vec::with_capacity(self.peers.len());
for (k, v) in self.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())
.padding(Padding::uniform(1));
let list = List::new(items).block(block);
list.render(area, buf);
}
}
#[derive(Debug, Clone)]
pub struct NetworkInfoWidget;
impl Widget for NetworkInfoWidget {
fn render(self, area: Rect, buf: &mut Buffer)
where
Self: Sized,
{
let udp: Line = format!("UDP socket:\t\t\t {:?}", joecalsend::LISTENING_SOCKET_ADDR)
.yellow()
.into();
let multicast: Line = format!(
"Multicast address:\t\t {:?}:{}",
joecalsend::MULTICAST_IP,
joecalsend::DEFAULT_PORT
)
.yellow()
.into();
let http: Line = format!(
"HTTP address:\t\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())
.padding(Padding::uniform(1));
let list = List::new(items).block(block);
list.render(area, buf);
}
}