Make previous follow the same order of virtual indices that next follows.

Update issue #316
I've fixed the second part of your report in this one - pressing "back" should follow the same random order now.  It goes a bit weird if you go back past the first random track you played, but I don't care too much about that :)
This commit is contained in:
David Sansome 2010-05-17 00:02:22 +00:00
parent 3891bc032d
commit 56765caf64
2 changed files with 52 additions and 3 deletions

View File

@ -250,6 +250,36 @@ int Playlist::NextVirtualIndex(int i) const {
return virtual_items_.count();
}
int Playlist::PreviousVirtualIndex(int i) const {
PlaylistSequence::RepeatMode repeat_mode = playlist_sequence_->repeat_mode();
PlaylistSequence::ShuffleMode shuffle_mode = playlist_sequence_->shuffle_mode();
bool album_only = repeat_mode == PlaylistSequence::Repeat_Album ||
shuffle_mode == PlaylistSequence::Shuffle_Album;
// This one's easy - if we have to repeat the current track then just return i
if (repeat_mode == PlaylistSequence::Repeat_Track)
return i;
// If we're not bothered about whether a song is on the same album then
// return the previous virtual index, whatever it is.
if (!album_only)
return i-1;
// We need to decrement i until we get something else on the same album
Song last_song = current_item_metadata();
for (int j=i-1 ; j>=0; --j) {
Song this_song = item_at(virtual_items_[j])->Metadata();
if (((last_song.is_compilation() && this_song.is_compilation()) ||
last_song.artist() == this_song.artist()) &&
last_song.album() == this_song.album()) {
return j; // Found one
}
}
// Couldn't find one - return before the start of the list
return -1;
}
int Playlist::next_index() const {
// Did we want to stop after this track?
if (stop_after_.isValid() && current_index() == stop_after_.row())
@ -280,10 +310,28 @@ int Playlist::next_index() const {
}
int Playlist::previous_index() const {
int i = current_index() - 1;
if (i < 0)
int prev_virtual_index = PreviousVirtualIndex(current_virtual_index_);
if (prev_virtual_index < 0) {
// We've gone off the beginning of the playlist.
switch (playlist_sequence_->repeat_mode()) {
case PlaylistSequence::Repeat_Off:
return -1;
case PlaylistSequence::Repeat_Track:
prev_virtual_index = current_virtual_index_;
break;
default:
prev_virtual_index = PreviousVirtualIndex(virtual_items_.count());
break;
}
}
// Still off the beginning? Then just give up
if (prev_virtual_index < 0)
return -1;
return i;
return virtual_items_[prev_virtual_index];
}
void Playlist::set_current_index(int i) {

View File

@ -172,6 +172,7 @@ class Playlist : public QAbstractListModel {
void UpdateScrobblePoint();
void ReshuffleIndices();
int NextVirtualIndex(int i) const;
int PreviousVirtualIndex(int i) const;
// Modify the playlist without changing the undo stack. These are used by
// our friends in PlaylistUndoCommands