From 7315302a881ebbb338a0562042aa6646ed3a064a Mon Sep 17 00:00:00 2001 From: Martchus Date: Sat, 5 Mar 2016 16:50:23 +0100 Subject: [PATCH] few more improvements for MusicBrainz search --- CMakeLists.txt | 1 + application/settings.cpp | 8 +++++++ application/settings.h | 1 + dbquery/api.md | 7 ++++++ dbquery/dbquery.cpp | 8 +++++-- gui/dbquerywidget.cpp | 7 ++++-- gui/dbquerywidget.ui | 33 +++++++++++++++++++++++++++- gui/editordbqueryoptionpage.ui | 40 ++++++++++++++++++++++++++++++++++ gui/settingsdialog.cpp | 29 +++++++++++++++++++++++- gui/settingsdialog.h | 17 +++++++++++++++ gui/tageditorwidget.ui | 22 +++++++++++++++++-- gui/tagfieldedit.cpp | 1 + tageditor.pro | 1 + 13 files changed, 167 insertions(+), 8 deletions(-) create mode 100644 gui/editordbqueryoptionpage.ui diff --git a/CMakeLists.txt b/CMakeLists.txt index 603bebb..b9db710 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -107,6 +107,7 @@ set(WIDGETS_UI_FILES gui/editorautocorrectionoptionpage.ui gui/picturepreviewselection.ui gui/editorfieldsoptionpage.ui + gui/editordbqueryoptionpage.ui gui/infooptionpage.ui gui/entertargetdialog.ui gui/attachmentsedit.ui diff --git a/application/settings.cpp b/application/settings.cpp index 55ef3fe..6da68d9 100644 --- a/application/settings.cpp +++ b/application/settings.cpp @@ -240,6 +240,12 @@ KnownFieldModel &dbQueryFields() return v; } +QString &musicBrainzUrl() +{ + static QString v; + return v; +} + // renaming files dialog int &scriptSource() { @@ -388,6 +394,7 @@ void restore() dbQueryWidgetShown() = settings.value(QStringLiteral("visible"), false).toBool(); dbQueryOverride() = settings.value(QStringLiteral("override"), true).toBool(); dbQueryFields().restore(settings, QStringLiteral("fields")); + musicBrainzUrl() = settings.value(QStringLiteral("musicbrainzurl")).toString(); settings.endGroup(); settings.beginGroup(QStringLiteral("renamedlg")); @@ -463,6 +470,7 @@ void save() settings.setValue(QStringLiteral("visible"), dbQueryWidgetShown()); settings.setValue(QStringLiteral("override"), dbQueryOverride()); dbQueryFields().save(settings, QStringLiteral("fields")); + settings.setValue(QStringLiteral("musicbrainzurl"), musicBrainzUrl()); settings.endGroup(); settings.beginGroup(QStringLiteral("renamedlg")); diff --git a/application/settings.h b/application/settings.h index 26d6b88..a0d4efa 100644 --- a/application/settings.h +++ b/application/settings.h @@ -95,6 +95,7 @@ QString &mainWindowCurrentFileBrowserDirectory(); bool &dbQueryWidgetShown(); bool &dbQueryOverride(); KnownFieldModel &dbQueryFields(); +QString &musicBrainzUrl(); // rename files dialog int &scriptSource(); diff --git a/dbquery/api.md b/dbquery/api.md index 1ffd913..055886c 100644 --- a/dbquery/api.md +++ b/dbquery/api.md @@ -18,6 +18,13 @@ Available at ```http://musicbrainz.org/ws/2``` ``` /recording?query="$song_name" AND artist:"$artist_name" AND release:"$release_name" ``` +* album by name + ``` + /release?query="$album_name" + ``` +* cover art: TODO +* lyrics: TODO + ## Misc * enable JSON response: ```&fmt=json``` diff --git a/dbquery/dbquery.cpp b/dbquery/dbquery.cpp index 10e3632..e15a536 100644 --- a/dbquery/dbquery.cpp +++ b/dbquery/dbquery.cpp @@ -2,6 +2,7 @@ #include "../misc/utility.h" #include "../misc/networkaccessmanager.h" +#include "../application/settings.h" #include #include @@ -309,7 +310,7 @@ void MusicBrainzResultsModel::parseResults() QueryResultsModel *queryMusicBrainz(const SongDescription &songDescription) { - static QString musicBrainzUrl(QStringLiteral("https://musicbrainz.org/ws/2/recording")); + static QString defaultMusicBrainzUrl(QStringLiteral("https://musicbrainz.org/ws/2/recording")); // TODO: make this configurable // compose parts @@ -324,9 +325,12 @@ QueryResultsModel *queryMusicBrainz(const SongDescription &songDescription) if(!songDescription.album.isEmpty()) { parts << QStringLiteral("release:\"") % songDescription.album % QChar('\"'); } + if(songDescription.track) { + parts << QStringLiteral("number:") + QString::number(songDescription.track); + } // compose URL - QUrl url(musicBrainzUrl); + QUrl url(Settings::musicBrainzUrl().isEmpty() ? defaultMusicBrainzUrl : (Settings::musicBrainzUrl() + QStringLiteral("/recording"))); QUrlQuery query; query.addQueryItem(QStringLiteral("query"), parts.join(QStringLiteral(" AND "))); url.setQuery(query); diff --git a/gui/dbquerywidget.cpp b/gui/dbquerywidget.cpp index 0334053..33ead19 100644 --- a/gui/dbquerywidget.cpp +++ b/gui/dbquerywidget.cpp @@ -35,6 +35,8 @@ DbQueryWidget::DbQueryWidget(TagEditorWidget *tagEditorWidget, QWidget *parent) m_ui->setupUi(this); #ifdef Q_OS_WIN32 setStyleSheet(dialogStyle()); +#else + setStyleSheet(QStringLiteral("QGroupBox { color: palette(text); background-color: palette(base); }")); #endif m_ui->notificationLabel->setText(tr("Search hasn't been started.")); @@ -100,7 +102,8 @@ void DbQueryWidget::insertSearchTermsFromTagEdit(TagEdit *tagEdit) void DbQueryWidget::startSearch() { // check whether enought search terms are supplied - if(m_ui->titleLineEdit->text().isEmpty() && (!m_ui->trackSpinBox->value() || m_ui->albumLineEdit->text().isEmpty() || m_ui->artistLineEdit->text().isEmpty())) { + if((m_ui->titleLineEdit->text().isEmpty() && !m_ui->trackSpinBox->value() && (m_ui->albumLineEdit->text().isEmpty() || m_ui->artistLineEdit->text().isEmpty())) + || (m_ui->albumLineEdit->text().isEmpty() && m_ui->artistLineEdit->text().isEmpty() && m_ui->titleLineEdit->text().isEmpty())) { m_ui->notificationLabel->setNotificationType(NotificationType::Critical); m_ui->notificationLabel->setText(tr("Insufficient search criteria supplied")); return; @@ -162,7 +165,7 @@ void DbQueryWidget::showResults() if(m_model->results().isEmpty()) { m_ui->applyPushButton->setEnabled(false); } else { - m_ui->resultsTreeView->selectionModel()->setCurrentIndex(m_model->index(0, 0), QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Columns); + m_ui->resultsTreeView->selectionModel()->setCurrentIndex(m_model->index(0, 0), QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); m_ui->applyPushButton->setEnabled(m_tagEditorWidget->activeTagEdit()); } setStatus(true); diff --git a/gui/dbquerywidget.ui b/gui/dbquerywidget.ui index ed9a3e7..eb8ccb5 100644 --- a/gui/dbquerywidget.ui +++ b/gui/dbquerywidget.ui @@ -133,8 +133,33 @@ Qt::Vertical - + + + + 0 + 0 + + + + + + 0 + 0 + + + + + 0 + 20 + + + + + 16777215 + 125 + + Fields to be used @@ -156,6 +181,12 @@ + + + 0 + 0 + + QListView::Free diff --git a/gui/editordbqueryoptionpage.ui b/gui/editordbqueryoptionpage.ui new file mode 100644 index 0000000..f3a07a8 --- /dev/null +++ b/gui/editordbqueryoptionpage.ui @@ -0,0 +1,40 @@ + + + QtGui::EditorDbQueryOptionsPage + + + General options page + + + QGroupBox { font-weight: bold }; + + + + + + MusicBrainz URL + + + + + + + https://musicbrainz.org/ws/2 + + + + + + + + Widgets::ClearLineEdit + QLineEdit +
qtutilities/widgets/clearlineedit.h
+
+
+ + + + + +
diff --git a/gui/settingsdialog.cpp b/gui/settingsdialog.cpp index 73136ac..5ca3b52 100644 --- a/gui/settingsdialog.cpp +++ b/gui/settingsdialog.cpp @@ -247,6 +247,33 @@ QWidget *EditorAutoCorrectionOptionPage::setupWidget() return w; } +// EditorDbQueryOptionsPage +EditorDbQueryOptionsPage::EditorDbQueryOptionsPage() +{} + +EditorDbQueryOptionsPage::~EditorDbQueryOptionsPage() +{} + +QString EditorDbQueryOptionsPage::displayName() const +{ + return QApplication::translate("QtGui::EditorDbQueryOptionsPage", "Database queries"); +} + +bool EditorDbQueryOptionsPage::apply() +{ + if(hasBeenShown()) { + Settings::musicBrainzUrl() = ui()->musicBrainzUrlLineEdit->text(); + } + return true; +} + +void EditorDbQueryOptionsPage::reset() +{ + if(hasBeenShown()) { + ui()->musicBrainzUrlLineEdit->setText(Settings::musicBrainzUrl()); + } +} + // InfoOptionPage InfoOptionPage::InfoOptionPage() {} @@ -568,7 +595,7 @@ SettingsDialog::SettingsDialog(QWidget *parent) : category->setIcon(QIcon::fromTheme(QStringLiteral("document-edit"), QIcon(QStringLiteral(":/tageditor/icons/hicolor/32x32/settingscategories/key-enter.png")))); category->assignPages(QList() << new EditorGeneralOptionPage << new EditorTempOptionPage(this) << new EditorFieldsOptionPage - << new InfoOptionPage << new EditorAutoCorrectionOptionPage); + << new InfoOptionPage << new EditorAutoCorrectionOptionPage << new EditorDbQueryOptionsPage); categories << category; category = new Dialogs::OptionCategory(this); diff --git a/gui/settingsdialog.h b/gui/settingsdialog.h index ad20c48..cc85c8d 100644 --- a/gui/settingsdialog.h +++ b/gui/settingsdialog.h @@ -6,6 +6,7 @@ #include "ui_editortempoptionpage.h" #include "ui_editorfieldsoptionpage.h" #include "ui_editorautocorrectionoptionpage.h" +#include "ui_editordbqueryoptionpage.h" #include "ui_infooptionpage.h" #include "ui_tagprocessinggeneraloptionpage.h" #include "ui_id3v1optionpage.h" @@ -115,6 +116,22 @@ private: Settings::KnownFieldModel *m_model; }; +// EditorDbQueryOptionPage +namespace Ui { +class EditorDbQueryOptionsPage; +} + +class EditorDbQueryOptionsPage : public Dialogs::UiFileBasedOptionPage +{ +public: + explicit EditorDbQueryOptionsPage(); + ~EditorDbQueryOptionsPage(); + + QString displayName() const; + bool apply(); + void reset(); +}; + // EditorInfoOptionPage namespace Ui { class InfoOptionPage; diff --git a/gui/tageditorwidget.ui b/gui/tageditorwidget.ui index 12ae9c9..bdc5721 100644 --- a/gui/tageditorwidget.ui +++ b/gui/tageditorwidget.ui @@ -76,7 +76,7 @@ - + 0 0 @@ -85,6 +85,12 @@ + + + 0 + 0 + + Let you choose whether the values of the previously opened file should be cleared when @@ -100,7 +106,7 @@ tagging multiple files of the same album. - + 0 0 @@ -119,6 +125,12 @@ You can also create or remove tags manually. + + + 0 + 0 + + Restores the original values read from the file reverting all unsaved changings. @@ -140,6 +152,12 @@ the file reverting all unsaved changings. + + + 0 + 0 + + Clears all values. diff --git a/gui/tagfieldedit.cpp b/gui/tagfieldedit.cpp index ceec6b2..e5e62e6 100644 --- a/gui/tagfieldedit.cpp +++ b/gui/tagfieldedit.cpp @@ -522,6 +522,7 @@ ClearComboBox *TagFieldEdit::setupGenreComboBox() m_comboBox->setClearButtonEnabled(true); m_comboBox->insertCustomButton(0, setupRestoreButton()); m_comboBox->installEventFilter(this); + m_comboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); connect(m_comboBox, &ClearComboBox::currentTextChanged, this, &TagFieldEdit::showRestoreButton); m_layout->addWidget(m_comboBox); diff --git a/tageditor.pro b/tageditor.pro index 5a81c32..949f073 100644 --- a/tageditor.pro +++ b/tageditor.pro @@ -109,6 +109,7 @@ FORMS += \ gui/editorautocorrectionoptionpage.ui \ gui/picturepreviewselection.ui \ gui/editorfieldsoptionpage.ui \ + gui/editordbqueryoptionpage.ui \ gui/infooptionpage.ui \ gui/entertargetdialog.ui \ gui/attachmentsedit.ui \