From c43a06c04ef89f9e3bd72a2c1b2b07655a94097d Mon Sep 17 00:00:00 2001 From: David Sansome Date: Wed, 24 Nov 2010 19:25:41 +0000 Subject: [PATCH] Support drag&drop of icecast streams to the playlist --- src/playlist/playlist.cpp | 4 ++-- src/radio/icecastbackend.cpp | 11 ++++++++++ src/radio/icecastbackend.h | 4 ++++ src/radio/icecastitem.h | 3 +++ src/radio/icecastmodel.cpp | 40 +++++++++++++++++++++++++++++++++++- src/radio/icecastmodel.h | 3 +-- 6 files changed, 60 insertions(+), 5 deletions(-) diff --git a/src/playlist/playlist.cpp b/src/playlist/playlist.cpp index de976e67a..8e30d5d32 100644 --- a/src/playlist/playlist.cpp +++ b/src/playlist/playlist.cpp @@ -575,9 +575,9 @@ bool Playlist::dropMimeData(const QMimeData* data, Qt::DropAction action, int ro // Dragged from a library // We want to check if these songs are from the actual local file backend, // if they are we treat them differently. - if (song_data->backend->songs_table() == Library::kSongsTable) + if (song_data->backend && song_data->backend->songs_table() == Library::kSongsTable) InsertLibraryItems(song_data->songs, row); - else if (song_data->backend->songs_table() == MagnatuneService::kSongsTable) + else if (song_data->backend && song_data->backend->songs_table() == MagnatuneService::kSongsTable) InsertMagnatuneItems(song_data->songs, row); else InsertSongs(song_data->songs, row); diff --git a/src/radio/icecastbackend.cpp b/src/radio/icecastbackend.cpp index 5872d80b0..029e4b820 100644 --- a/src/radio/icecastbackend.cpp +++ b/src/radio/icecastbackend.cpp @@ -172,3 +172,14 @@ void IcecastBackend::ClearAndAddStations(const StationList& stations) { emit DatabaseReset(); } + +Song IcecastBackend::Station::ToSong() const { + Song ret; + ret.set_valid(true); + ret.set_title(name); + ret.set_filename(url.toEncoded()); + ret.set_bitrate(bitrate); + ret.set_samplerate(samplerate); + ret.set_genre(genre); + return ret; +} diff --git a/src/radio/icecastbackend.h b/src/radio/icecastbackend.h index 7d1ef28d8..80c13358d 100644 --- a/src/radio/icecastbackend.h +++ b/src/radio/icecastbackend.h @@ -18,6 +18,8 @@ #ifndef ICECASTBACKEND_H #define ICECASTBACKEND_H +#include "core/song.h" + #include #include @@ -48,6 +50,8 @@ public: int channels; int samplerate; QString genre; + + Song ToSong() const; }; typedef QList StationList; diff --git a/src/radio/icecastitem.h b/src/radio/icecastitem.h index f24f7318e..80612bec0 100644 --- a/src/radio/icecastitem.h +++ b/src/radio/icecastitem.h @@ -18,6 +18,7 @@ #ifndef ICECASTITEM_H #define ICECASTITEM_H +#include "icecastbackend.h" #include "core/simpletreeitem.h" class IcecastItem : public SimpleTreeItem { @@ -32,6 +33,8 @@ public: : SimpleTreeItem(Type_Root, model) {} IcecastItem(Type type, IcecastItem* parent = NULL) : SimpleTreeItem(type, parent) {} + + IcecastBackend::Station station; }; #endif // ICECASTITEM_H diff --git a/src/radio/icecastmodel.cpp b/src/radio/icecastmodel.cpp index db31e64d4..8b37b0369 100644 --- a/src/radio/icecastmodel.cpp +++ b/src/radio/icecastmodel.cpp @@ -17,7 +17,7 @@ #include "icecastbackend.h" #include "icecastmodel.h" - +#include "playlist/songmimedata.h" IcecastModel::IcecastModel(IcecastBackend* backend, QObject* parent) : SimpleTreeModel(new IcecastItem(this), parent), backend_(backend), @@ -84,6 +84,7 @@ void IcecastModel::PopulateGenre(IcecastItem* parent, const QString& genre) { IcecastBackend::StationList stations = backend_->GetStations(filter_, genre); foreach (const IcecastBackend::Station& station, stations) { IcecastItem* item = new IcecastItem(IcecastItem::Type_Station, parent); + item->station = station; item->display_text = station.name; item->sort_text = station.name; item->key = station.url.toString(); @@ -128,3 +129,40 @@ void IcecastModel::SetSortMode(SortMode mode) { sort_mode_ = mode; Reset(); } + +Qt::ItemFlags IcecastModel::flags(const QModelIndex& index) const { + switch (IndexToItem(index)->type) { + case IcecastItem::Type_Station: + return Qt::ItemIsSelectable | + Qt::ItemIsEnabled | + Qt::ItemIsDragEnabled; + case IcecastItem::Type_Genre: + case IcecastItem::Type_Root: + default: + return Qt::ItemIsEnabled; + } +} + +QStringList IcecastModel::mimeTypes() const { + return QStringList() << "text/uri-list"; +} + +QMimeData* IcecastModel::mimeData(const QModelIndexList& indexes) const { + if (indexes.isEmpty()) + return NULL; + + SongMimeData* data = new SongMimeData; + QList urls; + + foreach (const QModelIndex& index, indexes) { + IcecastItem* item = IndexToItem(index); + if (!item) + continue; + + data->songs << item->station.ToSong(); + urls << item->station.url; + } + + data->setUrls(urls); + return data; +} diff --git a/src/radio/icecastmodel.h b/src/radio/icecastmodel.h index f86f9072d..c862118e6 100644 --- a/src/radio/icecastmodel.h +++ b/src/radio/icecastmodel.h @@ -43,10 +43,9 @@ public: // QAbstractItemModel QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const; - /*Qt::ItemFlags flags(const QModelIndex& index) const; + Qt::ItemFlags flags(const QModelIndex& index) const; QStringList mimeTypes() const; QMimeData* mimeData(const QModelIndexList& indexes) const; - bool canFetchMore(const QModelIndex &parent) const;*/ public slots: void Init();