From d303e700ae5055b0c0b9a7617e20deaa764d90b7 Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Sat, 20 Jul 2024 01:55:53 +0200 Subject: [PATCH] CollectionFilter: Override mimedata function --- src/collection/collectionfilter.cpp | 65 ++++++++++++++++++++++++++++- src/collection/collectionfilter.h | 10 +++++ src/collection/collectionmodel.h | 4 +- 3 files changed, 76 insertions(+), 3 deletions(-) diff --git a/src/collection/collectionfilter.cpp b/src/collection/collectionfilter.cpp index d83194a3..9a238f58 100644 --- a/src/collection/collectionfilter.cpp +++ b/src/collection/collectionfilter.cpp @@ -19,12 +19,20 @@ #include "config.h" +#include +#include + +#include +#include #include +#include -#include "core/logging.h" - +#include "core/song.h" #include "filterparser/filterparser.h" #include "filterparser/filtertree.h" +#include "playlist/songmimedata.h" +#include "playlist/playlistmanager.h" +#include "collectionbackend.h" #include "collectionfilter.h" #include "collectionmodel.h" #include "collectionitem.h" @@ -73,3 +81,56 @@ void CollectionFilter::SetFilterString(const QString &filter_string) { setFilterFixedString(filter_string); } + +QMimeData *CollectionFilter::mimeData(const QModelIndexList &indexes) const { + + if (indexes.isEmpty()) return nullptr; + + CollectionModel *collection_model = qobject_cast(sourceModel()); + SongMimeData *data = new SongMimeData; + data->backend = collection_model->backend(); + + QSet song_ids; + QList urls; + for (const QModelIndex &idx : indexes) { + const QModelIndex source_index = mapToSource(idx); + CollectionItem *item = collection_model->IndexToItem(source_index); + GetChildSongs(item, song_ids, urls, data->songs); + } + + data->setUrls(urls); + data->name_for_new_playlist_ = PlaylistManager::GetNameForNewPlaylist(data->songs); + + return data; + +} + +void CollectionFilter::GetChildSongs(CollectionItem *item, QSet &song_ids, QList &urls, SongList &songs) const { + + CollectionModel *collection_model = qobject_cast(sourceModel()); + + switch (item->type) { + case CollectionItem::Type::Container:{ + QList children = item->children; + std::sort(children.begin(), children.end(), std::bind(&CollectionModel::CompareItems, collection_model, std::placeholders::_1, std::placeholders::_2)); + for (CollectionItem *child : children) { + GetChildSongs(child, song_ids, urls, songs); + } + break; + } + case CollectionItem::Type::Song:{ + const QModelIndex idx = collection_model->ItemToIndex(item); + if (filterAcceptsRow(idx.row(), idx.parent())) { + urls << item->metadata.url(); + if (!song_ids.contains(item->metadata.id())) { + song_ids.insert(item->metadata.id()); + songs << item->metadata; + } + } + break; + } + default: + break; + } + +} diff --git a/src/collection/collectionfilter.h b/src/collection/collectionfilter.h index bbe5f801..667345ff 100644 --- a/src/collection/collectionfilter.h +++ b/src/collection/collectionfilter.h @@ -24,9 +24,15 @@ #include #include +#include +#include +#include +#include "core/song.h" #include "filterparser/filtertree.h" +class CollectionItem; + class CollectionFilter : public QSortFilterProxyModel { Q_OBJECT @@ -38,6 +44,10 @@ class CollectionFilter : public QSortFilterProxyModel { protected: bool filterAcceptsRow(const int source_row, const QModelIndex &source_parent) const override; + QMimeData *mimeData(const QModelIndexList &indexes) const override; + + private: + void GetChildSongs(CollectionItem *item, QSet &song_ids, QList &urls, SongList &songs) const; private: mutable QScopedPointer filter_tree_; diff --git a/src/collection/collectionmodel.h b/src/collection/collectionmodel.h index 1dd51e73..fd5c1d21 100644 --- a/src/collection/collectionmodel.h +++ b/src/collection/collectionmodel.h @@ -142,6 +142,7 @@ class CollectionModel : public SimpleTreeModel { CollectionFilterOptions filter_options; }; + SharedPtr backend() const { return backend_; } CollectionFilter *filter() const { return filter_; } void Init(); @@ -200,6 +201,8 @@ class CollectionModel : public SimpleTreeModel { void ExpandAll(CollectionItem *item = nullptr) const; + bool CompareItems(const CollectionItem *a, const CollectionItem *b) const; + signals: void TotalSongCountUpdated(const int count); void TotalArtistCountUpdated(const int count); @@ -250,7 +253,6 @@ class CollectionModel : public SimpleTreeModel { static QUrl AlbumIconPixmapDiskCacheKey(const QString &cache_key); QVariant AlbumIcon(const QModelIndex &idx); void ClearItemPixmapCache(CollectionItem *item); - bool CompareItems(const CollectionItem *a, const CollectionItem *b) const; static qint64 MaximumCacheSize(Settings *s, const char *size_id, const char *size_unit_id, const qint64 cache_size_default); private slots: