Refactoring
This commit is contained in:
@@ -23,7 +23,7 @@
|
||||
#include <QMutexLocker>
|
||||
#include <QSqlDatabase>
|
||||
|
||||
#include "core/shared_ptr.h"
|
||||
#include "includes/shared_ptr.h"
|
||||
#include "core/database.h"
|
||||
#include "core/sqlquery.h"
|
||||
#include "core/song.h"
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
using namespace Qt::Literals::StringLiterals;
|
||||
|
||||
RadioBackend::RadioBackend(SharedPtr<Database> db, QObject *parent)
|
||||
RadioBackend::RadioBackend(const SharedPtr<Database> db, QObject *parent)
|
||||
: QObject(parent),
|
||||
db_(db),
|
||||
original_thread_(thread()) {}
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
#include <QObject>
|
||||
|
||||
#include "core/shared_ptr.h"
|
||||
#include "includes/shared_ptr.h"
|
||||
#include "radiochannel.h"
|
||||
|
||||
class QThread;
|
||||
@@ -32,7 +32,7 @@ class RadioBackend : public QObject {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit RadioBackend(SharedPtr<Database> db, QObject *parent = nullptr);
|
||||
explicit RadioBackend(const SharedPtr<Database> db, QObject *parent = nullptr);
|
||||
|
||||
void Close();
|
||||
void ExitAsync();
|
||||
@@ -54,7 +54,7 @@ class RadioBackend : public QObject {
|
||||
void Exit();
|
||||
|
||||
private:
|
||||
SharedPtr<Database> db_;
|
||||
const SharedPtr<Database> db_;
|
||||
QThread *original_thread_;
|
||||
};
|
||||
|
||||
|
||||
@@ -28,9 +28,8 @@
|
||||
#include <QPixmapCache>
|
||||
#include <QRegularExpression>
|
||||
|
||||
#include "core/application.h"
|
||||
#include "core/song.h"
|
||||
#include "core/simpletreemodel.h"
|
||||
#include "playlist/playlistmanager.h"
|
||||
#include "covermanager/albumcoverloader.h"
|
||||
#include "covermanager/albumcoverloaderresult.h"
|
||||
#include "radiomodel.h"
|
||||
@@ -45,12 +44,13 @@ namespace {
|
||||
constexpr int kTreeIconSize = 22;
|
||||
}
|
||||
|
||||
RadioModel::RadioModel(Application *app, QObject *parent)
|
||||
RadioModel::RadioModel(const SharedPtr<AlbumCoverLoader> albumcover_loader, const SharedPtr<RadioServices> radio_services, QObject *parent)
|
||||
: SimpleTreeModel<RadioItem>(new RadioItem(this), parent),
|
||||
app_(app) {
|
||||
albumcover_loader_(albumcover_loader),
|
||||
radio_services_(radio_services) {
|
||||
|
||||
if (app_) {
|
||||
QObject::connect(&*app_->album_cover_loader(), &AlbumCoverLoader::AlbumCoverLoaded, this, &RadioModel::AlbumCoverLoaded);
|
||||
if (albumcover_loader_) {
|
||||
QObject::connect(&*albumcover_loader, &AlbumCoverLoader::AlbumCoverLoaded, this, &RadioModel::AlbumCoverLoaded);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -109,12 +109,12 @@ QVariant RadioModel::data(const RadioItem *item, int role) const {
|
||||
return QVariant::fromValue(item->source);
|
||||
break;
|
||||
case Role_Homepage:{
|
||||
RadioService *service = app_->radio_services()->ServiceBySource(item->source);
|
||||
RadioService *service = radio_services_->ServiceBySource(item->source);
|
||||
if (service) return service->Homepage();
|
||||
break;
|
||||
}
|
||||
case Role_Donate:{
|
||||
RadioService *service = app_->radio_services()->ServiceBySource(item->source);
|
||||
RadioService *service = radio_services_->ServiceBySource(item->source);
|
||||
if (service) return service->Donate();
|
||||
break;
|
||||
}
|
||||
@@ -141,7 +141,7 @@ QMimeData *RadioModel::mimeData(const QModelIndexList &indexes) const {
|
||||
}
|
||||
|
||||
data->setUrls(urls);
|
||||
data->name_for_new_playlist_ = PlaylistManager::GetNameForNewPlaylist(data->songs);
|
||||
data->name_for_new_playlist_ = Song::GetNameForNewPlaylist(data->songs);
|
||||
|
||||
return data;
|
||||
|
||||
@@ -287,7 +287,7 @@ QPixmap RadioModel::ChannelIcon(const QModelIndex &idx) {
|
||||
if (!songs.isEmpty()) {
|
||||
Song song = songs.first();
|
||||
song.set_art_automatic(item->channel.thumbnail_url);
|
||||
const quint64 id = app_->album_cover_loader()->LoadImageAsync(AlbumCoverLoaderOptions(AlbumCoverLoaderOptions::Option::ScaledImage | AlbumCoverLoaderOptions::Option::PadScaledImage, QSize(kTreeIconSize, kTreeIconSize)), song);
|
||||
const quint64 id = albumcover_loader_->LoadImageAsync(AlbumCoverLoaderOptions(AlbumCoverLoaderOptions::Option::ScaledImage | AlbumCoverLoaderOptions::Option::PadScaledImage, QSize(kTreeIconSize, kTreeIconSize)), song);
|
||||
pending_art_[id] = ItemAndCacheKey(item, cache_key);
|
||||
pending_cache_keys_.insert(cache_key);
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#include <QStringList>
|
||||
#include <QPixmap>
|
||||
|
||||
#include "includes/shared_ptr.h"
|
||||
#include "core/song.h"
|
||||
#include "core/simpletreemodel.h"
|
||||
#include "covermanager/albumcoverloaderresult.h"
|
||||
@@ -39,14 +40,14 @@
|
||||
|
||||
class QMimeData;
|
||||
|
||||
class Application;
|
||||
class Database;
|
||||
class AlbumCoverLoader;
|
||||
class RadioServices;
|
||||
|
||||
class RadioModel : public SimpleTreeModel<RadioItem> {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit RadioModel(Application *app, QObject *parent = nullptr);
|
||||
explicit RadioModel(const SharedPtr<AlbumCoverLoader> albumcover_loader, const SharedPtr<RadioServices> radio_services, QObject *parent = nullptr);
|
||||
~RadioModel() override;
|
||||
|
||||
enum Role {
|
||||
@@ -88,7 +89,9 @@ class RadioModel : public SimpleTreeModel<RadioItem> {
|
||||
private:
|
||||
using ItemAndCacheKey = QPair<RadioItem*, QString>;
|
||||
|
||||
Application *app_;
|
||||
const SharedPtr<AlbumCoverLoader> albumcover_loader_;
|
||||
const SharedPtr<RadioServices> radio_services_;
|
||||
|
||||
QMap<Song::Source, RadioItem*> container_nodes_;
|
||||
QList<RadioItem*> items_;
|
||||
QMap<quint64, ItemAndCacheKey> pending_art_;
|
||||
|
||||
@@ -25,9 +25,8 @@
|
||||
#include <QJsonObject>
|
||||
#include <QJsonArray>
|
||||
|
||||
#include "core/application.h"
|
||||
#include "core/networkaccessmanager.h"
|
||||
#include "core/taskmanager.h"
|
||||
#include "core/networkaccessmanager.h"
|
||||
#include "core/iconloader.h"
|
||||
#include "radioparadiseservice.h"
|
||||
#include "radiochannel.h"
|
||||
@@ -38,8 +37,8 @@ namespace {
|
||||
constexpr char kApiChannelsUrl[] = "https://api.radioparadise.com/api/list_streams";
|
||||
}
|
||||
|
||||
RadioParadiseService::RadioParadiseService(Application *app, SharedPtr<NetworkAccessManager> network, QObject *parent)
|
||||
: RadioService(Song::Source::RadioParadise, u"Radio Paradise"_s, IconLoader::Load(u"radioparadise"_s), app, network, parent) {}
|
||||
RadioParadiseService::RadioParadiseService(const SharedPtr<TaskManager> task_manager, const SharedPtr<NetworkAccessManager> network, QObject *parent)
|
||||
: RadioService(Song::Source::RadioParadise, u"Radio Paradise"_s, IconLoader::Load(u"radioparadise"_s), task_manager, network, parent) {}
|
||||
|
||||
QUrl RadioParadiseService::Homepage() { return QUrl(u"https://radioparadise.com/"_s); }
|
||||
QUrl RadioParadiseService::Donate() { return QUrl(u"https://payments.radioparadise.com/rp2s-content.php?name=Support&file=support"_s); }
|
||||
@@ -65,7 +64,7 @@ void RadioParadiseService::GetChannels() {
|
||||
QNetworkRequest req(url);
|
||||
QNetworkReply *reply = network_->get(req);
|
||||
replies_ << reply;
|
||||
const int task_id = app_->task_manager()->StartTask(tr("Getting %1 channels").arg(name_));
|
||||
const int task_id = task_manager_->StartTask(tr("Getting %1 channels").arg(name_));
|
||||
QObject::connect(reply, &QNetworkReply::finished, this, [this, reply, task_id]() { GetChannelsReply(reply, task_id); });
|
||||
|
||||
}
|
||||
@@ -77,14 +76,14 @@ void RadioParadiseService::GetChannelsReply(QNetworkReply *reply, const int task
|
||||
|
||||
QJsonObject object = ExtractJsonObj(reply);
|
||||
if (object.isEmpty()) {
|
||||
app_->task_manager()->SetTaskFinished(task_id);
|
||||
task_manager_->SetTaskFinished(task_id);
|
||||
Q_EMIT NewChannels();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!object.contains("channels"_L1) || !object["channels"_L1].isArray()) {
|
||||
Error(u"Missing JSON channels array."_s, object);
|
||||
app_->task_manager()->SetTaskFinished(task_id);
|
||||
task_manager_->SetTaskFinished(task_id);
|
||||
Q_EMIT NewChannels();
|
||||
return;
|
||||
}
|
||||
@@ -123,7 +122,7 @@ void RadioParadiseService::GetChannelsReply(QNetworkReply *reply, const int task
|
||||
}
|
||||
}
|
||||
|
||||
app_->task_manager()->SetTaskFinished(task_id);
|
||||
task_manager_->SetTaskFinished(task_id);
|
||||
|
||||
Q_EMIT NewChannels(channels);
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
#include "radioservice.h"
|
||||
#include "radiochannel.h"
|
||||
|
||||
class Application;
|
||||
class TaskManager;
|
||||
class NetworkAccessManager;
|
||||
class QNetworkReply;
|
||||
|
||||
@@ -34,7 +34,7 @@ class RadioParadiseService : public RadioService {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit RadioParadiseService(Application *app, SharedPtr<NetworkAccessManager> network, QObject *parent = nullptr);
|
||||
explicit RadioParadiseService(const SharedPtr<TaskManager> task_manager, const SharedPtr<NetworkAccessManager> network, QObject *parent = nullptr);
|
||||
|
||||
QUrl Homepage() override;
|
||||
QUrl Donate() override;
|
||||
|
||||
@@ -26,14 +26,18 @@
|
||||
#include <QJsonDocument>
|
||||
#include <QJsonObject>
|
||||
|
||||
#include "includes/shared_ptr.h"
|
||||
#include "core/logging.h"
|
||||
#include "core/shared_ptr.h"
|
||||
#include "core/application.h"
|
||||
#include "radioservice.h"
|
||||
|
||||
RadioService::RadioService(const Song::Source source, const QString &name, const QIcon &icon, Application *app, SharedPtr<NetworkAccessManager> network, QObject *parent)
|
||||
RadioService::RadioService(const Song::Source source,
|
||||
const QString &name,
|
||||
const QIcon &icon,
|
||||
const SharedPtr<TaskManager> task_manager,
|
||||
const SharedPtr<NetworkAccessManager> network,
|
||||
QObject *parent)
|
||||
: QObject(parent),
|
||||
app_(app),
|
||||
task_manager_(task_manager),
|
||||
network_(network),
|
||||
source_(source),
|
||||
name_(name),
|
||||
|
||||
@@ -30,20 +30,25 @@
|
||||
#include <QIcon>
|
||||
#include <QJsonObject>
|
||||
|
||||
#include "core/shared_ptr.h"
|
||||
#include "includes/shared_ptr.h"
|
||||
#include "core/song.h"
|
||||
#include "radiochannel.h"
|
||||
|
||||
class QNetworkReply;
|
||||
|
||||
class Application;
|
||||
class TaskManager;
|
||||
class NetworkAccessManager;
|
||||
|
||||
class RadioService : public QObject {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit RadioService(const Song::Source source, const QString &name, const QIcon &icon, Application *app, SharedPtr<NetworkAccessManager> network, QObject *parent = nullptr);
|
||||
explicit RadioService(const Song::Source source,
|
||||
const QString &name,
|
||||
const QIcon &icon,
|
||||
const SharedPtr<TaskManager> task_manager,
|
||||
const SharedPtr<NetworkAccessManager> network,
|
||||
QObject *parent = nullptr);
|
||||
|
||||
Song::Source source() const { return source_; }
|
||||
QString name() const { return name_; }
|
||||
@@ -66,11 +71,11 @@ class RadioService : public QObject {
|
||||
void Error(const QString &error, const QVariant &debug = QVariant());
|
||||
|
||||
protected:
|
||||
Application *app_;
|
||||
SharedPtr<NetworkAccessManager> network_;
|
||||
Song::Source source_;
|
||||
QString name_;
|
||||
QIcon icon_;
|
||||
const SharedPtr<TaskManager> task_manager_;
|
||||
const SharedPtr<NetworkAccessManager> network_;
|
||||
const Song::Source source_;
|
||||
const QString name_;
|
||||
const QIcon icon_;
|
||||
};
|
||||
|
||||
Q_DECLARE_METATYPE(RadioService*)
|
||||
|
||||
@@ -22,9 +22,8 @@
|
||||
#include <QObject>
|
||||
#include <QSortFilterProxyModel>
|
||||
|
||||
#include "includes/shared_ptr.h"
|
||||
#include "core/logging.h"
|
||||
#include "core/shared_ptr.h"
|
||||
#include "core/application.h"
|
||||
#include "core/database.h"
|
||||
#include "core/networkaccessmanager.h"
|
||||
#include "radioservices.h"
|
||||
@@ -37,16 +36,20 @@
|
||||
|
||||
using std::make_shared;
|
||||
|
||||
RadioServices::RadioServices(Application *app, QObject *parent)
|
||||
RadioServices::RadioServices(const SharedPtr<TaskManager> task_manager,
|
||||
const SharedPtr<NetworkAccessManager> network,
|
||||
const SharedPtr<Database> database,
|
||||
const SharedPtr<AlbumCoverLoader> albumcover_loader,
|
||||
QObject *parent)
|
||||
: QObject(parent),
|
||||
network_(app->network()),
|
||||
network_(network),
|
||||
backend_(nullptr),
|
||||
model_(new RadioModel(app, this)),
|
||||
model_(new RadioModel(albumcover_loader, SharedPtr<RadioServices>(this))),
|
||||
sort_model_(new QSortFilterProxyModel(this)),
|
||||
channels_refresh_(false) {
|
||||
|
||||
backend_ = make_shared<RadioBackend>(app->database());
|
||||
app->MoveToThread(&*backend_, app->database()->thread());
|
||||
backend_ = make_shared<RadioBackend>(database);
|
||||
backend_->moveToThread(database->thread());
|
||||
|
||||
QObject::connect(&*backend_, &RadioBackend::NewChannels, this, &RadioServices::GotChannelsFromBackend);
|
||||
|
||||
@@ -56,8 +59,8 @@ RadioServices::RadioServices(Application *app, QObject *parent)
|
||||
sort_model_->setSortLocaleAware(true);
|
||||
sort_model_->sort(0);
|
||||
|
||||
AddService(new SomaFMService(app, network_, this));
|
||||
AddService(new RadioParadiseService(app, network_, this));
|
||||
AddService(new SomaFMService(task_manager, network_, this));
|
||||
AddService(new RadioParadiseService(task_manager, network_, this));
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -23,14 +23,16 @@
|
||||
#include <QObject>
|
||||
#include <QMap>
|
||||
|
||||
#include "core/shared_ptr.h"
|
||||
#include "includes/shared_ptr.h"
|
||||
#include "core/song.h"
|
||||
#include "radiochannel.h"
|
||||
|
||||
class QSortFilterProxyModel;
|
||||
|
||||
class Application;
|
||||
class TaskManager;
|
||||
class Database;
|
||||
class NetworkAccessManager;
|
||||
class AlbumCoverLoader;
|
||||
class RadioBackend;
|
||||
class RadioModel;
|
||||
class RadioService;
|
||||
@@ -39,7 +41,11 @@ class RadioServices : public QObject {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit RadioServices(Application *app, QObject *parent = nullptr);
|
||||
explicit RadioServices(const SharedPtr<TaskManager> task_manager,
|
||||
const SharedPtr<NetworkAccessManager> network,
|
||||
const SharedPtr<Database> database,
|
||||
const SharedPtr<AlbumCoverLoader> albumcover_loader,
|
||||
QObject *parent = nullptr);
|
||||
|
||||
void AddService(RadioService *service);
|
||||
void RemoveService(RadioService *service);
|
||||
@@ -66,7 +72,7 @@ class RadioServices : public QObject {
|
||||
void RefreshChannels();
|
||||
|
||||
private:
|
||||
SharedPtr<NetworkAccessManager> network_;
|
||||
const SharedPtr<NetworkAccessManager> network_;
|
||||
SharedPtr<RadioBackend> backend_;
|
||||
RadioModel *model_;
|
||||
QSortFilterProxyModel *sort_model_;
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
#include "core/iconloader.h"
|
||||
#include "core/settings.h"
|
||||
#include "settings/appearancesettingspage.h"
|
||||
#include "constants/appearancesettings.h"
|
||||
#include "radioviewcontainer.h"
|
||||
#include "ui_radioviewcontainer.h"
|
||||
|
||||
@@ -48,8 +48,8 @@ RadioViewContainer::~RadioViewContainer() { delete ui_; }
|
||||
void RadioViewContainer::ReloadSettings() {
|
||||
|
||||
Settings s;
|
||||
s.beginGroup(AppearanceSettingsPage::kSettingsGroup);
|
||||
int iconsize = s.value(AppearanceSettingsPage::kIconSizeLeftPanelButtons, 22).toInt();
|
||||
s.beginGroup(AppearanceSettings::kSettingsGroup);
|
||||
int iconsize = s.value(AppearanceSettings::kIconSizeLeftPanelButtons, 22).toInt();
|
||||
s.endGroup();
|
||||
|
||||
ui_->refresh->setIconSize(QSize(iconsize, iconsize));
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
#include <QJsonObject>
|
||||
#include <QJsonArray>
|
||||
|
||||
#include "core/application.h"
|
||||
#include "core/networkaccessmanager.h"
|
||||
#include "core/taskmanager.h"
|
||||
#include "core/iconloader.h"
|
||||
@@ -42,8 +41,8 @@ namespace {
|
||||
constexpr char kApiChannelsUrl[] = "https://somafm.com/channels.json";
|
||||
}
|
||||
|
||||
SomaFMService::SomaFMService(Application *app, SharedPtr<NetworkAccessManager> network, QObject *parent)
|
||||
: RadioService(Song::Source::SomaFM, u"SomaFM"_s, IconLoader::Load(u"somafm"_s), app, network, parent) {}
|
||||
SomaFMService::SomaFMService(const SharedPtr<TaskManager> task_manager, const SharedPtr<NetworkAccessManager> network, QObject *parent)
|
||||
: RadioService(Song::Source::SomaFM, u"SomaFM"_s, IconLoader::Load(u"somafm"_s), task_manager, network, parent) {}
|
||||
|
||||
SomaFMService::~SomaFMService() {
|
||||
Abort();
|
||||
@@ -73,7 +72,7 @@ void SomaFMService::GetChannels() {
|
||||
QNetworkRequest req(url);
|
||||
QNetworkReply *reply = network_->get(req);
|
||||
replies_ << reply;
|
||||
const int task_id = app_->task_manager()->StartTask(tr("Getting %1 channels").arg(name_));
|
||||
const int task_id = task_manager_->StartTask(tr("Getting %1 channels").arg(name_));
|
||||
QObject::connect(reply, &QNetworkReply::finished, this, [this, reply, task_id]() { GetChannelsReply(reply, task_id); });
|
||||
|
||||
}
|
||||
@@ -85,14 +84,14 @@ void SomaFMService::GetChannelsReply(QNetworkReply *reply, const int task_id) {
|
||||
|
||||
QJsonObject object = ExtractJsonObj(reply);
|
||||
if (object.isEmpty()) {
|
||||
app_->task_manager()->SetTaskFinished(task_id);
|
||||
task_manager_->SetTaskFinished(task_id);
|
||||
Q_EMIT NewChannels();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!object.contains("channels"_L1) || !object["channels"_L1].isArray()) {
|
||||
Error(u"Missing JSON channels array."_s, object);
|
||||
app_->task_manager()->SetTaskFinished(task_id);
|
||||
task_manager_->SetTaskFinished(task_id);
|
||||
Q_EMIT NewChannels();
|
||||
return;
|
||||
}
|
||||
@@ -129,7 +128,7 @@ void SomaFMService::GetChannelsReply(QNetworkReply *reply, const int task_id) {
|
||||
}
|
||||
|
||||
if (channels.isEmpty()) {
|
||||
app_->task_manager()->SetTaskFinished(task_id);
|
||||
task_manager_->SetTaskFinished(task_id);
|
||||
Q_EMIT NewChannels();
|
||||
}
|
||||
else {
|
||||
@@ -154,7 +153,7 @@ void SomaFMService::GetStreamUrlsReply(QNetworkReply *reply, const int task_id,
|
||||
if (replies_.contains(reply)) replies_.removeAll(reply);
|
||||
reply->deleteLater();
|
||||
|
||||
PlaylistParser parser;
|
||||
PlaylistParser parser(nullptr, nullptr);
|
||||
SongList songs = parser.LoadFromDevice(reply);
|
||||
if (!songs.isEmpty()) {
|
||||
channel.url = songs.first().url();
|
||||
@@ -163,7 +162,7 @@ void SomaFMService::GetStreamUrlsReply(QNetworkReply *reply, const int task_id,
|
||||
channels_ << channel;
|
||||
|
||||
if (replies_.isEmpty()) {
|
||||
app_->task_manager()->SetTaskFinished(task_id);
|
||||
task_manager_->SetTaskFinished(task_id);
|
||||
Q_EMIT NewChannels(channels_);
|
||||
channels_.clear();
|
||||
}
|
||||
|
||||
@@ -28,13 +28,15 @@
|
||||
#include "radiochannel.h"
|
||||
|
||||
class QNetworkReply;
|
||||
|
||||
class TaskManager;
|
||||
class NetworkAccessManager;
|
||||
|
||||
class SomaFMService : public RadioService {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit SomaFMService(Application *app, SharedPtr<NetworkAccessManager> network, QObject *parent = nullptr);
|
||||
explicit SomaFMService(const SharedPtr<TaskManager> task_manager, const SharedPtr<NetworkAccessManager> network, QObject *parent = nullptr);
|
||||
~SomaFMService();
|
||||
|
||||
QUrl Homepage() override;
|
||||
|
||||
Reference in New Issue
Block a user