diff --git a/src/ui/listview.rs b/src/ui/listview.rs index d2cc682..11a25aa 100644 --- a/src/ui/listview.rs +++ b/src/ui/listview.rs @@ -11,6 +11,7 @@ use unicode_width::UnicodeWidthStr; use commands::CommandResult; use queue::Queue; +use track::Track; use traits::{ListItem, ViewExt}; pub type Paginator = Box>>) + Send + Sync>; @@ -131,6 +132,19 @@ impl ListView { let new = self.selected as i32 + delta; self.move_focus_to(max(new, 0) as usize); } + + fn attempt_play_all_tracks(&self) -> bool { + let content = self.content.read().unwrap(); + let any = &(*content) as &dyn std::any::Any; + if let Some(tracks) = any.downcast_ref::>() { + let tracks: Vec<&Track> = tracks.iter().collect(); + let index = self.queue.append_next(tracks); + self.queue.play(index + self.selected, true); + true + } else { + false + } + } } impl View for ListView { @@ -264,10 +278,13 @@ impl ViewExt for ListView { args: &[String], ) -> Result { if cmd == "play" { - let mut content = self.content.write().unwrap(); - if let Some(item) = content.get_mut(self.selected) { - item.play(self.queue.clone()); + if !self.attempt_play_all_tracks() { + let mut content = self.content.write().unwrap(); + if let Some(item) = content.get_mut(self.selected) { + item.play(self.queue.clone()); + } } + return Ok(CommandResult::Consumed(None)); }