diff --git a/src/ui/status.rs b/src/ui/status.rs index b99e6f5..820342a 100644 --- a/src/ui/status.rs +++ b/src/ui/status.rs @@ -1,4 +1,7 @@ -use crate::app::{App, InputMode}; +use crate::app::{ + App, InputMode, + utils::{filesize::FileSize, netspeed::NetSpeed}, +}; use ratatui::{ prelude::*, text::Span, @@ -6,13 +9,26 @@ use ratatui::{ }; pub fn render(frame: &mut Frame, app: &App, area: Rect) { + let torrents = &app.torrents.torrents; + + // Aggregate stats + let total_down_speed: i64 = torrents.iter().filter_map(|t| t.rate_download).sum(); + let total_up_speed: i64 = torrents.iter().filter_map(|t| t.rate_upload).sum(); + let total_downloaded: u64 = torrents.iter().filter_map(|t| t.downloaded_ever).sum(); + let total_uploaded: i64 = torrents.iter().filter_map(|t| t.uploaded_ever).sum(); + + let down_speed = NetSpeed::new(total_down_speed.unsigned_abs()); + let up_speed = NetSpeed::new(total_up_speed.unsigned_abs()); + let downloaded = FileSize::new(total_downloaded); + let uploaded = FileSize::new(total_uploaded.unsigned_abs()); + let total = app.torrents.len(); let selected_count = app.torrents.selected.len(); - let left = if selected_count > 0 { - format!(" {selected_count}/{total} selected") + let count_info = if selected_count > 0 { + format!("{selected_count}/{total}") } else { - format!(" {total} torrents") + format!("{total}") }; let mode_text = match app.input_mode { @@ -23,12 +39,14 @@ pub fn render(frame: &mut Frame, app: &App, area: Rect) { }; let keybinds = match app.input_mode { - InputMode::None => "q Quit │ ? Help │ ↑↓ Navigate │ Space Select │ Enter Toggle", - InputMode::Move | InputMode::Rename => "Enter Submit │ Esc Cancel │ Tab Complete", + InputMode::None => "? Help", + InputMode::Move | InputMode::Rename => "Enter Submit │ Esc Cancel", InputMode::ConfirmDelete(_) => "y Confirm │ n Cancel", }; - let right = format!("{keybinds} "); + let left = format!(" {keybinds}"); + let right = + format!("{count_info} │ ↓ {down_speed} ↑ {up_speed} │ D: {downloaded} U: {uploaded} "); let available_width = area.width.saturating_sub(2) as usize; let left_len = left.chars().count(); @@ -37,6 +55,8 @@ pub fn render(frame: &mut Frame, app: &App, area: Rect) { let content = if left_len + right_len < available_width { let padding = available_width.saturating_sub(left_len + right_len); format!("{left}{}{right}", " ".repeat(padding)) + } else if left_len < available_width { + left } else { right };