1
0
mirror of https://github.com/strawberrymusicplayer/strawberry synced 2024-12-14 18:03:44 +01:00

Fix broken context albums

This commit is contained in:
Jonas Kvinge 2021-07-04 17:34:42 +02:00
parent 1a643bfa8c
commit 3d06d68196
2 changed files with 26 additions and 22 deletions

View File

@ -197,6 +197,8 @@ class CollectionModel : public SimpleTreeModel<CollectionItem> {
const CollectionModel::Grouping GetGroupBy() const { return group_by_; }
void SetGroupBy(const CollectionModel::Grouping g);
static QString ContainerKey(const GroupBy type, const Song &song);
signals:
void TotalSongCountUpdated(int count);
void TotalArtistCountUpdated(int count);
@ -259,9 +261,8 @@ class CollectionModel : public SimpleTreeModel<CollectionItem> {
CollectionItem *InitItem(const GroupBy type, const bool signal, CollectionItem *parent, const int container_level);
void FinishItem(const GroupBy type, const bool signal, const bool create_divider, CollectionItem *parent, CollectionItem *item);
static QString ContainerKey(const GroupBy type, const Song &song) ;
static QString DividerKey(const GroupBy type, CollectionItem *item) ;
static QString DividerDisplayText(const GroupBy type, const QString &key) ;
static QString DividerKey(const GroupBy type, CollectionItem *item);
static QString DividerDisplayText(const GroupBy type, const QString &key);
// Helpers
static bool IsCompilationArtistNode(const CollectionItem *node) { return node == node->parent->compilation_artist_node_; }

View File

@ -84,20 +84,12 @@ void ContextAlbumsModel::AddSongs(const SongList &songs) {
for (const Song &song : songs) {
if (song_nodes_.contains(song.id())) continue;
// Before we can add each song we need to make sure the required container items already exist in the tree.
// Find parent containers in the tree
CollectionItem *container = root_;
// Does it exist already?
if (!container_nodes_.contains(song.album())) {
// Create the container
container_nodes_[song.album()] = ItemFromSong(CollectionItem::Type_Container, true, container, song, 0);
QString key = CollectionModel::ContainerKey(CollectionModel::GroupBy_Album, song);
if (!container_nodes_.contains(key)) {
container_nodes_.insert(key, ItemFromSong(CollectionItem::Type_Container, true, container, song, 0));
}
container = container_nodes_[song.album()];
// We've gone all the way down to the deepest level and everything was already lazy loaded, so now we have to create the song in the container.
container = container_nodes_[key];
song_nodes_[song.id()] = ItemFromSong(CollectionItem::Type_Song, true, container, song, -1);
}
@ -137,7 +129,7 @@ QVariant ContextAlbumsModel::AlbumIcon(const QModelIndex &idx) {
SongList songs = GetChildSongs(idx);
if (!songs.isEmpty()) {
const quint64 id = app_->album_cover_loader()->LoadImageAsync(cover_loader_options_, songs.first());
pending_art_[id] = ItemAndCacheKey(item, cache_key);
pending_art_.insert(id, ItemAndCacheKey(item, cache_key));
pending_cache_keys_.insert(cache_key);
}
@ -155,7 +147,9 @@ void ContextAlbumsModel::AlbumCoverLoaded(const quint64 id, const AlbumCoverLoad
if (!item) return;
const QString &cache_key = item_and_cache_key.second;
if (pending_cache_keys_.contains(cache_key)) {
pending_cache_keys_.remove(cache_key);
}
// Insert this image in the cache.
if (!result.success || result.image_scaled.isNull() || result.type == AlbumCoverLoaderResult::Type_ManuallyUnset) {
@ -272,9 +266,17 @@ CollectionItem *ContextAlbumsModel::ItemFromSong(CollectionItem::Type item_type,
item->container_level = container_level;
item->lazy_loaded = true;
if (item->key.isEmpty()) item->key = s.album();
item->display_text = CollectionModel::TextOrUnknown(item->key);
item->sort_text = CollectionModel::SortTextForArtist(item->key);
if (item_type == CollectionItem::Type_Container) {
item->key = CollectionModel::ContainerKey(CollectionModel::GroupBy_Album, s);
item->display_text = CollectionModel::TextOrUnknown(s.album());
item->sort_text = CollectionModel::SortTextForArtist(s.album());
}
else {
item->key = s.album() + " " + s.title();
item->display_text = CollectionModel::TextOrUnknown(s.title());
item->sort_text = CollectionModel::SortTextForSong(s);
item->metadata = s;
}
if (signal) endInsertRows();
@ -339,13 +341,14 @@ bool ContextAlbumsModel::CompareItems(const CollectionItem *a, const CollectionI
void ContextAlbumsModel::GetChildSongs(CollectionItem *item, QList<QUrl> *urls, SongList *songs, QSet<int> *song_ids) const {
switch (item->type) {
case CollectionItem::Type_Container: {
case CollectionItem::Type_Container:{
QList<CollectionItem*> children = item->children;
std::sort(children.begin(), children.end(), std::bind(&ContextAlbumsModel::CompareItems, this, std::placeholders::_1, std::placeholders::_2));
for (CollectionItem *child : children)
for (CollectionItem *child : children) {
GetChildSongs(child, urls, songs, song_ids);
}
break;
}