diff --git a/src/album.rs b/src/album.rs index f864cde..916a506 100644 --- a/src/album.rs +++ b/src/album.rs @@ -177,7 +177,7 @@ impl ListItem for Album { if let Some(tracks) = self.tracks.as_ref() { let tracks: Vec<&Track> = tracks.iter().collect(); let index = queue.append_next(tracks); - queue.play(index, true); + queue.play(index, true, true); } } diff --git a/src/artist.rs b/src/artist.rs index 1d7acb9..1ec2115 100644 --- a/src/artist.rs +++ b/src/artist.rs @@ -172,7 +172,7 @@ impl ListItem for Artist { if let Some(tracks) = self.tracks() { let index = queue.append_next(tracks); - queue.play(index, true); + queue.play(index, true, true); } } diff --git a/src/playlist.rs b/src/playlist.rs index 8f9ec33..3b10335 100644 --- a/src/playlist.rs +++ b/src/playlist.rs @@ -140,7 +140,7 @@ impl ListItem for Playlist { if let Some(tracks) = self.tracks.as_ref() { let index = queue.append_next(tracks.iter().collect()); - queue.play(index, true); + queue.play(index, true, true); } } diff --git a/src/queue.rs b/src/queue.rs index b0a0352..5d984cb 100644 --- a/src/queue.rs +++ b/src/queue.rs @@ -140,7 +140,7 @@ impl Queue { let current = *self.current_track.read().unwrap(); if let Some(current_track) = current { if index == current_track { - self.play(index, false); + self.play(index, false, false); } else if index < current_track { let mut current = self.current_track.write().unwrap(); current.replace(current_track - 1); @@ -187,7 +187,12 @@ impl Queue { } } - pub fn play(&self, index: usize, reshuffle: bool) { + pub fn play(&self, mut index: usize, reshuffle: bool, shuffle_index: bool) { + if shuffle_index && self.get_shuffle() { + let mut rng = rand::thread_rng(); + index = rng.gen_range(0, &self.queue.read().unwrap().len()); + } + if let Some(track) = &self.queue.read().unwrap().get(index) { self.spotify.load(&track); let mut current = self.current_track.write().unwrap(); @@ -218,13 +223,13 @@ impl Queue { if repeat == RepeatSetting::RepeatTrack && !manual { if let Some(index) = current { - self.play(index, false); + self.play(index, false, false); } } else if let Some(index) = self.next_index() { - self.play(index, false); + self.play(index, false, false); } else if repeat == RepeatSetting::RepeatPlaylist && q.len() > 0 { let random_order = self.random_order.read().unwrap(); - self.play(random_order.as_ref().map(|o| o[0]).unwrap_or(0), false); + self.play(random_order.as_ref().map(|o| o[0]).unwrap_or(0), false, false); } else { self.spotify.stop(); } @@ -232,7 +237,7 @@ impl Queue { pub fn previous(&self) { if let Some(index) = self.previous_index() { - self.play(index, false); + self.play(index, false, false); } else { self.spotify.stop(); } diff --git a/src/track.rs b/src/track.rs index ac5b57f..ef899f4 100644 --- a/src/track.rs +++ b/src/track.rs @@ -174,7 +174,7 @@ impl ListItem for Track { fn play(&mut self, queue: Arc) { let index = queue.append_next(vec![self]); - queue.play(index, true); + queue.play(index, true, false); } fn queue(&mut self, queue: Arc) { diff --git a/src/ui/listview.rs b/src/ui/listview.rs index 11e8e6c..dc54b80 100644 --- a/src/ui/listview.rs +++ b/src/ui/listview.rs @@ -148,7 +148,7 @@ impl ListView { 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); + self.queue.play(index + self.selected, true, false); true } else { false diff --git a/src/ui/queue.rs b/src/ui/queue.rs index 9d3e201..8d96f21 100644 --- a/src/ui/queue.rs +++ b/src/ui/queue.rs @@ -92,7 +92,7 @@ impl ViewExt for QueueView { fn on_command(&mut self, s: &mut Cursive, cmd: &Command) -> Result { match cmd { Command::Play => { - self.queue.play(self.list.get_selected_index(), true); + self.queue.play(self.list.get_selected_index(), true, false); return Ok(CommandResult::Consumed(None)); } Command::Queue => {