Clementine-audio-player-Mac.../src/radio/radiomodel.cpp

159 lines
4.6 KiB
C++
Raw Normal View History

/* This file is part of Clementine.
Copyright 2010, David Sansome <me@davidsansome.com>
Clementine is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Clementine is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Clementine. If not, see <http://www.gnu.org/licenses/>.
*/
2010-11-23 18:38:39 +01:00
#include "core/mergedproxymodel.h"
#include "icecastservice.h"
2010-11-23 18:38:39 +01:00
#include "jamendoservice.h"
#include "lastfmservice.h"
2010-11-23 18:38:39 +01:00
#include "magnatuneservice.h"
2009-12-26 22:35:45 +01:00
#include "radiomimedata.h"
2010-11-23 18:38:39 +01:00
#include "radiomodel.h"
#include "radioservice.h"
#include "savedradio.h"
2010-11-23 18:38:39 +01:00
#include "somafmservice.h"
2009-12-26 22:35:45 +01:00
#include <QMimeData>
#include <QtDebug>
QMap<QString, RadioService*> RadioModel::sServices;
RadioModel::RadioModel(BackgroundThread<Database>* db_thread,
TaskManager* task_manager, QObject* parent)
: SimpleTreeModel<RadioItem>(new RadioItem(this), parent),
db_thread_(db_thread),
merged_model_(new MergedProxyModel(this)),
2010-08-27 17:42:58 +02:00
task_manager_(task_manager)
{
2009-12-26 22:35:45 +01:00
Q_ASSERT(sServices.isEmpty());
root_->lazy_loaded = true;
merged_model_->setSourceModel(this);
2009-12-26 22:35:45 +01:00
AddService(new LastFMService(this));
2010-01-18 03:23:55 +01:00
AddService(new SomaFMService(this));
AddService(new MagnatuneService(this));
2010-11-23 18:38:39 +01:00
AddService(new JamendoService(this));
AddService(new IcecastService(this));
AddService(new SavedRadio(this));
2009-12-26 22:35:45 +01:00
}
void RadioModel::AddService(RadioService *service) {
sServices[service->name()] = service;
service->CreateRootItem(root_);
connect(service, SIGNAL(AsyncLoadFinished(PlaylistItem::SpecialLoadResult)), SIGNAL(AsyncLoadFinished(PlaylistItem::SpecialLoadResult)));
2009-12-26 22:35:45 +01:00
connect(service, SIGNAL(StreamError(QString)), SIGNAL(StreamError(QString)));
2009-12-26 23:15:57 +01:00
connect(service, SIGNAL(StreamMetadataFound(QUrl,Song)), SIGNAL(StreamMetadataFound(QUrl,Song)));
2010-08-27 17:42:58 +02:00
connect(service, SIGNAL(OpenSettingsAtPage(SettingsDialog::Page)), SIGNAL(OpenSettingsAtPage(SettingsDialog::Page)));
2009-12-30 02:41:37 +01:00
connect(service, SIGNAL(AddItemToPlaylist(RadioItem*)), SIGNAL(AddItemToPlaylist(RadioItem*)));
connect(service, SIGNAL(AddItemsToPlaylist(PlaylistItemList)), SIGNAL(AddItemsToPlaylist(PlaylistItemList)));
2009-12-26 22:35:45 +01:00
}
RadioService* RadioModel::ServiceByName(const QString& name) {
if (sServices.contains(name))
return sServices[name];
return NULL;
}
QVariant RadioModel::data(const QModelIndex& index, int role) const {
const RadioItem* item = IndexToItem(index);
return data(item, role);
}
QVariant RadioModel::data(const RadioItem* item, int role) const {
switch (role) {
case Qt::DisplayRole:
return item->DisplayText();
case Qt::DecorationRole:
return item->icon;
break;
case Role_Type:
return item->type;
case Role_Key:
return item->key;
case Role_SortText:
return item->SortText();
}
return QVariant();
}
void RadioModel::LazyPopulate(RadioItem* parent) {
if (parent->service)
parent->service->LazyPopulate(parent);
}
2009-12-26 22:35:45 +01:00
Qt::ItemFlags RadioModel::flags(const QModelIndex& index) const {
RadioItem* item = IndexToItem(index);
if (item->playable)
return Qt::ItemIsSelectable |
Qt::ItemIsEnabled |
Qt::ItemIsDragEnabled;
return Qt::ItemIsSelectable |
Qt::ItemIsEnabled;
}
QStringList RadioModel::mimeTypes() const {
return QStringList() << "text/uri-list";
}
QMimeData* RadioModel::mimeData(const QModelIndexList& indexes) const {
QList<QUrl> urls;
2009-12-30 00:17:54 +01:00
QList<RadioItem*> items;
2009-12-26 22:35:45 +01:00
foreach (const QModelIndex& index, indexes) {
RadioItem* item = IndexToItem(index);
if (!item || !item->service || !item->playable)
continue;
2009-12-30 00:17:54 +01:00
items << item;
urls << item->service->UrlForItem(item);
2009-12-26 22:35:45 +01:00
}
if (urls.isEmpty())
return NULL;
RadioMimeData* data = new RadioMimeData;
data->setUrls(urls);
2009-12-30 00:17:54 +01:00
data->items = items;
2009-12-26 22:35:45 +01:00
return data;
}
2009-12-29 20:22:02 +01:00
LastFMService* RadioModel::GetLastFMService() const {
if (sServices.contains(LastFMService::kServiceName))
return static_cast<LastFMService*>(sServices[LastFMService::kServiceName]);
return NULL;
}
2009-12-30 00:01:07 +01:00
void RadioModel::ShowContextMenu(RadioItem* item, const QModelIndex& index,
const QPoint& global_pos) {
2009-12-30 00:01:07 +01:00
if (item->service)
item->service->ShowContextMenu(item, index, global_pos);
2009-12-30 00:01:07 +01:00
}
2010-02-03 19:32:48 +01:00
void RadioModel::ReloadSettings() {
foreach (RadioService* service, sServices.values()) {
service->ReloadSettings();
}
}