fix some issues with list and redraw

This commit is contained in:
2025-08-31 16:49:47 +02:00
parent 00faedb1fa
commit 0d7673f5fe
+21 -6
View File
@@ -89,7 +89,12 @@ impl App {
.iter() .iter()
.map(|s| { .map(|s| {
let name = if s.name.len() > max_name_len { 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 { } else {
s.name.clone() s.name.clone()
}; };
@@ -135,12 +140,14 @@ impl App {
} }
async fn handle_events(&mut self) -> io::Result<()> { async fn handle_events(&mut self) -> io::Result<()> {
if event::poll(std::time::Duration::from_millis(100))? {
match event::read()? { match event::read()? {
Event::Key(key_event) if key_event.kind == KeyEventKind::Press => { Event::Key(key_event) if key_event.kind == KeyEventKind::Press => {
self.handle_key_event(key_event).await self.handle_key_event(key_event).await;
} }
_ => {} _ => {}
}; }
}
Ok(()) Ok(())
} }
@@ -180,19 +187,27 @@ impl App {
KeyCode::Char('q') => self.exit().await, KeyCode::Char('q') => self.exit().await,
KeyCode::Down | KeyCode::Char('j') => { KeyCode::Down | KeyCode::Char('j') => {
if let Some(i) = self.station_list_state.selected() { if let Some(i) = self.station_list_state.selected() {
let next = (i + 1).min(self.stations.len().saturating_sub(1)); if !self.filtered_stations.is_empty() {
let next = (i + 1) % self.filtered_stations.len();
self.station_list_state.select(Some(next)); self.station_list_state.select(Some(next));
} }
} }
}
KeyCode::Up | KeyCode::Char('k') => { KeyCode::Up | KeyCode::Char('k') => {
if let Some(i) = self.station_list_state.selected() { if let Some(i) = self.station_list_state.selected() {
let prev = i.saturating_sub(1); 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)); self.station_list_state.select(Some(prev));
} }
} }
}
KeyCode::Enter => { KeyCode::Enter => {
if let Some(i) = self.station_list_state.selected() { 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; self.play_station(station.url.clone()).await;
} }
} }