From 0d7673f5fe9ea0667c5177646caf890aab9de968 Mon Sep 17 00:00:00 2001 From: mace Date: Sun, 31 Aug 2025 16:49:47 +0200 Subject: [PATCH] fix some issues with list and redraw --- src/radio/app.rs | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/src/radio/app.rs b/src/radio/app.rs index 7ec753f..368b7ee 100644 --- a/src/radio/app.rs +++ b/src/radio/app.rs @@ -89,7 +89,12 @@ impl App { .iter() .map(|s| { let name = if s.name.len() > max_name_len { - format!("{}...", &s.name[..max_name_len.saturating_sub(3)]) + let truncated: String = s + .name + .chars() + .take(max_name_len.saturating_sub(3)) + .collect(); + format!("{}...", truncated) } else { s.name.clone() }; @@ -135,12 +140,14 @@ impl App { } async fn handle_events(&mut self) -> io::Result<()> { - match event::read()? { - Event::Key(key_event) if key_event.kind == KeyEventKind::Press => { - self.handle_key_event(key_event).await + if event::poll(std::time::Duration::from_millis(100))? { + match event::read()? { + Event::Key(key_event) if key_event.kind == KeyEventKind::Press => { + self.handle_key_event(key_event).await; + } + _ => {} } - _ => {} - }; + } Ok(()) } @@ -180,19 +187,27 @@ impl App { KeyCode::Char('q') => self.exit().await, KeyCode::Down | KeyCode::Char('j') => { if let Some(i) = self.station_list_state.selected() { - let next = (i + 1).min(self.stations.len().saturating_sub(1)); - self.station_list_state.select(Some(next)); + if !self.filtered_stations.is_empty() { + let next = (i + 1) % self.filtered_stations.len(); + self.station_list_state.select(Some(next)); + } } } KeyCode::Up | KeyCode::Char('k') => { if let Some(i) = self.station_list_state.selected() { - let prev = i.saturating_sub(1); - self.station_list_state.select(Some(prev)); + if !self.filtered_stations.is_empty() { + let prev = if i == 0 { + self.filtered_stations.len() - 1 + } else { + i - 1 + }; + self.station_list_state.select(Some(prev)); + } } } KeyCode::Enter => { if let Some(i) = self.station_list_state.selected() { - if let Some(station) = self.stations.get(i) { + if let Some(station) = self.filtered_stations.get(i) { self.play_station(station.url.clone()).await; } }