From 4f53029a6e2ea34c65386eb9ee5c8b9032b46ed3 Mon Sep 17 00:00:00 2001 From: Martchus Date: Sun, 11 Mar 2018 18:58:20 +0100 Subject: [PATCH] Refactor MediaFileInfo::createAppropriateTags() --- application/settings.h | 14 +++----------- cli/mainfeatures.cpp | 41 +++++++++++++++++++++++++++++------------ gui/settingsdialog.cpp | 40 ++++++++++++++++++++-------------------- gui/tageditorwidget.cpp | 12 +++++------- gui/tagfieldedit.cpp | 8 ++++---- 5 files changed, 61 insertions(+), 54 deletions(-) diff --git a/application/settings.h b/application/settings.h index 2762223..7bb3a57 100644 --- a/application/settings.h +++ b/application/settings.h @@ -6,9 +6,10 @@ #include +#include #include +#include #include -#include #include @@ -77,15 +78,6 @@ struct FileBrowser bool readOnly = true; }; -struct Id3Processing -{ - TagParser::TagUsage v1Usage = TagParser::TagUsage::Always; - TagParser::TagUsage v2Usage = TagParser::TagUsage::Always; - byte v2Version = 3; - bool keepVersionOfExistingId3v2Tag = true; - bool mergeMultipleSuccessiveId3v2Tags = true; -}; - struct FileLayout { bool forceRewrite = true; @@ -103,7 +95,7 @@ struct TagProcessing TagParser::TagTextEncoding preferredEncoding = TagParser::TagTextEncoding::Utf8; UnsupportedFieldHandling unsupportedFieldHandling = UnsupportedFieldHandling::Ignore; bool autoTagManagement = true; - Id3Processing id3; + TagParser::TagCreationSettings creationSettings; FileLayout fileLayout; }; diff --git a/cli/mainfeatures.cpp b/cli/mainfeatures.cpp index 191adfd..f88ff20 100644 --- a/cli/mainfeatures.cpp +++ b/cli/mainfeatures.cpp @@ -389,12 +389,15 @@ void setTagInfo(const SetTagInfoArgs &args) cerr << Phrases::Warning << "No fields/attachments have been specified." << Phrases::End; } + TagCreationSettings settings; + settings.flags = TagCreationFlags::None; + // determine required targets - vector requiredTargets; for (const auto &fieldDenotation : fields) { const FieldScope &scope = fieldDenotation.first; - if (!scope.isTrack() && find(requiredTargets.cbegin(), requiredTargets.cend(), scope.tagTarget) == requiredTargets.cend()) { - requiredTargets.push_back(scope.tagTarget); + if (!scope.isTrack() + && find(settings.requiredTargets.cbegin(), settings.requiredTargets.cend(), scope.tagTarget) == settings.requiredTargets.cend()) { + settings.requiredTargets.push_back(scope.tagTarget); } } @@ -418,24 +421,40 @@ void setTagInfo(const SetTagInfoArgs &args) } // parse ID3v2 version - uint32 id3v2Version = 3; if (args.id3v2VersionArg.isPresent()) { try { - id3v2Version = stringToNumber(args.id3v2VersionArg.values().front()); - if (id3v2Version < 1 || id3v2Version > 4) { + settings.id3v2MajorVersion = stringToNumber(args.id3v2VersionArg.values().front()); + if (settings.id3v2MajorVersion < 1 || settings.id3v2MajorVersion > 4) { throw ConversionException(); } } catch (const ConversionException &) { - id3v2Version = 3; + settings.id3v2MajorVersion = 3; cerr << Phrases::Warning << "The specified ID3v2 version \"" << args.id3v2VersionArg.values().front() << "\" is invalid and will be ingored." << Phrases::End; } } + // parse flags + if (args.treatUnknownFilesAsMp3FilesArg.isPresent()) { + settings.flags |= TagCreationFlags::TreatUnknownFilesAsMp3Files; + } + if (args.id3InitOnCreateArg.isPresent()) { + settings.flags |= TagCreationFlags::Id3InitOnCreate; + } + if (args.id3TransferOnRemovalArg.isPresent()) { + settings.flags |= TagCreationFlags::Id3TransferValuesOnRemoval; + } + if (args.mergeMultipleSuccessiveTagsArg.isPresent()) { + settings.flags |= TagCreationFlags::MergeMultipleSuccessiveId3v2Tags; + } + if (!args.id3v2VersionArg.isPresent()) { + settings.flags |= TagCreationFlags::KeepExistingId3v2Version; + } + // parse other settings const TagTextEncoding denotedEncoding = parseEncodingDenotation(args.encodingArg, TagTextEncoding::Utf8); - const TagUsage id3v1Usage = parseUsageDenotation(args.id3v1UsageArg, TagUsage::KeepExisting); - const TagUsage id3v2Usage = parseUsageDenotation(args.id3v2UsageArg, TagUsage::Always); + settings.id3v1usage = parseUsageDenotation(args.id3v1UsageArg, TagUsage::KeepExisting); + settings.id3v2usage = parseUsageDenotation(args.id3v2UsageArg, TagUsage::Always); // setup media file info MediaFileInfo fileInfo; @@ -479,9 +498,7 @@ void setTagInfo(const SetTagInfoArgs &args) } // create new tags according to settings - fileInfo.createAppropriateTags(args.treatUnknownFilesAsMp3FilesArg.isPresent(), id3v1Usage, id3v2Usage, - args.id3InitOnCreateArg.isPresent(), args.id3TransferOnRemovalArg.isPresent(), args.mergeMultipleSuccessiveTagsArg.isPresent(), - !args.id3v2VersionArg.isPresent(), id3v2Version, requiredTargets); + fileInfo.createAppropriateTags(settings); auto container = fileInfo.container(); if (args.docTitleArg.isPresent() && !args.docTitleArg.values().empty()) { if (container && container->supportsTitle()) { diff --git a/gui/settingsdialog.cpp b/gui/settingsdialog.cpp index 1a170d6..097474a 100644 --- a/gui/settingsdialog.cpp +++ b/gui/settingsdialog.cpp @@ -396,13 +396,13 @@ Id3v1OptionPage::~Id3v1OptionPage() bool Id3v1OptionPage::apply() { if (hasBeenShown()) { - auto &settings = values().tagPocessing.id3; + auto &settings = values().tagPocessing.creationSettings; if (ui()->alwaysCreateRadioButton->isChecked()) { - settings.v1Usage = TagUsage::Always; + settings.id3v1usage = TagUsage::Always; } else if (ui()->keepExistingRadioButton->isChecked()) { - settings.v1Usage = TagUsage::KeepExisting; + settings.id3v1usage = TagUsage::KeepExisting; } else if (ui()->removeExistingRadioButton->isChecked()) { - settings.v1Usage = TagUsage::Never; + settings.id3v1usage = TagUsage::Never; } } return true; @@ -411,8 +411,8 @@ bool Id3v1OptionPage::apply() void Id3v1OptionPage::reset() { if (hasBeenShown()) { - const auto &settings = values().tagPocessing.id3; - switch (settings.v1Usage) { + const auto &settings = values().tagPocessing.creationSettings; + switch (settings.id3v1usage) { case TagUsage::Always: ui()->alwaysCreateRadioButton->setChecked(true); break; @@ -439,23 +439,23 @@ Id3v2OptionPage::~Id3v2OptionPage() bool Id3v2OptionPage::apply() { if (hasBeenShown()) { - auto &settings = values().tagPocessing.id3; + auto &settings = values().tagPocessing.creationSettings; if (ui()->alwaysCreateRadioButton->isChecked()) { - settings.v2Usage = TagUsage::Always; + settings.id3v2usage = TagUsage::Always; } else if (ui()->keepExistingRadioButton->isChecked()) { - settings.v2Usage = TagUsage::KeepExisting; + settings.id3v2usage = TagUsage::KeepExisting; } else if (ui()->removeExistingRadioButton->isChecked()) { - settings.v2Usage = TagUsage::Never; + settings.id3v2usage = TagUsage::Never; } if (ui()->version230radioButton->isChecked()) { - settings.v2Version = 3; + settings.id3v2MajorVersion = 3; } else if (ui()->version240radioButton->isChecked()) { - settings.v2Version = 4; + settings.id3v2MajorVersion = 4; } else if (ui()->version220radioButton->isChecked()) { - settings.v2Version = 2; + settings.id3v2MajorVersion = 2; } - settings.keepVersionOfExistingId3v2Tag = ui()->keepExistingVersionCheckBox->isChecked(); - settings.mergeMultipleSuccessiveId3v2Tags = ui()->mergeRadioButton->isChecked(); + settings.setFlag(TagCreationFlags::KeepExistingId3v2Version, ui()->keepExistingVersionCheckBox->isChecked()); + settings.setFlag(TagCreationFlags::MergeMultipleSuccessiveId3v2Tags, ui()->mergeRadioButton->isChecked()); } return true; } @@ -463,8 +463,8 @@ bool Id3v2OptionPage::apply() void Id3v2OptionPage::reset() { if (hasBeenShown()) { - const auto &settings = values().tagPocessing.id3; - switch (settings.v2Usage) { + const auto &settings = values().tagPocessing.creationSettings; + switch (settings.id3v2usage) { case TagUsage::Always: ui()->alwaysCreateRadioButton->setChecked(true); break; @@ -475,7 +475,7 @@ void Id3v2OptionPage::reset() ui()->removeExistingRadioButton->setChecked(true); break; } - switch (settings.v2Version) { + switch (settings.id3v2MajorVersion) { case 3: ui()->version230radioButton->setChecked(true); break; @@ -486,8 +486,8 @@ void Id3v2OptionPage::reset() ui()->version220radioButton->setChecked(true); break; } - ui()->keepExistingVersionCheckBox->setChecked(settings.keepVersionOfExistingId3v2Tag); - if (settings.mergeMultipleSuccessiveId3v2Tags) { + ui()->keepExistingVersionCheckBox->setChecked(settings.flags & TagCreationFlags::KeepExistingId3v2Version); + if (settings.flags & TagCreationFlags::MergeMultipleSuccessiveId3v2Tags) { ui()->mergeRadioButton->setChecked(true); } else { ui()->keepSeparateRadioButton->setChecked(true); diff --git a/gui/tageditorwidget.cpp b/gui/tageditorwidget.cpp index 7ce0ad0..c9948ca 100644 --- a/gui/tageditorwidget.cpp +++ b/gui/tageditorwidget.cpp @@ -870,7 +870,7 @@ void TagEditorWidget::showFile(char result) } // create appropriate tags according to file type and user preferences when automatic tag management is enabled - const auto &settings = Settings::values().tagPocessing; + auto &settings = Settings::values().tagPocessing; if (settings.autoTagManagement) { vector requiredTargets; requiredTargets.reserve(2); @@ -882,13 +882,11 @@ void TagEditorWidget::showFile(char result) } // TODO: allow initialization of new ID3 tag with values from already present ID3 tag // TODO: allow not to transfer values from removed ID3 tag to remaining ID3 tags - if (!m_fileInfo.createAppropriateTags(false, settings.id3.v1Usage, settings.id3.v2Usage, false, true, - settings.id3.mergeMultipleSuccessiveId3v2Tags, settings.id3.keepVersionOfExistingId3v2Tag, settings.id3.v2Version, - requiredTargets)) { + settings.creationSettings.flags -= TagCreationFlags::KeepExistingId3v2Version; + if (!m_fileInfo.createAppropriateTags(settings.creationSettings)) { if (confirmCreationOfId3TagForUnsupportedFile()) { - m_fileInfo.createAppropriateTags(true, settings.id3.v1Usage, settings.id3.v2Usage, false, true, - settings.id3.mergeMultipleSuccessiveId3v2Tags, settings.id3.keepVersionOfExistingId3v2Tag, settings.id3.v2Version, - requiredTargets); + settings.creationSettings.flags += TagCreationFlags::KeepExistingId3v2Version; + m_fileInfo.createAppropriateTags(settings.creationSettings); } } // tags might have been adjusted -> reload tags diff --git a/gui/tagfieldedit.cpp b/gui/tagfieldedit.cpp index a6df11c..321e5e6 100644 --- a/gui/tagfieldedit.cpp +++ b/gui/tagfieldedit.cpp @@ -177,7 +177,7 @@ bool TagFieldEdit::setValue(const TagValue &value, PreviousValueHandling previou */ bool TagFieldEdit::hasDescription() const { - for (Tag *tag : tags()) { + for (const Tag *tag : tags()) { if (tag->supportsDescription(m_field)) { return true; } @@ -190,15 +190,15 @@ bool TagFieldEdit::hasDescription() const */ bool TagFieldEdit::canApply(KnownField field) const { - for (Tag *tag : tags()) { + for (const Tag *tag : tags()) { switch (tag->type()) { case TagType::Id3v1Tag: - if (Settings::values().tagPocessing.id3.v1Usage == TagUsage::Never) { + if (Settings::values().tagPocessing.creationSettings.id3v1usage == TagUsage::Never) { continue; } break; case TagType::Id3v2Tag: - if (Settings::values().tagPocessing.id3.v2Usage == TagUsage::Never) { + if (Settings::values().tagPocessing.creationSettings.id3v2usage == TagUsage::Never) { continue; } break;