From 8eb42b5ab840b36aa8449e8f57fa4bfa7b5aa2ca Mon Sep 17 00:00:00 2001 From: David Sansome Date: Wed, 3 Feb 2010 23:56:41 +0000 Subject: [PATCH] Shuffle playlist --- data/data.qrc | 1 + data/shuffle.png | Bin 0 -> 688 bytes src/mainwindow.cpp | 2 ++ src/mainwindow.ui | 10 ++++++++++ src/player.cpp | 4 ++++ src/playlist.cpp | 20 ++++++++++++++++++++ src/playlist.h | 1 + 7 files changed, 38 insertions(+) create mode 100644 data/shuffle.png 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 0000000000000000000000000000000000000000..50f62a15474c701de0e93e839cf6b4b63c98b7c4 GIT binary patch literal 688 zcmV;h0#E&kP)m0sjpUWA;r>dq025xp$ml|SP~zb>?Gi>l+wEMfnpwnG&9cquH&6M-nj-Zd^zXj z-1+8rCx;s*grK`F##lmzC)E6P5WQa5B||dg#;2U~PxiJToi7rJyohQG^R{LAyxThJ zXrady?%4@p-9Q;LDVo~8L_=`qM&ZVzVvSNMf~jtJGB$$Pll`fi<|eU#PSc~1Tca0945Rt& zs+tOr>(gNp#%Jf7A$E=5kG4Az!UhfG29bbThn`6d8^ppSCOr0Rwx(0UoV*1ZVPI`1 zUQIs;mNeIkOW z%yh!i>I$T;-m^0Lfm8A3$A4__`g;SUlixUMomS?6K^Br>%##pLQDC7?RUPwCKfVq!czNCMDej|Sr7nI3lKFjoL*o*$gxLU2| zY(!=qi^Zp8{?TfyA4RcPBpWf;Ht0_v|AnF%<76@^)f6#KC(Klx@xA^m<+}5*8?FHN Wd*;j$Cv9Q?0000setDefaultAction(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);