spiff the uploads widget
This commit is contained in:
parent
b0ffa297f3
commit
f9efd37d00
2 changed files with 40 additions and 17 deletions
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)]
|
||||||
|
|
Loading…
Reference in a new issue