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
+
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);