From 15c8f2a3eeb1fb257d78efa1c0b4557b95ff3ca3 Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Mon, 25 Mar 2019 00:53:12 +0100 Subject: [PATCH] Notify collection backend about renamed files when organising files --- src/collection/collectionbackend.cpp | 15 ++++++++++++--- src/collection/collectionbackend.h | 2 ++ src/collection/collectionview.cpp | 2 +- src/core/mainwindow.cpp | 2 +- src/core/metatypes.cpp | 1 + src/organise/organise.cpp | 6 ++++++ src/organise/organise.h | 2 ++ src/organise/organisedialog.cpp | 7 ++++++- src/organise/organisedialog.h | 4 +++- 9 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/collection/collectionbackend.cpp b/src/collection/collectionbackend.cpp index 6c9b5e2a0..29eb5e212 100644 --- a/src/collection/collectionbackend.cpp +++ b/src/collection/collectionbackend.cpp @@ -323,6 +323,17 @@ SongList CollectionBackend::FindSongsInDirectory(int id) { } +void CollectionBackend::SongPathChanged(const Song &song, const QFileInfo &new_file) { + + // Take a song and update its path + Song updated_song = song; + updated_song.InitFromFilePartial(new_file.absoluteFilePath()); + SongList updated_songs; + updated_songs << updated_song; + AddOrUpdateSongs(updated_songs); + +} + void CollectionBackend::AddOrUpdateSubdirs(const SubdirectoryList &subdirs) { QMutexLocker l(db_->Mutex()); @@ -575,10 +586,8 @@ QStringList CollectionBackend::GetAllArtistsWithAlbums(const QueryOptions &opt) } } -// QStringList ret; QSet artists; while (query.Next()) { - //ret << query.Value(0).toString(); artists << query.Value(0).toString(); } @@ -586,8 +595,8 @@ QStringList CollectionBackend::GetAllArtistsWithAlbums(const QueryOptions &opt) artists << query2.Value(0).toString(); } -// return ret; return QStringList(artists.toList()); + } CollectionBackend::AlbumList CollectionBackend::GetAllAlbums(const QueryOptions &opt) { diff --git a/src/collection/collectionbackend.h b/src/collection/collectionbackend.h index 70fde3de0..ac381b0d9 100644 --- a/src/collection/collectionbackend.h +++ b/src/collection/collectionbackend.h @@ -27,6 +27,7 @@ #include #include +#include #include #include #include @@ -194,6 +195,7 @@ class CollectionBackend : public CollectionBackendInterface { void IncrementPlayCount(int id); void IncrementSkipCount(int id, float progress); void ResetStatistics(int id); + void SongPathChanged(const Song &song, const QFileInfo &new_file); signals: void DirectoryDiscovered(const Directory &dir, const SubdirectoryList &subdirs); diff --git a/src/collection/collectionview.cpp b/src/collection/collectionview.cpp index c17baa0b3..db3cfab95 100644 --- a/src/collection/collectionview.cpp +++ b/src/collection/collectionview.cpp @@ -655,7 +655,7 @@ SongList CollectionView::GetSelectedSongs() const { void CollectionView::Organise() { if (!organise_dialog_) - organise_dialog_.reset(new OrganiseDialog(app_->task_manager())); + organise_dialog_.reset(new OrganiseDialog(app_->task_manager(), app_->collection_backend())); organise_dialog_->SetDestinationModel(app_->collection_model()->directory_model()); organise_dialog_->SetCopy(false); diff --git a/src/core/mainwindow.cpp b/src/core/mainwindow.cpp index 524e18441..179e8bfb0 100644 --- a/src/core/mainwindow.cpp +++ b/src/core/mainwindow.cpp @@ -197,7 +197,7 @@ MainWindow::MainWindow(Application *app, SystemTrayIcon *tray_icon, OSD *osd, co //organise_dialog_(new OrganiseDialog(app_->task_manager())), equalizer_(new Equalizer), organise_dialog_([=]() { - OrganiseDialog *dialog = new OrganiseDialog(app->task_manager()); + OrganiseDialog *dialog = new OrganiseDialog(app->task_manager(), app->collection_backend()); dialog->SetDestinationModel(app->collection()->model()->directory_model()); return dialog; }), diff --git a/src/core/metatypes.cpp b/src/core/metatypes.cpp index a0d5eb429..65f566b99 100644 --- a/src/core/metatypes.cpp +++ b/src/core/metatypes.cpp @@ -67,6 +67,7 @@ void RegisterMetaTypes() { qRegisterMetaType("const char*"); qRegisterMetaType>("QList"); qRegisterMetaType>("QList"); + qRegisterMetaType("QFileInfo"); qRegisterMetaType(); qRegisterMetaType("QAbstractSocket::SocketState"); qRegisterMetaType("QNetworkCookie"); diff --git a/src/organise/organise.cpp b/src/organise/organise.cpp index 28381273a..566d31a6f 100644 --- a/src/organise/organise.cpp +++ b/src/organise/organise.cpp @@ -216,6 +216,12 @@ void Organise::ProcessSomeFiles() { files_with_errors_ << task.song_info_.song_.basefilename(); } else { + if (job.remove_original_) { + // Notify other aspects of system that song has been invalidated + QString root = destination_->LocalPath(); + QFileInfo new_file = QFileInfo(root + "/" + task.song_info_.new_filename_); + emit SongPathChanged(song, new_file); + } if (job.mark_as_listened_) { emit FileCopied(job.metadata_.id()); } diff --git a/src/organise/organise.h b/src/organise/organise.h index 2dfa3a326..81a3e4176 100644 --- a/src/organise/organise.h +++ b/src/organise/organise.h @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -72,6 +73,7 @@ class Organise : public QObject { signals: void Finished(const QStringList &files_with_errors, QStringList); void FileCopied(int database_id); + void SongPathChanged(const Song &song, const QFileInfo &new_file); protected: void timerEvent(QTimerEvent *e); diff --git a/src/organise/organisedialog.cpp b/src/organise/organisedialog.cpp index 5d5ad01b6..6c77d985e 100644 --- a/src/organise/organisedialog.cpp +++ b/src/organise/organisedialog.cpp @@ -60,6 +60,7 @@ #include "core/utilities.h" #include "widgets/freespacebar.h" #include "widgets/linetextedit.h" +#include "collection/collectionbackend.h" #include "organise.h" #include "organisedialog.h" #include "organiseerrordialog.h" @@ -71,10 +72,11 @@ using std::stable_sort; const char *OrganiseDialog::kDefaultFormat = "%albumartist/%album{ (Disc %disc)}/{%track - }%albumartist - %album - %title.%extension"; const char *OrganiseDialog::kSettingsGroup = "OrganiseDialog"; -OrganiseDialog::OrganiseDialog(TaskManager *task_manager, QWidget *parent) +OrganiseDialog::OrganiseDialog(TaskManager *task_manager, CollectionBackend *backend, QWidget *parent) : QDialog(parent), ui_(new Ui_OrganiseDialog), task_manager_(task_manager), + backend_(backend), total_size_(0) { ui_->setupUi(this); @@ -402,6 +404,9 @@ void OrganiseDialog::accept() { Organise *organise = new Organise(task_manager_, storage, format_, copy, ui_->overwrite->isChecked(), ui_->mark_as_listened->isChecked(), ui_->albumcover->isChecked(), new_songs_info_, ui_->eject_after->isChecked()); connect(organise, SIGNAL(Finished(QStringList, QStringList)), SLOT(OrganiseFinished(QStringList, QStringList))); connect(organise, SIGNAL(FileCopied(int)), this, SIGNAL(FileCopied(int))); + if (backend_) + connect(organise, SIGNAL(SongPathChanged(const Song&, const QFileInfo&)), backend_, SLOT(SongPathChanged(const Song&, const QFileInfo&))); + organise->Start(); SaveGeometry(); diff --git a/src/organise/organisedialog.h b/src/organise/organisedialog.h index 59844def6..fecbb5e48 100644 --- a/src/organise/organisedialog.h +++ b/src/organise/organisedialog.h @@ -48,6 +48,7 @@ class QResizeEvent; class QShowEvent; class TaskManager; +class CollectionBackend; class OrganiseErrorDialog; class Ui_OrganiseDialog; @@ -55,7 +56,7 @@ class OrganiseDialog : public QDialog { Q_OBJECT public: - OrganiseDialog(TaskManager *task_manager, QWidget *parent = nullptr); + OrganiseDialog(TaskManager *task_manager, CollectionBackend *backend = nullptr, QWidget *parent = nullptr); ~OrganiseDialog(); QSize sizeHint() const; @@ -104,6 +105,7 @@ class OrganiseDialog : public QDialog { Ui_OrganiseDialog *ui_; TaskManager *task_manager_; + CollectionBackend *backend_; OrganiseFormat format_;