diff --git a/data/data.qrc b/data/data.qrc index dd91d0c34..c69f08bb4 100644 --- a/data/data.qrc +++ b/data/data.qrc @@ -56,5 +56,6 @@ library.png media-playback-start-32.png lightbulb.png + shuffle.png diff --git a/data/shuffle.png b/data/shuffle.png new file mode 100644 index 000000000..50f62a154 Binary files /dev/null and b/data/shuffle.png differ diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index fd40fbced..745fed7e3 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -103,6 +103,7 @@ MainWindow::MainWindow(QWidget *parent) connect(ui_.action_edit_track, SIGNAL(triggered()), SLOT(EditTracks())); connect(ui_.action_configure, SIGNAL(triggered()), settings_dialog_, SLOT(show())); connect(ui_.action_about, SIGNAL(triggered()), about_dialog_, SLOT(show())); + connect(ui_.action_shuffle, SIGNAL(triggered()), playlist_, SLOT(Shuffle())); // Give actions to buttons ui_.forward_button->setDefaultAction(ui_.action_next_track); @@ -196,6 +197,7 @@ MainWindow::MainWindow(QWidget *parent) playlist_menu_->addAction(ui_.action_edit_track); playlist_menu_->addSeparator(); playlist_menu_->addAction(ui_.action_clear_playlist); + playlist_menu_->addAction(ui_.action_shuffle); // Radio connections connect(radio_model_, SIGNAL(TaskStarted(QString)), multi_loading_indicator_, SLOT(TaskStarted(QString))); diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 3562b67bd..b3c7b25a7 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -456,6 +456,7 @@ Playlist + @@ -647,6 +648,15 @@ About Clementine... + + + + :/shuffle.png:/shuffle.png + + + Shuffle playlist + + diff --git a/src/player.cpp b/src/player.cpp index 3ec47cd4e..397cdaf8a 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -207,5 +207,9 @@ void Player::EngineMetadataReceived(const Engine::SimpleMetaBundle& bundle) { Song song; song.InitFromSimpleMetaBundle(bundle); + // Ignore useless metadata + if (song.title().isEmpty() && song.artist().isEmpty()) + return; + playlist_->SetStreamMetadata(item->Url(), song); } diff --git a/src/playlist.cpp b/src/playlist.cpp index 1e76282fe..51f376a68 100644 --- a/src/playlist.cpp +++ b/src/playlist.cpp @@ -523,3 +523,23 @@ void Playlist::ReloadItems(const QList& rows) { emit dataChanged(index(row, 0), index(row, ColumnCount-1)); } } + +void Playlist::Shuffle() { + layoutAboutToBeChanged(); + + const int count = items_.count(); + for (int i=0 ; i < count; ++i) { + int new_pos = i + (rand() % (count - i)); + + std::swap(items_[i], items_[new_pos]); + + foreach (const QModelIndex& pidx, persistentIndexList()) { + if (pidx.row() == i) + changePersistentIndex(pidx, index(new_pos, pidx.column(), QModelIndex())); + else if (pidx.row() == new_pos) + changePersistentIndex(pidx, index(i, pidx.column(), QModelIndex())); + } + } + + layoutChanged(); +} diff --git a/src/playlist.h b/src/playlist.h index bec6f24b1..3a141a977 100644 --- a/src/playlist.h +++ b/src/playlist.h @@ -101,6 +101,7 @@ class Playlist : public QAbstractListModel { void SetStreamMetadata(const QUrl& url, const Song& song); void Clear(); + void Shuffle(); signals: void CurrentSongChanged(const Song& metadata);