diff --git a/src/collection/collectionmodel.cpp b/src/collection/collectionmodel.cpp index 63a92de05..cb53c2062 100644 --- a/src/collection/collectionmodel.cpp +++ b/src/collection/collectionmodel.cpp @@ -212,6 +212,7 @@ void CollectionModel::ReloadSettings() { const bool show_various_artists = settings.value(CollectionSettings::kVariousArtists, true).toBool(); const bool sort_skip_articles_for_artists = settings.value(CollectionSettings::kSkipArticlesForArtists, true).toBool(); const bool sort_skip_articles_for_albums = settings.value(CollectionSettings::kSkipArticlesForAlbums, false).toBool(); + const bool use_sort_tags = settings.value(CollectionSettings::kUseSortTags, true).toBool(); use_disk_cache_ = settings.value(CollectionSettings::kSettingsDiskCacheEnable, false).toBool(); QPixmapCache::setCacheLimit(static_cast(MaximumCacheSize(&settings, CollectionSettings::kSettingsCacheSize, CollectionSettings::kSettingsCacheSizeUnit, CollectionSettings::kSettingsCacheSizeDefault) / 1024)); @@ -227,12 +228,14 @@ void CollectionModel::ReloadSettings() { show_dividers != options_current_.show_dividers || show_various_artists != options_current_.show_various_artists || sort_skip_articles_for_artists != options_current_.sort_skip_articles_for_artists || - sort_skip_articles_for_albums != options_current_.sort_skip_articles_for_albums) { + sort_skip_articles_for_albums != options_current_.sort_skip_articles_for_albums || + use_sort_tags != options_current_.use_sort_tags) { options_current_.show_pretty_covers = show_pretty_covers; options_current_.show_dividers = show_dividers; options_current_.show_various_artists = show_various_artists; options_current_.sort_skip_articles_for_artists = sort_skip_articles_for_artists; options_current_.sort_skip_articles_for_albums = sort_skip_articles_for_albums; + options_current_.use_sort_tags = use_sort_tags; ScheduleReset(); } @@ -705,7 +708,7 @@ CollectionItem *CollectionModel::CreateContainerItem(const GroupBy group_by, con QString divider_key; if (options_active_.show_dividers && container_level == 0) { - divider_key = DividerKey(group_by, song, SortText(group_by, song, options_active_.sort_skip_articles_for_artists, options_active_.sort_skip_articles_for_albums)); + divider_key = DividerKey(group_by, song, SortText(group_by, song, options_active_.sort_skip_articles_for_artists, options_active_.sort_skip_articles_for_albums, options_active_.use_sort_tags)); if (!divider_key.isEmpty()) { if (!divider_nodes_.contains(divider_key)) { CreateDividerItem(divider_key, DividerDisplayText(group_by, divider_key), parent); @@ -719,7 +722,7 @@ CollectionItem *CollectionModel::CreateContainerItem(const GroupBy group_by, con item->container_level = container_level; item->container_key = container_key; item->display_text = DisplayText(group_by, song); - item->sort_text = SortText(group_by, song, options_active_.sort_skip_articles_for_artists, options_active_.sort_skip_articles_for_albums); + item->sort_text = SortText(group_by, song, options_active_.sort_skip_articles_for_artists, options_active_.sort_skip_articles_for_albums, options_active_.use_sort_tags); if (!divider_key.isEmpty()) { item->sort_text.prepend(divider_key + QLatin1Char(' ')); } @@ -1074,37 +1077,37 @@ QString CollectionModel::PrettyFormat(const Song &song) { } -QString CollectionModel::SortText(const GroupBy group_by, const Song &song, const bool sort_skip_articles_for_artists, const bool sort_skip_articles_for_albums) { +QString CollectionModel::SortText(const GroupBy group_by, const Song &song, const bool sort_skip_articles_for_artists, const bool sort_skip_articles_for_albums, const bool use_sort_tags) { switch (group_by) { case GroupBy::AlbumArtist: - return SortTextForName(song.effective_albumartistsort(), sort_skip_articles_for_artists); + return SortTextForName(use_sort_tags ? song.effective_albumartistsort() : song.effective_albumartist(), sort_skip_articles_for_artists); case GroupBy::Artist: - return SortTextForName(song.effective_artistsort(), sort_skip_articles_for_artists); + return SortTextForName(use_sort_tags ? song.effective_artistsort() : song.artist(), sort_skip_articles_for_artists); case GroupBy::Album: - return SortTextForName(song.effective_albumsort(), sort_skip_articles_for_albums); + return SortTextForName(use_sort_tags ? song.effective_albumsort() : song.album(), sort_skip_articles_for_albums); case GroupBy::AlbumDisc: - return SortTextForName(song.effective_albumsort(), sort_skip_articles_for_albums) + SortTextForNumber(std::max(0, song.disc())); + return SortTextForName(use_sort_tags ? song.effective_albumsort() : song.album(), sort_skip_articles_for_albums) + SortTextForNumber(std::max(0, song.disc())); case GroupBy::YearAlbum: - return SortTextForNumber(std::max(0, song.year())) + song.grouping() + SortTextForName(song.effective_albumsort(), sort_skip_articles_for_albums); + return SortTextForYear(song.year()) + song.grouping() + SortTextForName(use_sort_tags ? song.effective_albumsort() : song.album(), sort_skip_articles_for_albums); case GroupBy::YearAlbumDisc: - return SortTextForNumber(std::max(0, song.year())) + SortTextForName(song.effective_albumsort(), sort_skip_articles_for_albums) + SortTextForNumber(std::max(0, song.disc())); + return SortTextForYear(song.year()) + SortTextForName(use_sort_tags ? song.effective_albumsort() : song.album(), sort_skip_articles_for_albums) + SortTextForNumber(std::max(0, song.disc())); case GroupBy::OriginalYearAlbum: - return SortTextForNumber(std::max(0, song.effective_originalyear())) + song.grouping() + SortTextForName(song.effective_albumsort(), sort_skip_articles_for_albums); + return SortTextForYear(song.effective_originalyear()) + song.grouping() + SortTextForName(use_sort_tags ? song.effective_albumsort() : song.album(), sort_skip_articles_for_albums); case GroupBy::OriginalYearAlbumDisc: - return SortTextForNumber(std::max(0, song.effective_originalyear())) + SortTextForName(song.effective_albumsort(), sort_skip_articles_for_albums) + SortTextForNumber(std::max(0, song.disc())); + return SortTextForYear(song.effective_originalyear()) + SortTextForName(use_sort_tags ? song.effective_albumsort() : song.album(), sort_skip_articles_for_albums) + SortTextForNumber(std::max(0, song.disc())); case GroupBy::Disc: return SortTextForNumber(std::max(0, song.disc())); case GroupBy::Year: - return SortTextForNumber(std::max(0, song.year())) + QLatin1Char(' '); + return SortTextForYear(song.year()) + QLatin1Char(' '); case GroupBy::OriginalYear: - return SortTextForNumber(std::max(0, song.effective_originalyear())) + QLatin1Char(' '); + return SortTextForYear(song.effective_originalyear()) + QLatin1Char(' '); case GroupBy::Genre: return SortText(song.genre()); case GroupBy::Composer: - return SortTextForName(song.effective_composersort(), sort_skip_articles_for_artists); + return SortTextForName(use_sort_tags ? song.effective_composersort() : song.composer(), sort_skip_articles_for_artists); case GroupBy::Performer: - return SortTextForName(song.effective_performersort(), sort_skip_articles_for_artists); + return SortTextForName(use_sort_tags ? song.effective_performersort() : song.performer(), sort_skip_articles_for_artists); case GroupBy::Grouping: return SortText(song.grouping()); case GroupBy::FileType: @@ -1162,14 +1165,14 @@ QString CollectionModel::SortTextForSong(const Song &song) { QString CollectionModel::SortTextForYear(const int year) { - QString str = QString::number(year); + const QString str = QString::number(std::max(year, 0)); return QStringLiteral("0").repeated(qMax(0, 4 - str.length())) + str; } QString CollectionModel::SortTextForBitrate(const int bitrate) { - QString str = QString::number(bitrate); + const QString str = QString::number(bitrate); return QStringLiteral("0").repeated(qMax(0, 3 - str.length())) + str; } @@ -1206,39 +1209,50 @@ QString CollectionModel::ContainerKey(const GroupBy group_by, const Song &song, switch (group_by) { case GroupBy::AlbumArtist: key = TextOrUnknown(song.effective_albumartist()); + if (!song.effective_albumartistsort().isEmpty() && song.effective_albumartistsort() != song.effective_albumartist()) key.append(QLatin1Char('-') + TextOrUnknown(song.effective_albumartistsort())); has_unique_album_identifier = true; break; case GroupBy::Artist: key = TextOrUnknown(song.artist()); + if (!song.artistsort().isEmpty() && song.artistsort() != song.artist()) key.append(QLatin1Char('-') + TextOrUnknown(song.artistsort())); has_unique_album_identifier = true; break; case GroupBy::Album: key = TextOrUnknown(song.album()); + if (!song.albumsort().isEmpty() && song.albumsort() != song.album()) key.append(QLatin1Char('-') + TextOrUnknown(song.albumsort())); if (!song.album_id().isEmpty()) key.append(QLatin1Char('-') + song.album_id()); if (options_active_.separate_albums_by_grouping && !song.grouping().isEmpty()) key.append(QLatin1Char('-') + song.grouping()); break; case GroupBy::AlbumDisc: - key = PrettyAlbumDisc(song.album(), song.disc()); + key = TextOrUnknown(song.album()); + if (!song.albumsort().isEmpty() && song.albumsort() != song.album()) key.append(QLatin1Char('-') + TextOrUnknown(song.albumsort())); + key.append(QLatin1Char('-') + SortTextForNumber(song.disc())); if (!song.album_id().isEmpty()) key.append(QLatin1Char('-') + song.album_id()); if (options_active_.separate_albums_by_grouping && !song.grouping().isEmpty()) key.append(QLatin1Char('-') + song.grouping()); break; case GroupBy::YearAlbum: - key = PrettyYearAlbum(song.year(), song.album()); + key = SortTextForYear(song.year()) + QLatin1Char('-') + TextOrUnknown(song.album()); + if (!song.albumsort().isEmpty() && song.albumsort() != song.album()) key.append(QLatin1Char('-') + TextOrUnknown(song.albumsort())); if (!song.album_id().isEmpty()) key.append(QLatin1Char('-') + song.album_id()); if (options_active_.separate_albums_by_grouping && !song.grouping().isEmpty()) key.append(QLatin1Char('-') + song.grouping()); break; case GroupBy::YearAlbumDisc: - key = PrettyYearAlbumDisc(song.year(), song.album(), song.disc()); + key = SortTextForYear(song.year()) + QLatin1Char('-') + TextOrUnknown(song.album()); + if (!song.albumsort().isEmpty() && song.albumsort() != song.album()) key.append(QLatin1Char('-') + TextOrUnknown(song.albumsort())); + key.append(QLatin1Char('-') + SortTextForNumber(song.disc())); if (!song.album_id().isEmpty()) key.append(QLatin1Char('-') + song.album_id()); if (options_active_.separate_albums_by_grouping && !song.grouping().isEmpty()) key.append(QLatin1Char('-') + song.grouping()); break; case GroupBy::OriginalYearAlbum: - key = PrettyYearAlbum(song.effective_originalyear(), song.album()); + key = SortTextForYear(song.effective_originalyear()) + QLatin1Char('-') + TextOrUnknown(song.album()); + if (!song.albumsort().isEmpty() && song.albumsort() != song.album()) key.append(QLatin1Char('-') + TextOrUnknown(song.albumsort())); if (!song.album_id().isEmpty()) key.append(QLatin1Char('-') + song.album_id()); if (options_active_.separate_albums_by_grouping && !song.grouping().isEmpty()) key.append(QLatin1Char('-') + song.grouping()); break; case GroupBy::OriginalYearAlbumDisc: - key = PrettyYearAlbumDisc(song.effective_originalyear(), song.album(), song.disc()); + key = SortTextForYear(song.effective_originalyear()) + QLatin1Char('-') + TextOrUnknown(song.album()); + if (!song.albumsort().isEmpty() && song.albumsort() != song.album()) key.append(QLatin1Char('-') + TextOrUnknown(song.albumsort())); + key.append(QLatin1Char('-') + SortTextForNumber(song.disc())); if (!song.album_id().isEmpty()) key.append(QLatin1Char('-') + song.album_id()); if (options_active_.separate_albums_by_grouping && !song.grouping().isEmpty()) key.append(QLatin1Char('-') + song.grouping()); break; @@ -1246,20 +1260,22 @@ QString CollectionModel::ContainerKey(const GroupBy group_by, const Song &song, key = PrettyDisc(song.disc()); break; case GroupBy::Year: - key = QString::number(std::max(0, song.year())); + key = SortTextForYear(song.year()); break; case GroupBy::OriginalYear: - key = QString::number(std::max(0, song.effective_originalyear())); + key = SortTextForYear(song.effective_originalyear()); break; case GroupBy::Genre: key = TextOrUnknown(song.genre()); break; case GroupBy::Composer: key = TextOrUnknown(song.composer()); + if (!song.composersort().isEmpty() && song.composersort() != song.composer()) key.append(QLatin1Char('-') + song.composersort()); has_unique_album_identifier = true; break; case GroupBy::Performer: key = TextOrUnknown(song.performer()); + if (!song.performersort().isEmpty() && song.performersort() != song.performer()) key.append(QLatin1Char('-') + song.performersort()); has_unique_album_identifier = true; break; case GroupBy::Grouping: @@ -1341,7 +1357,7 @@ QString CollectionModel::DividerKey(const GroupBy group_by, const Song &song, co case GroupBy::Bitdepth: return SortTextForNumber(song.bitdepth()); case GroupBy::Bitrate: - return SortTextForNumber(song.bitrate()); + return SortTextForBitrate(song.bitrate()); case GroupBy::None: case GroupBy::GroupByCount: return QString(); diff --git a/src/collection/collectionmodel.h b/src/collection/collectionmodel.h index c1bcfa2ad..5657545ae 100644 --- a/src/collection/collectionmodel.h +++ b/src/collection/collectionmodel.h @@ -131,6 +131,7 @@ class CollectionModel : public SimpleTreeModel { show_various_artists(true), sort_skip_articles_for_artists(false), sort_skip_articles_for_albums(false), + use_sort_tags(true), separate_albums_by_grouping(false) {} Grouping group_by; @@ -139,6 +140,7 @@ class CollectionModel : public SimpleTreeModel { bool show_various_artists; bool sort_skip_articles_for_artists; bool sort_skip_articles_for_albums; + bool use_sort_tags; bool separate_albums_by_grouping; CollectionFilterOptions filter_options; }; @@ -178,14 +180,14 @@ class CollectionModel : public SimpleTreeModel { QMimeData *mimeData(const QModelIndexList &indexes) const override; // Utility functions for manipulating text - QString DisplayText(const GroupBy group_by, const Song &song); + static QString DisplayText(const GroupBy group_by, const Song &song); static QString TextOrUnknown(const QString &text); static QString PrettyYearAlbum(const int year, const QString &album); static QString PrettyAlbumDisc(const QString &album, const int disc); static QString PrettyYearAlbumDisc(const int year, const QString &album, const int disc); static QString PrettyDisc(const int disc); static QString PrettyFormat(const Song &song); - static QString SortText(const GroupBy group_by, const Song &song, const bool sort_skip_articles_for_artists, const bool sort_skip_articles_for_albums); + static QString SortText(const GroupBy group_by, const Song &song, const bool sort_skip_articles_for_artists, const bool sort_skip_articles_for_albums, const bool use_sort_tags); static QString SortText(QString text); static QString SortTextForName(const QString &name, const bool sort_skip_articles); static QString SortTextForNumber(const int number); diff --git a/src/constants/collectionsettings.h b/src/constants/collectionsettings.h index 23e502a7f..49ad2f698 100644 --- a/src/constants/collectionsettings.h +++ b/src/constants/collectionsettings.h @@ -37,7 +37,7 @@ constexpr char kPrettyCovers[] = "pretty_covers"; constexpr char kVariousArtists[] = "various_artists"; constexpr char kSkipArticlesForArtists[] = "skip_articles_for_artists"; constexpr char kSkipArticlesForAlbums[] = "skip_articles_for_albums"; -constexpr char kShowSortText[] = "show_sort_text"; +constexpr char kUseSortTags[] = "use_short_tags"; constexpr char kSettingsCacheSize[] = "cache_size"; constexpr char kSettingsCacheSizeUnit[] = "cache_size_unit"; constexpr char kSettingsDiskCacheEnable[] = "disk_cache_enable"; diff --git a/src/settings/collectionsettingspage.cpp b/src/settings/collectionsettingspage.cpp index fdb5720da..9be6daeaf 100644 --- a/src/settings/collectionsettingspage.cpp +++ b/src/settings/collectionsettingspage.cpp @@ -164,6 +164,7 @@ void CollectionSettingsPage::Load() { ui_->various_artists->setChecked(s.value(kVariousArtists, true).toBool()); ui_->checkbox_skip_articles_for_artists->setChecked(s.value(kSkipArticlesForArtists, true).toBool()); ui_->checkbox_skip_articles_for_albums->setChecked(s.value(kSkipArticlesForAlbums, false).toBool()); + ui_->checkbox_use_sort_tags->setChecked(s.value(kUseSortTags, true).toBool()); ui_->spinbox_cache_size->setValue(s.value(kSettingsCacheSize, kSettingsCacheSizeDefault).toInt()); ui_->combobox_cache_size->setCurrentIndex(ui_->combobox_cache_size->findData(s.value(kSettingsCacheSizeUnit, static_cast(CacheSizeUnit::MB)).toInt())); @@ -211,6 +212,7 @@ void CollectionSettingsPage::Save() { s.setValue(kVariousArtists, ui_->various_artists->isChecked()); s.setValue(kSkipArticlesForArtists, ui_->checkbox_skip_articles_for_artists->isChecked()); s.setValue(kSkipArticlesForAlbums, ui_->checkbox_skip_articles_for_albums->isChecked()); + s.setValue(kUseSortTags, ui_->checkbox_use_sort_tags->isChecked()); s.setValue(kSettingsCacheSize, ui_->spinbox_cache_size->value()); s.setValue(kSettingsCacheSizeUnit, ui_->combobox_cache_size->currentData().toInt()); diff --git a/src/settings/collectionsettingspage.ui b/src/settings/collectionsettingspage.ui index 6a7e689fd..01c576263 100644 --- a/src/settings/collectionsettingspage.ui +++ b/src/settings/collectionsettingspage.ui @@ -249,6 +249,13 @@ If there are no matches then it will use the largest image in the directory. + + + + Use sort tags for sorting when available + + +