Add seek and volume controls

- Left/Right arrows: seek backward/forward 10 seconds
- +/- keys: adjust volume by 5% increments
- Volume clamped between 0-100%
- Only allow seeking when track is playing
- Update status bar help text with new controls
This commit is contained in:
Christoffer Martinsson 2025-12-06 13:13:49 +01:00
parent cc86f8eb55
commit 81908beb75
2 changed files with 25 additions and 1 deletions

View File

@ -177,6 +177,30 @@ async fn handle_key_event(state: &mut AppState, player: &mut player::Player, key
PlayerState::Stopped => {}
}
}
KeyCode::Left => {
if state.player_state != PlayerState::Stopped {
player.seek(-10.0)?;
tracing::info!("Seek backward 10s");
}
}
KeyCode::Right => {
if state.player_state != PlayerState::Stopped {
player.seek(10.0)?;
tracing::info!("Seek forward 10s");
}
}
KeyCode::Char('+') | KeyCode::Char('=') => {
let new_volume = (state.volume + 5).min(100);
state.volume = new_volume;
player.set_volume(new_volume)?;
tracing::info!("Volume: {}%", new_volume);
}
KeyCode::Char('-') => {
let new_volume = (state.volume - 5).max(0);
state.volume = new_volume;
player.set_volume(new_volume)?;
tracing::info!("Volume: {}%", new_volume);
}
KeyCode::Char('r') => {
state.is_refreshing = true;
tracing::info!("Rescanning...");

View File

@ -149,7 +149,7 @@ fn render_title_bar(frame: &mut Frame, state: &AppState, area: Rect) {
}
fn render_status_bar(frame: &mut Frame, _state: &AppState, area: Rect) {
let shortcuts = "↑↓/jk: Navigate • h/l: Fold • t: Mark • c: Clear • Enter: Play • Space: Pause • n/p: Next/Prev • r: Rescan • q: Quit";
let shortcuts = "↑↓/jk: Navigate • h/l: Fold • t: Mark • c: Clear • Enter: Play • Space: Pause • ←→: Seek • +/-: Volume • n/p: Next/Prev • r: Rescan • q: Quit";
let status_bar = Paragraph::new(shortcuts)
.style(Style::default().fg(Color::White))