From bad9e4af5efe725e10f2ebed3ac128142565b27c Mon Sep 17 00:00:00 2001 From: Alexander Bikadorov Date: Mon, 4 Jan 2016 17:09:24 +0100 Subject: [PATCH 1/4] Fix for erasing old tag values when using tag fetcher, replacement for #51311 --- src/ui/edittagdialog.cpp | 47 +++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/src/ui/edittagdialog.cpp b/src/ui/edittagdialog.cpp index de8a606ad..731c36472 100644 --- a/src/ui/edittagdialog.cpp +++ b/src/ui/edittagdialog.cpp @@ -99,7 +99,8 @@ EditTagDialog::EditTagDialog(Application* app, QWidget* parent) connect(widget, SIGNAL(Reset()), SLOT(ResetField())); } - // Connect the edited signal + // Connect the changed signal (emitted when value is changed + // programmatically or non-programmatically) if (qobject_cast(widget)) { connect(widget, SIGNAL(textChanged(QString)), SLOT(FieldValueEdited())); } else if (qobject_cast(widget)) { @@ -833,27 +834,33 @@ void EditTagDialog::FetchTagSongChosen(const Song& original_song, const QString filename = original_song.url().toLocalFile(); // Find the song with this filename - auto data_it = - std::find_if(data_.begin(), data_.end(), [&filename](const Data& d) { - return d.original_.url().toLocalFile() == filename; - }); - if (data_it == data_.end()) { - qLog(Warning) << "Could not find song to filename: " << filename; - return; + int id; + for (id = 0; id < data_.count(); ++id) { + if (data_[id].original_.url().toLocalFile() == filename) + break; } - data_it->current_.set_title(new_metadata.title()); - data_it->current_.set_artist(new_metadata.artist()); - data_it->current_.set_album(new_metadata.album()); - data_it->current_.set_track(new_metadata.track()); - data_it->current_.set_year(new_metadata.year()); + if(id == data_.count()) { + qLog(Warning) << "Could not find song for filename: " << filename; + return; + } - // Is it currently selected in the UI? - int row = data_it - data_.begin(); - if (ui_->song_list->item(row)->isSelected()) { - // We need to update view - for (const FieldData& field : fields_) - InitFieldValue(field, - ui_->song_list->selectionModel()->selectedIndexes()); + // Update song data + data_[id].current_.set_title(new_metadata.title()); + data_[id].current_.set_artist(new_metadata.artist()); + data_[id].current_.set_album(new_metadata.album()); + data_[id].current_.set_track(new_metadata.track()); + data_[id].current_.set_year(new_metadata.year()); + + // Is it currently being displayed in the UI? + if (ui_->song_list->currentRow() == id) { + // Yes! Additionally update UI + ignore_edits_ = true; + ui_->title->set_text(new_metadata.title()); + ui_->artist->set_text(new_metadata.artist()); + ui_->album->set_text(new_metadata.album()); + ui_->track->setValue(new_metadata.track()); + ui_->year->setValue(new_metadata.year()); + ignore_edits_ = false; } } From ff86ecddc5b675314d891b70f06db6f9915152e4 Mon Sep 17 00:00:00 2001 From: Alexander Bikadorov Date: Mon, 4 Jan 2016 18:56:28 +0100 Subject: [PATCH 2/4] Update modified fields boldness when fetching tags --- src/ui/edittagdialog.cpp | 22 +++++++++++----------- src/ui/edittagdialog.h | 1 + 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/ui/edittagdialog.cpp b/src/ui/edittagdialog.cpp index 731c36472..814ea03fb 100644 --- a/src/ui/edittagdialog.cpp +++ b/src/ui/edittagdialog.cpp @@ -365,7 +365,6 @@ bool EditTagDialog::IsValueModified(const QModelIndexList& sel, void EditTagDialog::InitFieldValue(const FieldData& field, const QModelIndexList& sel) { const bool varies = DoesValueVary(sel, field.id_); - const bool modified = IsValueModified(sel, field.id_); if (ExtendedEditor* editor = dynamic_cast(field.editor_)) { editor->clear(); @@ -377,10 +376,7 @@ void EditTagDialog::InitFieldValue(const FieldData& field, } } - QFont new_font(font()); - new_font.setBold(modified); - field.label_->setFont(new_font); - field.editor_->setFont(new_font); + UpdateModifiedField(field, sel); } void EditTagDialog::UpdateFieldValue(const FieldData& field, @@ -401,9 +397,13 @@ void EditTagDialog::UpdateFieldValue(const FieldData& field, data_[i.row()].set_value(field.id_, value); } - // Update the boldness + UpdateModifiedField(field, sel); +} + +void EditTagDialog::UpdateModifiedField(const FieldData& field, const QModelIndexList& sel) { const bool modified = IsValueModified(sel, field.id_); + // Update the boldness QFont new_font(font()); new_font.setBold(modified); field.label_->setFont(new_font); @@ -855,12 +855,12 @@ void EditTagDialog::FetchTagSongChosen(const Song& original_song, // Is it currently being displayed in the UI? if (ui_->song_list->currentRow() == id) { // Yes! Additionally update UI + const QModelIndexList sel = + ui_->song_list->selectionModel()->selectedIndexes(); ignore_edits_ = true; - ui_->title->set_text(new_metadata.title()); - ui_->artist->set_text(new_metadata.artist()); - ui_->album->set_text(new_metadata.album()); - ui_->track->setValue(new_metadata.track()); - ui_->year->setValue(new_metadata.year()); + for (const FieldData& field : fields_) { + InitFieldValue(field, sel); + } ignore_edits_ = false; } } diff --git a/src/ui/edittagdialog.h b/src/ui/edittagdialog.h index abf4f88d6..87a136c02 100644 --- a/src/ui/edittagdialog.h +++ b/src/ui/edittagdialog.h @@ -127,6 +127,7 @@ signals: void InitFieldValue(const FieldData& field, const QModelIndexList& sel); void UpdateFieldValue(const FieldData& field, const QModelIndexList& sel); + void UpdateModifiedField(const FieldData& field, const QModelIndexList& sel); void ResetFieldValue(const FieldData& field, const QModelIndexList& sel); void UpdateSummaryTab(const Song& song); From 9d413ad01ddeb60c1ebb7bb7cdfc68f2db83becf Mon Sep 17 00:00:00 2001 From: Alexander Bikadorov Date: Tue, 9 Feb 2016 21:56:22 +0100 Subject: [PATCH 3/4] Edit tag dialog: merged duplicate code --- src/ui/edittagdialog.cpp | 20 ++++++++++---------- src/ui/edittagdialog.h | 2 ++ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/ui/edittagdialog.cpp b/src/ui/edittagdialog.cpp index 814ea03fb..a75878236 100644 --- a/src/ui/edittagdialog.cpp +++ b/src/ui/edittagdialog.cpp @@ -428,11 +428,7 @@ void EditTagDialog::SelectionChanged() { if (sel.isEmpty()) return; // Set the editable fields - ignore_edits_ = true; - for (const FieldData& field : fields_) { - InitFieldValue(field, sel); - } - ignore_edits_ = false; + UpdateUI(sel); // If we're editing multiple songs then we have to disable certain tabs const bool multiple = sel.count() > 1; @@ -446,6 +442,14 @@ void EditTagDialog::SelectionChanged() { } } +void EditTagDialog::UpdateUI(const QModelIndexList& sel){ + ignore_edits_ = true; + for (const FieldData& field : fields_) { + InitFieldValue(field, sel); + } + ignore_edits_ = false; +} + static void SetText(QLabel* label, int value, const QString& suffix, const QString& def = QString()) { label->setText(value <= 0 ? def : (QString::number(value) + " " + suffix)); @@ -857,10 +861,6 @@ void EditTagDialog::FetchTagSongChosen(const Song& original_song, // Yes! Additionally update UI const QModelIndexList sel = ui_->song_list->selectionModel()->selectedIndexes(); - ignore_edits_ = true; - for (const FieldData& field : fields_) { - InitFieldValue(field, sel); - } - ignore_edits_ = false; + UpdateUI(sel); } } diff --git a/src/ui/edittagdialog.h b/src/ui/edittagdialog.h index 87a136c02..9cd35b4d8 100644 --- a/src/ui/edittagdialog.h +++ b/src/ui/edittagdialog.h @@ -133,6 +133,8 @@ signals: void UpdateSummaryTab(const Song& song); void UpdateStatisticsTab(const Song& song); + void UpdateUI(const QModelIndexList& sel); + bool SetLoading(const QString& message); void SetSongListVisibility(bool visible); From 56e95839f02d3b1990abe5eb9ee280f49fd4aa6a Mon Sep 17 00:00:00 2001 From: Alexander Bikadorov Date: Thu, 11 Feb 2016 16:09:38 +0100 Subject: [PATCH 4/4] Revert to iterator usage in edit tag dialog --- src/ui/edittagdialog.cpp | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/ui/edittagdialog.cpp b/src/ui/edittagdialog.cpp index a75878236..b1f3c6298 100644 --- a/src/ui/edittagdialog.cpp +++ b/src/ui/edittagdialog.cpp @@ -838,29 +838,27 @@ void EditTagDialog::FetchTagSongChosen(const Song& original_song, const QString filename = original_song.url().toLocalFile(); // Find the song with this filename - int id; - for (id = 0; id < data_.count(); ++id) { - if (data_[id].original_.url().toLocalFile() == filename) - break; - } - - if(id == data_.count()) { - qLog(Warning) << "Could not find song for filename: " << filename; - return; + auto data_it = + std::find_if(data_.begin(), data_.end(), [&filename](const Data& d) { + return d.original_.url().toLocalFile() == filename; + }); + if (data_it == data_.end()) { + qLog(Warning) << "Could not find song to filename: " << filename; + return; } // Update song data - data_[id].current_.set_title(new_metadata.title()); - data_[id].current_.set_artist(new_metadata.artist()); - data_[id].current_.set_album(new_metadata.album()); - data_[id].current_.set_track(new_metadata.track()); - data_[id].current_.set_year(new_metadata.year()); + data_it->current_.set_title(new_metadata.title()); + data_it->current_.set_artist(new_metadata.artist()); + data_it->current_.set_album(new_metadata.album()); + data_it->current_.set_track(new_metadata.track()); + data_it->current_.set_year(new_metadata.year()); // Is it currently being displayed in the UI? - if (ui_->song_list->currentRow() == id) { + if (ui_->song_list->currentRow() == std::distance(data_.begin(), data_it)) { // Yes! Additionally update UI const QModelIndexList sel = - ui_->song_list->selectionModel()->selectedIndexes(); + ui_->song_list->selectionModel()->selectedIndexes(); UpdateUI(sel); } }