From 93f4fca324de907e4c1cfd776826972ac9159100 Mon Sep 17 00:00:00 2001 From: John Maguire Date: Mon, 2 Aug 2010 15:07:26 +0000 Subject: [PATCH] Do bulk tag updates in "parallel". Update issue #542 --- src/ui/edittagdialog.cpp | 64 +++++++++++++++++++++++++++------------- src/ui/edittagdialog.h | 10 +++++++ src/ui/edittagdialog.ui | 15 ++++++++++ 3 files changed, 68 insertions(+), 21 deletions(-) diff --git a/src/ui/edittagdialog.cpp b/src/ui/edittagdialog.cpp index 007786807..f613f691c 100644 --- a/src/ui/edittagdialog.cpp +++ b/src/ui/edittagdialog.cpp @@ -19,6 +19,10 @@ #include "library/library.h" #include "playlist/playlistdelegates.h" +#include +using boost::bind; + +#include #include #include @@ -29,6 +33,8 @@ EditTagDialog::EditTagDialog(QWidget* parent) ui_(new Ui_EditTagDialog) { ui_->setupUi(this); + ui_->busy->hide(); + connect(&watcher_, SIGNAL(finished()), SLOT(SongsEdited())); } EditTagDialog::~EditTagDialog() { @@ -116,35 +122,51 @@ void EditTagDialog::SetTagCompleter(LibraryBackend* backend) { new TagCompleter(backend, Playlist::Column_Album, ui_->album); } -void EditTagDialog::accept() { - foreach (const Song& old, songs_) { - Song song(old); +void EditTagDialog::SaveSong(const Song& old) { + Song song(old); - int track = ui_->track->text().isEmpty() ? -1 : ui_->track->value(); - int year = ui_->year->text().isEmpty() ? -1 : ui_->year->value(); + int track = ui_->track->text().isEmpty() ? -1 : ui_->track->value(); + int year = ui_->year->text().isEmpty() ? -1 : ui_->year->value(); - if (ui_->title->isEnabled()) - song.set_title(ui_->title->text()); + if (ui_->title->isEnabled()) + song.set_title(ui_->title->text()); - if (ui_->artist->isEnabled() && !(common_artist_.isNull() && ui_->artist->text().isEmpty())) - song.set_artist(ui_->artist->text()); - if (ui_->album->isEnabled() && !(common_album_.isNull() && ui_->album->text().isEmpty())) - song.set_album(ui_->album->text()); - if (ui_->genre->isEnabled() && !(common_genre_.isNull() && ui_->genre->text().isEmpty())) - song.set_genre(ui_->genre->text()); - if (ui_->year->isEnabled() && !(common_year_ == -1 && year == -1)) - song.set_year(year); + if (ui_->artist->isEnabled() && !(common_artist_.isNull() && ui_->artist->text().isEmpty())) + song.set_artist(ui_->artist->text()); + if (ui_->album->isEnabled() && !(common_album_.isNull() && ui_->album->text().isEmpty())) + song.set_album(ui_->album->text()); + if (ui_->genre->isEnabled() && !(common_genre_.isNull() && ui_->genre->text().isEmpty())) + song.set_genre(ui_->genre->text()); + if (ui_->year->isEnabled() && !(common_year_ == -1 && year == -1)) + song.set_year(year); - if (ui_->track->isEnabled()) - song.set_track(track); + if (ui_->track->isEnabled()) + song.set_track(track); - if (ui_->comment->isEnabled()) - song.set_comment(ui_->comment->toPlainText()); + if (ui_->comment->isEnabled()) + song.set_comment(ui_->comment->toPlainText()); + { + QMutexLocker l(&taglib_mutex_); song.Save(); - - emit SongEdited(old, song); } + // Corresponding slots should automatically be called in the receiver's thread, assuming + // the connection is an auto connection. + emit SongEdited(old, song); +} + +void EditTagDialog::accept() { + QFuture future = QtConcurrent::map(songs_, bind(&EditTagDialog::SaveSong, this, _1)); + watcher_.setFuture(future); + ui_->busy->show(); + ui_->buttonBox->setEnabled(false); +} + +void EditTagDialog::SongsEdited() { + qDebug() << Q_FUNC_INFO; + ui_->busy->hide(); + ui_->buttonBox->setEnabled(true); + QDialog::accept(); } diff --git a/src/ui/edittagdialog.h b/src/ui/edittagdialog.h index cb7ddf197..5535cb275 100644 --- a/src/ui/edittagdialog.h +++ b/src/ui/edittagdialog.h @@ -18,6 +18,8 @@ #define EDITTAGDIALOG_H #include +#include +#include #include "core/song.h" @@ -39,10 +41,15 @@ class EditTagDialog : public QDialog { public slots: void accept(); + private slots: + void SongsEdited(); + signals: void SongEdited(const Song& old_song, const Song& new_song); private: + void SaveSong(const Song& song); + Ui_EditTagDialog* ui_; SongList songs_; @@ -51,6 +58,9 @@ class EditTagDialog : public QDialog { QString common_album_; QString common_genre_; int common_year_; + + QFutureWatcher watcher_; + QMutex taglib_mutex_; }; #endif // EDITTAGDIALOG_H diff --git a/src/ui/edittagdialog.ui b/src/ui/edittagdialog.ui index 4805c21d9..28862e3b7 100644 --- a/src/ui/edittagdialog.ui +++ b/src/ui/edittagdialog.ui @@ -172,6 +172,16 @@ + + + + + 0 + 0 + + + + @@ -193,6 +203,11 @@ + + BusyIndicator + QLabel +
widgets/busyindicator.h
+
LineEdit QLineEdit