spiff the uploads widget

This commit is contained in:
Joe Ardent 2025-08-01 13:52:13 -07:00
parent b0ffa297f3
commit f9efd37d00
2 changed files with 40 additions and 17 deletions

View file

@ -9,7 +9,7 @@ use joecalsend::{
}; };
use julid::Julid; use julid::Julid;
use log::{LevelFilter, debug, error, info}; use log::{LevelFilter, debug, error, info};
use ratatui::{DefaultTerminal, Frame}; use ratatui::{DefaultTerminal, Frame, widgets::TableState};
use tokio::{ use tokio::{
sync::mpsc::{UnboundedReceiver, unbounded_channel}, sync::mpsc::{UnboundedReceiver, unbounded_channel},
task::JoinSet, task::JoinSet,
@ -26,6 +26,7 @@ pub struct App {
// addr -> (alias, fingerprint) // addr -> (alias, fingerprint)
pub peers: Peers, pub peers: Peers,
pub uploads: BTreeMap<Julid, JoecalUploadRequest>, pub uploads: BTreeMap<Julid, JoecalUploadRequest>,
upload_state: TableState,
// for getting messages back from the web server or web client about things we've done; the // for getting messages back from the web server or web client about things we've done; the
// other end is held by the state // other end is held by the state
transfer_event_rx: OnceLock<UnboundedReceiver<TransferEvent>>, transfer_event_rx: OnceLock<UnboundedReceiver<TransferEvent>>,
@ -49,11 +50,12 @@ impl Default for App {
impl App { impl App {
pub fn new() -> Self { pub fn new() -> Self {
App { App {
state: Default::default(),
screen: vec![CurrentScreen::Main], screen: vec![CurrentScreen::Main],
peers: Default::default(), state: Default::default(),
events: Default::default(), events: Default::default(),
peers: Default::default(),
uploads: Default::default(), uploads: Default::default(),
upload_state: Default::default(),
transfer_event_rx: Default::default(), transfer_event_rx: Default::default(),
} }
} }
@ -156,7 +158,7 @@ impl App {
} }
} }
fn draw(&self, frame: &mut Frame) { fn draw(&mut self, frame: &mut Frame) {
frame.render_widget(self, frame.area()); frame.render_widget(self, frame.area());
} }

View file

@ -8,7 +8,7 @@ use ratatui::{
style::{Style, Stylize}, style::{Style, Stylize},
symbols::border, symbols::border,
text::{Line, Text, ToLine}, text::{Line, Text, ToLine},
widgets::{Block, Borders, List, ListItem, Padding, Paragraph, Row, Table, Widget}, widgets::{Block, Borders, List, ListItem, Padding, Paragraph, Row, Table, TableState, Widget},
}; };
use tui_logger::{TuiLoggerLevelOutput, TuiLoggerWidget, TuiWidgetState}; use tui_logger::{TuiLoggerLevelOutput, TuiLoggerWidget, TuiWidgetState};
@ -42,7 +42,7 @@ static LOGGING_MENU: LazyLock<Line> = LazyLock::new(|| {
]) ])
}); });
impl Widget for &App { impl Widget for &mut App {
fn render(self, area: Rect, buf: &mut Buffer) { fn render(self, area: Rect, buf: &mut Buffer) {
let main_layout = let main_layout =
Layout::vertical([Constraint::Min(5), Constraint::Min(10), Constraint::Min(3)]); Layout::vertical([Constraint::Min(5), Constraint::Min(10), Constraint::Min(3)]);
@ -67,7 +67,12 @@ impl Widget for &App {
peers.render(footer_right.inner(footer_margin), buf); peers.render(footer_right.inner(footer_margin), buf);
NetworkInfoWidget.render(footer_left.inner(footer_margin), buf); NetworkInfoWidget.render(footer_left.inner(footer_margin), buf);
let ups: Vec<_> = self.uploads.values().collect(); let ups: Vec<_> = self.uploads.values().collect();
uploads(&ups, header_left.inner(header_margin), buf); uploads(
&ups,
&mut self.upload_state,
header_left.inner(header_margin),
buf,
);
} }
CurrentScreen::Logging => { CurrentScreen::Logging => {
main_page(*mode, &LOGGING_MENU, area, buf); main_page(*mode, &LOGGING_MENU, area, buf);
@ -118,8 +123,12 @@ fn main_page(screen: CurrentScreen, menu: &Line, area: Rect, buf: &mut Buffer) {
.render(area, buf); .render(area, buf);
} }
fn uploads(requests: &[&JoecalUploadRequest], area: Rect, buf: &mut Buffer) { fn uploads(
//let mut lines = Vec::new(); requests: &[&JoecalUploadRequest],
state: &mut TableState,
area: Rect,
buf: &mut Buffer,
) {
let title = Line::from(" Upload Requests ").bold(); let title = Line::from(" Upload Requests ").bold();
let block = Block::bordered() let block = Block::bordered()
.title(title.centered()) .title(title.centered())
@ -127,20 +136,32 @@ fn uploads(requests: &[&JoecalUploadRequest], area: Rect, buf: &mut Buffer) {
let mut rows = Vec::new(); let mut rows = Vec::new();
for &req in requests { for &req in requests {
let src = req.alias.to_line().left_aligned(); let src = req.alias.to_line().left_aligned();
let mut size = 0;
let files = req let files = req
.files .files
.values() .values()
.map(|f| f.file_name.clone()) .map(|f| {
size += f.size;
f.file_name.clone()
})
.collect::<Vec<_>>(); .collect::<Vec<_>>();
let files = files.join(", "); let files = files.join(", ");
let files = Line::from(files); let files = Line::from(files).centered();
rows.push(Row::new([src, files.centered()])); let size = Line::from(format!("{size}")).centered();
rows.push(Row::new([src, size, files]));
} }
let widths = [Constraint::Max(20), Constraint::Min(50)]; let widths = [
let table = Table::new(rows, widths) Constraint::Max(20),
.block(block) Constraint::Max(15),
.header(Row::new(["Sender".bold(), "Files".bold()])); Constraint::Min(50),
table.render(area, buf); ];
let table = Table::new(rows, widths).block(block).header(Row::new([
"Sender".bold().into_left_aligned_line(),
"Bytes".bold().into_centered_line(),
"Files".bold().into_centered_line(),
]));
ratatui::widgets::StatefulWidget::render(table, area, buf, state);
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]