diff --git a/src/core/application.cpp b/src/core/application.cpp index bab3a853f..031ae2106 100644 --- a/src/core/application.cpp +++ b/src/core/application.cpp @@ -22,8 +22,35 @@ #include "application.h" +#include "config.h" +#include "core/appearance.h" +#include "core/database.h" +#include "core/lazy.h" +#include "core/player.h" +#include "core/tagreaderclient.h" +#include "core/taskmanager.h" +#include "covers/albumcoverloader.h" #include "covers/amazoncoverprovider.h" +#include "covers/coverproviders.h" +#include "covers/currentartloader.h" #include "covers/musicbrainzcoverprovider.h" +#include "devices/devicemanager.h" +#include "globalsearch/globalsearch.h" +#include "internet/core/internetmodel.h" +#include "internet/core/scrobbler.h" +#include "internet/podcasts/gpoddersync.h" +#include "internet/podcasts/podcastbackend.h" +#include "internet/podcasts/podcastdeleter.h" +#include "internet/podcasts/podcastdownloader.h" +#include "internet/podcasts/podcastupdater.h" +#include "library/librarybackend.h" +#include "library/library.h" +#include "moodbar/moodbarcontroller.h" +#include "moodbar/moodbarloader.h" +#include "networkremote/networkremote.h" +#include "networkremote/networkremotehelper.h" +#include "playlist/playlistbackend.h" +#include "playlist/playlistmanager.h" #ifdef HAVE_LIBLASTFM #include "covers/lastfmcoverprovider.h" @@ -37,110 +64,137 @@ bool Application::kIsPortable = false; -Application::Application(QObject* parent) - : QObject(parent), - tag_reader_client_([&](){ - TagReaderClient* client = new TagReaderClient(this); - MoveToNewThread(client); - client->Start(); - return client; - }), - database_([&]() { - Database* db = new Database(this, this); - MoveToNewThread(db); - DoInAMinuteOrSo(db, SLOT(DoBackup())); - return db; - }), - album_cover_loader_([&]() { - AlbumCoverLoader* loader = new AlbumCoverLoader(this); - MoveToNewThread(loader); - return loader; - }), - playlist_backend_([&]() { - PlaylistBackend* backend = new PlaylistBackend(this, this); - MoveToThread(backend, database_->thread()); - return backend; - }), - podcast_backend_([&]() { - PodcastBackend* backend = new PodcastBackend(this, this); - MoveToThread(backend, database_->thread()); - return backend; - }), - appearance_([=]() { return new Appearance(this); }), - cover_providers_([=]() { - CoverProviders* cover_providers = new CoverProviders(this); - // Initialize the repository of cover providers. - cover_providers->AddProvider(new AmazonCoverProvider); - cover_providers->AddProvider(new MusicbrainzCoverProvider); +class ApplicationImpl { + public: + ApplicationImpl(Application* app) + : tag_reader_client_([=]() { + TagReaderClient* client = new TagReaderClient(app); + app->MoveToNewThread(client); + client->Start(); + return client; + }), + database_([=]() { + Database* db = new Database(app, app); + app->MoveToNewThread(db); + DoInAMinuteOrSo(db, SLOT(DoBackup())); + return db; + }), + album_cover_loader_([=]() { + AlbumCoverLoader* loader = new AlbumCoverLoader(app); + app->MoveToNewThread(loader); + return loader; + }), + playlist_backend_([=]() { + PlaylistBackend* backend = new PlaylistBackend(app, app); + app->MoveToThread(backend, database_->thread()); + return backend; + }), + podcast_backend_([=]() { + PodcastBackend* backend = new PodcastBackend(app, app); + app->MoveToThread(backend, database_->thread()); + return backend; + }), + appearance_([=]() { return new Appearance(app); }), + cover_providers_([=]() { + CoverProviders* cover_providers = new CoverProviders(app); + // Initialize the repository of cover providers. + cover_providers->AddProvider(new AmazonCoverProvider); + cover_providers->AddProvider(new MusicbrainzCoverProvider); #ifdef HAVE_LIBLASTFM - cover_providers->AddProvider(new LastFmCoverProvider(this)); + cover_providers->AddProvider(new LastFmCoverProvider(app)); #endif - return cover_providers; - }), - task_manager_([=]() { return new TaskManager(this); }), - player_([=]() { return new Player(this, this); }), - playlist_manager_([=]() { return new PlaylistManager(this); }), - current_art_loader_([=]() { return new CurrentArtLoader(this, this); }), - global_search_([=]() { return new GlobalSearch(this, this); }), - internet_model_([=]() { return new InternetModel(this, this); }), - library_([=]() { return new Library(this, this); }), - device_manager_([=]() { return new DeviceManager(this, this); }), - podcast_updater_([=]() { return new PodcastUpdater(this, this); }), - podcast_deleter_([=]() { - PodcastDeleter* deleter = new PodcastDeleter(this, this); - MoveToNewThread(deleter); - return deleter; - }), - podcast_downloader_([=]() { - return new PodcastDownloader(this, this); - }), - gpodder_sync_([=]() { return new GPodderSync(this, this); }), - moodbar_loader_([=]() { + return cover_providers; + }), + task_manager_([=]() { return new TaskManager(app); }), + player_([=]() { return new Player(app, app); }), + playlist_manager_([=]() { return new PlaylistManager(app); }), + current_art_loader_([=]() { return new CurrentArtLoader(app, app); }), + global_search_([=]() { return new GlobalSearch(app, app); }), + internet_model_([=]() { return new InternetModel(app, app); }), + library_([=]() { return new Library(app, app); }), + device_manager_([=]() { return new DeviceManager(app, app); }), + podcast_updater_([=]() { return new PodcastUpdater(app, app); }), + podcast_deleter_([=]() { + PodcastDeleter* deleter = new PodcastDeleter(app, app); + app->MoveToNewThread(deleter); + return deleter; + }), + podcast_downloader_([=]() { return new PodcastDownloader(app, app); }), + gpodder_sync_([=]() { return new GPodderSync(app, app); }), + moodbar_loader_([=]() { #ifdef HAVE_MOODBAR - return new MoodbarLoader(this, this); + return new MoodbarLoader(app, app); #else - return nullptr; + return nullptr; #endif - }), - moodbar_controller_([=]() { + }), + moodbar_controller_([=]() { #ifdef HAVE_MOODBAR - return new MoodbarController(this, this); + return new MoodbarController(app, app); #else - return nullptr; + return nullptr; #endif - }), - network_remote_([=]() { - NetworkRemote* remote = new NetworkRemote(this); - MoveToNewThread(remote); - return remote; - }), - network_remote_helper_([=]() { - return new NetworkRemoteHelper(this); - }), - scrobbler_([=]() { + }), + network_remote_([=]() { + NetworkRemote* remote = new NetworkRemote(app); + app->MoveToNewThread(remote); + return remote; + }), + network_remote_helper_([=]() { return new NetworkRemoteHelper(app); }), + scrobbler_([=]() { #ifdef HAVE_LIBLASTFM - return new LastFMService(this, this); + return new LastFMService(app, app); #else - return nullptr; + return nullptr; #endif - }) { + }) { + } + + Lazy tag_reader_client_; + Lazy database_; + Lazy album_cover_loader_; + Lazy playlist_backend_; + Lazy podcast_backend_; + Lazy appearance_; + Lazy cover_providers_; + Lazy task_manager_; + Lazy player_; + Lazy playlist_manager_; + Lazy current_art_loader_; + Lazy global_search_; + Lazy internet_model_; + Lazy library_; + Lazy device_manager_; + Lazy podcast_updater_; + Lazy podcast_deleter_; + Lazy podcast_downloader_; + Lazy gpodder_sync_; + Lazy moodbar_loader_; + Lazy moodbar_controller_; + Lazy network_remote_; + Lazy network_remote_helper_; + Lazy scrobbler_; +}; + +Application::Application(QObject* parent) + : QObject(parent), p_(new ApplicationImpl(this)) { // This must be before library_->Init(); // In the constructor the helper waits for the signal // PlaylistManagerInitialized // to start the remote. Without the playlist manager clementine can // crash when a client connects before the manager is initialized! - network_remote_helper_.get(); - library_->Init(); + network_remote_helper(); + library()->Init(); // TODO(John Maguire): Make this not a weird singleton. - tag_reader_client_.get(); + tag_reader_client(); } Application::~Application() { // It's important that the device manager is deleted before the database. // Deleting the database deletes all objects that have been created in its // thread, including some device library backends. - device_manager_.reset(); + p_->device_manager_.reset(); for (QThread* thread : threads_) { thread->quit(); @@ -175,14 +229,100 @@ QString Application::language_without_region() const { return language_name_; } +void Application::ReloadSettings() { emit SettingsChanged(); } + +void Application::OpenSettingsDialogAtPage(SettingsDialog::Page page) { + emit SettingsDialogRequested(page); +} + +AlbumCoverLoader* Application::album_cover_loader() const { + return p_->album_cover_loader_.get(); +} + +Appearance* Application::appearance() const { return p_->appearance_.get(); } + +CoverProviders* Application::cover_providers() const { + return p_->cover_providers_.get(); +} + +CurrentArtLoader* Application::current_art_loader() const { + return p_->current_art_loader_.get(); +} + +Database* Application::database() const { return p_->database_.get(); } + +DeviceManager* Application::device_manager() const { + return p_->device_manager_.get(); +} + +GlobalSearch* Application::global_search() const { + return p_->global_search_.get(); +} + +GPodderSync* Application::gpodder_sync() const { + return p_->gpodder_sync_.get(); +} + +InternetModel* Application::internet_model() const { + return p_->internet_model_.get(); +} + +Library* Application::library() const { return p_->library_.get(); } + LibraryBackend* Application::library_backend() const { return library()->backend(); } LibraryModel* Application::library_model() const { return library()->model(); } -void Application::ReloadSettings() { emit SettingsChanged(); } - -void Application::OpenSettingsDialogAtPage(SettingsDialog::Page page) { - emit SettingsDialogRequested(page); +MoodbarController* Application::moodbar_controller() const { + return p_->moodbar_controller_.get(); +} + +MoodbarLoader* Application::moodbar_loader() const { + return p_->moodbar_loader_.get(); +} + +NetworkRemoteHelper* Application::network_remote_helper() const { + return p_->network_remote_helper_.get(); +} + +NetworkRemote* Application::network_remote() const { + return p_->network_remote_.get(); +} + +Player* Application::player() const { return p_->player_.get(); } + +PlaylistBackend* Application::playlist_backend() const { + return p_->playlist_backend_.get(); +} + +PlaylistManager* Application::playlist_manager() const { + return p_->playlist_manager_.get(); +} + +PodcastBackend* Application::podcast_backend() const { + return p_->podcast_backend_.get(); +} + +PodcastDeleter* Application::podcast_deleter() const { + return p_->podcast_deleter_.get(); +} + +PodcastDownloader* Application::podcast_downloader() const { + return p_->podcast_downloader_.get(); +} + +PodcastUpdater* Application::podcast_updater() const { + return p_->podcast_updater_.get(); +} + +Scrobbler* Application::scrobbler() const { return p_->scrobbler_.get(); } + +TagReaderClient* Application::tag_reader_client() const { + return p_->tag_reader_client_.get(); +} + +TaskManager* Application::task_manager() const { + return p_->task_manager_.get(); } diff --git a/src/core/application.h b/src/core/application.h index 5e873e029..33d88bd7b 100644 --- a/src/core/application.h +++ b/src/core/application.h @@ -22,36 +22,37 @@ #ifndef CORE_APPLICATION_H_ #define CORE_APPLICATION_H_ -#include "config.h" -#include "core/appearance.h" -#include "core/database.h" -#include "core/lazy.h" -#include "core/player.h" -#include "covers/albumcoverloader.h" -#include "covers/coverproviders.h" -#include "covers/currentartloader.h" -#include "devices/devicemanager.h" -#include "globalsearch/globalsearch.h" -#include "internet/core/internetmodel.h" -#include "internet/core/scrobbler.h" -#include "internet/podcasts/gpoddersync.h" -#include "internet/podcasts/podcastbackend.h" -#include "internet/podcasts/podcastdeleter.h" -#include "internet/podcasts/podcastdownloader.h" -#include "internet/podcasts/podcastupdater.h" -#include "library/librarybackend.h" -#include "library/library.h" -#include "moodbar/moodbarcontroller.h" -#include "moodbar/moodbarloader.h" -#include "networkremote/networkremote.h" -#include "networkremote/networkremotehelper.h" -#include "playlist/playlistbackend.h" -#include "playlist/playlistmanager.h" -#include "tagreaderclient.h" -#include "taskmanager.h" +#include + #include "ui/settingsdialog.h" -#include +class AlbumCoverLoader; +class Appearance; +class ApplicationImpl; +class CoverProviders; +class CurrentArtLoader; +class Database; +class DeviceManager; +class GlobalSearch; +class GPodderSync; +class InternetModel; +class Library; +class LibraryBackend; +class LibraryModel; +class MoodbarController; +class MoodbarLoader; +class NetworkRemote; +class NetworkRemoteHelper; +class Player; +class PlaylistBackend; +class PlaylistManager; +class PodcastBackend; +class PodcastDeleter; +class PodcastDownloader; +class PodcastUpdater; +class Scrobbler; +class TagReaderClient; +class TaskManager; class Application : public QObject { Q_OBJECT @@ -68,45 +69,32 @@ class Application : public QObject { QString language_without_region() const; void set_language_name(const QString& name) { language_name_ = name; } - TagReaderClient* tag_reader_client() const { - return tag_reader_client_.get(); - } - Database* database() const { return database_.get(); } - AlbumCoverLoader* album_cover_loader() const { - return album_cover_loader_.get(); - } - PlaylistBackend* playlist_backend() const { return playlist_backend_.get(); } - PodcastBackend* podcast_backend() const { return podcast_backend_.get(); } - Appearance* appearance() const { return appearance_.get(); } - CoverProviders* cover_providers() const { return cover_providers_.get(); } - TaskManager* task_manager() const { return task_manager_.get(); } - Player* player() const { return player_.get(); } - PlaylistManager* playlist_manager() const { return playlist_manager_.get(); } - CurrentArtLoader* current_art_loader() const { - return current_art_loader_.get(); - } - GlobalSearch* global_search() const { return global_search_.get(); } - InternetModel* internet_model() const { return internet_model_.get(); } - Library* library() const { return library_.get(); } - DeviceManager* device_manager() const { return device_manager_.get(); } - PodcastUpdater* podcast_updater() const { return podcast_updater_.get(); } - PodcastDeleter* podcast_deleter() const { return podcast_deleter_.get(); } - PodcastDownloader* podcast_downloader() const { - return podcast_downloader_.get(); - } - GPodderSync* gpodder_sync() const { return gpodder_sync_.get(); } - MoodbarLoader* moodbar_loader() const { return moodbar_loader_.get(); } - MoodbarController* moodbar_controller() const { - return moodbar_controller_.get(); - } - NetworkRemote* network_remote() const { return network_remote_.get(); } - NetworkRemoteHelper* network_remote_helper() const { - return network_remote_helper_.get(); - } - Scrobbler* scrobbler() const { return scrobbler_.get(); } - + AlbumCoverLoader* album_cover_loader() const; + Appearance* appearance() const; + CoverProviders* cover_providers() const; + CurrentArtLoader* current_art_loader() const; + Database* database() const; + DeviceManager* device_manager() const; + GlobalSearch* global_search() const; + GPodderSync* gpodder_sync() const; + InternetModel* internet_model() const; + Library* library() const; LibraryBackend* library_backend() const; LibraryModel* library_model() const; + MoodbarController* moodbar_controller() const; + MoodbarLoader* moodbar_loader() const; + NetworkRemoteHelper* network_remote_helper() const; + NetworkRemote* network_remote() const; + Player* player() const; + PlaylistBackend* playlist_backend() const; + PlaylistManager* playlist_manager() const; + PodcastBackend* podcast_backend() const; + PodcastDeleter* podcast_deleter() const; + PodcastDownloader* podcast_downloader() const; + PodcastUpdater* podcast_updater() const; + Scrobbler* scrobbler() const; + TagReaderClient* tag_reader_client() const; + TaskManager* task_manager() const; void MoveToNewThread(QObject* object); void MoveToThread(QObject* object, QThread* thread); @@ -123,32 +111,7 @@ signals: private: QString language_name_; - - Lazy tag_reader_client_; - Lazy database_; - Lazy album_cover_loader_; - Lazy playlist_backend_; - Lazy podcast_backend_; - Lazy appearance_; - Lazy cover_providers_; - Lazy task_manager_; - Lazy player_; - Lazy playlist_manager_; - Lazy current_art_loader_; - Lazy global_search_; - Lazy internet_model_; - Lazy library_; - Lazy device_manager_; - Lazy podcast_updater_; - Lazy podcast_deleter_; - Lazy podcast_downloader_; - Lazy gpodder_sync_; - Lazy moodbar_loader_; - Lazy moodbar_controller_; - Lazy network_remote_; - Lazy network_remote_helper_; - Lazy scrobbler_; - + ApplicationImpl* p_; QList threads_; }; diff --git a/src/networkremote/networkremotehelper.cpp b/src/networkremote/networkremotehelper.cpp index 0e9e04451..15c0d2bf6 100644 --- a/src/networkremote/networkremotehelper.cpp +++ b/src/networkremote/networkremotehelper.cpp @@ -20,6 +20,7 @@ #include "core/application.h" #include "core/logging.h" #include "networkremote/networkremote.h" +#include "playlist/playlistmanager.h" NetworkRemoteHelper* NetworkRemoteHelper::sInstance = nullptr; diff --git a/src/widgets/nowplayingwidget.cpp b/src/widgets/nowplayingwidget.cpp index 30d9e9582..4eda4fd62 100644 --- a/src/widgets/nowplayingwidget.cpp +++ b/src/widgets/nowplayingwidget.cpp @@ -15,17 +15,7 @@ along with Clementine. If not, see . */ -#include "fullscreenhypnotoad.h" #include "nowplayingwidget.h" -#include "core/application.h" -#include "covers/albumcoverloader.h" -#include "covers/coverproviders.h" -#include "covers/currentartloader.h" -#include "covers/kittenloader.h" -#include "library/librarybackend.h" -#include "networkremote/networkremote.h" -#include "ui/albumcoverchoicecontroller.h" -#include "ui/iconloader.h" #include #include @@ -38,6 +28,18 @@ #include #include +#include "fullscreenhypnotoad.h" +#include "core/application.h" +#include "core/logging.h" +#include "covers/albumcoverloader.h" +#include "covers/coverproviders.h" +#include "covers/currentartloader.h" +#include "covers/kittenloader.h" +#include "library/librarybackend.h" +#include "networkremote/networkremote.h" +#include "ui/albumcoverchoicecontroller.h" +#include "ui/iconloader.h" + const char* NowPlayingWidget::kSettingsGroup = "NowPlayingWidget"; const char* NowPlayingWidget::kHypnotoadPath = ":/hypnotoad.gif";