Show refreshing status during library scan

- Add is_refreshing flag to AppState
- Display 'Refreshing library...' in status panel during scan
- Note: scan is currently blocking, message may be brief
- Infrastructure ready for future async scanning
This commit is contained in:
Christoffer Martinsson 2025-12-06 13:04:00 +01:00
parent afc58a7920
commit 71b43d644c
3 changed files with 13 additions and 5 deletions

View File

@ -178,12 +178,14 @@ async fn handle_key_event(state: &mut AppState, player: &mut player::Player, key
} }
} }
KeyCode::Char('r') => { KeyCode::Char('r') => {
state.is_refreshing = true;
tracing::info!("Rescanning..."); tracing::info!("Rescanning...");
let cache_dir = cache::get_cache_dir()?; let cache_dir = cache::get_cache_dir()?;
let new_cache = scanner::scan_paths(&state.config.scan_paths.paths)?; let new_cache = scanner::scan_paths(&state.config.scan_paths.paths)?;
new_cache.save(&cache_dir)?; new_cache.save(&cache_dir)?;
state.cache = new_cache; state.cache = new_cache;
state.refresh_flattened_items(); state.refresh_flattened_items();
state.is_refreshing = false;
tracing::info!("Rescan complete"); tracing::info!("Rescan complete");
} }
_ => {} _ => {}

View File

@ -26,6 +26,7 @@ pub struct AppState {
pub marked_files: HashSet<PathBuf>, pub marked_files: HashSet<PathBuf>,
pub playlist: Vec<PathBuf>, pub playlist: Vec<PathBuf>,
pub playlist_index: usize, pub playlist_index: usize,
pub is_refreshing: bool,
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
@ -58,6 +59,7 @@ impl AppState {
marked_files: HashSet::new(), marked_files: HashSet::new(),
playlist: Vec::new(), playlist: Vec::new(),
playlist_index: 0, playlist_index: 0,
is_refreshing: false,
} }
} }

View File

@ -65,11 +65,15 @@ fn render_status_panel(frame: &mut Frame, state: &AppState, area: Rect) {
]) ])
.split(area); .split(area);
// Player state // Player state or refreshing status
let state_text = match state.player_state { let state_text = if state.is_refreshing {
"Refreshing library..."
} else {
match state.player_state {
PlayerState::Stopped => "Stopped", PlayerState::Stopped => "Stopped",
PlayerState::Playing => "Playing", PlayerState::Playing => "Playing",
PlayerState::Paused => "Paused", PlayerState::Paused => "Paused",
}
}; };
let state_widget = Paragraph::new(state_text) let state_widget = Paragraph::new(state_text)
.block(Block::default().borders(Borders::ALL).title("Status")) .block(Block::default().borders(Borders::ALL).title("Status"))