Refactoring

This commit is contained in:
Jonas Kvinge
2024-10-22 18:12:33 +02:00
parent dfcf715291
commit 8da2b9cd94
623 changed files with 9071 additions and 5126 deletions

View File

@@ -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()) {}

View File

@@ -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_;
};

View File

@@ -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);
}

View File

@@ -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_;

View File

@@ -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);

View File

@@ -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;

View File

@@ -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),

View File

@@ -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*)

View File

@@ -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));
}

View File

@@ -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_;

View File

@@ -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));

View File

@@ -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();
}

View File

@@ -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;