diff --git a/rm-main/src/ui/components/table.rs b/rm-main/src/ui/components/table.rs index c394a7c..a9b03da 100644 --- a/rm-main/src/ui/components/table.rs +++ b/rm-main/src/ui/components/table.rs @@ -17,7 +17,7 @@ impl GenericTable { } } - fn get_len(&self) -> usize { + pub fn get_len(&self) -> usize { self.overwritten_len .borrow() .map_or(self.items.len(), |len| len) diff --git a/rm-main/src/ui/tabs/torrents/bottom_stats.rs b/rm-main/src/ui/tabs/torrents/bottom_stats.rs index d930ba1..5da81a3 100644 --- a/rm-main/src/ui/tabs/torrents/bottom_stats.rs +++ b/rm-main/src/ui/tabs/torrents/bottom_stats.rs @@ -1,4 +1,7 @@ -use std::sync::{Arc, Mutex}; +use std::{ + borrow::Borrow, + sync::{Arc, Mutex}, +}; use ratatui::{ layout::{Alignment, Rect}, @@ -9,13 +12,28 @@ use transmission_rpc::types::{FreeSpace, SessionStats}; use crate::{ui::components::Component, utils::bytes_to_human_format}; -#[derive(Default)] +use super::table_manager::TableManager; + pub(super) struct BottomStats { // TODO: get rid of the Option pub(super) stats: Arc>>, pub(super) free_space: Arc>>, + pub(super) table_manager: Arc>, } +impl BottomStats { + pub fn new( + stats: Arc>>, + free_space: Arc>>, + table_manager: Arc>, + ) -> Self { + Self { + stats, + free_space, + table_manager, + } + } +} impl Component for BottomStats { fn render(&mut self, f: &mut Frame, rect: Rect) { if let Some(stats) = &*self.stats.lock().unwrap() { @@ -29,6 +47,13 @@ impl Component for BottomStats { text = format!("󰋊 {free_space} | {text}") } + let table_manager = &*self.table_manager.lock().unwrap(); + let state = table_manager.table.borrow(); + if let (Some(current), total) = (state.state.borrow().selected(), state.get_len()) { + let current_idx = current + 1; + text = format!("{current_idx}/{total} | {text}") + } + let paragraph = Paragraph::new(text).alignment(Alignment::Right); f.render_widget(paragraph, rect); } diff --git a/rm-main/src/ui/tabs/torrents/mod.rs b/rm-main/src/ui/tabs/torrents/mod.rs index 013afd3..3134984 100644 --- a/rm-main/src/ui/tabs/torrents/mod.rs +++ b/rm-main/src/ui/tabs/torrents/mod.rs @@ -37,28 +37,29 @@ pub struct TorrentsTab { impl TorrentsTab { pub fn new(ctx: app::Ctx) -> Self { - let stats = BottomStats::default(); let table = GenericTable::new(vec![]); - let table_manager = Arc::new(Mutex::new(TableManager::new(ctx.clone(), table))); + let stats = Arc::new(Mutex::new(None)); + let free_space = Arc::new(Mutex::new(None)); + let bottom_stats = BottomStats::new(stats, free_space, table_manager.clone()); tokio::spawn(transmission::fetchers::stats( ctx.clone(), - Arc::clone(&stats.stats), + Arc::clone(&bottom_stats.stats), )); tokio::spawn(transmission::fetchers::torrents( ctx.clone(), - Arc::clone(&table_manager), + Arc::clone(&bottom_stats.table_manager.clone()), )); tokio::spawn(transmission::fetchers::free_space( ctx.clone(), - Arc::clone(&stats.free_space), + Arc::clone(&bottom_stats.free_space), )); Self { - stats, + stats: bottom_stats, task_manager: TaskManager::new(table_manager.clone(), ctx.clone()), table_manager, popup_manager: PopupManager::new(),