diff --git a/ext/libclementine-common/core/lazy.h b/ext/libclementine-common/core/lazy.h new file mode 100644 index 000000000..43684891c --- /dev/null +++ b/ext/libclementine-common/core/lazy.h @@ -0,0 +1,25 @@ +#include +#include + +template +class Lazy { + public: + explicit Lazy(std::function init) : init_(init) {} + + T* get() { + if (!ptr_) { + ptr_.reset(init_()); + } + return ptr_.get(); + } + + typename std::add_lvalue_reference::type operator*() const { + return *ptr_; + } + + T* operator->() const { return ptr_.get(); } + + private: + std::function init_; + std::unique_ptr ptr_; +}; diff --git a/src/internet/core/internetservice.cpp b/src/internet/core/internetservice.cpp index 39bfb1aa5..36038b518 100644 --- a/src/internet/core/internetservice.cpp +++ b/src/internet/core/internetservice.cpp @@ -42,10 +42,25 @@ InternetService::InternetService(const QString& name, Application* app, app_(app), model_(model), name_(name), - append_to_playlist_(nullptr), - replace_playlist_(nullptr), - open_in_new_playlist_(nullptr), - separator_(nullptr) {} + append_to_playlist_([]() { + return new QAction( + IconLoader::Load("media-playback-start", IconLoader::Base), + tr("Append to current playlist"), nullptr); + }), + replace_playlist_([]() { + return new QAction( + IconLoader::Load("media-playback-start", IconLoader::Base), + tr("Replace current playlist"), nullptr); + }), + open_in_new_playlist_([]() { + return new QAction(IconLoader::Load("document-new", IconLoader::Base), + tr("Open in new playlist"), nullptr); + }), + separator_([]() { + QAction* action = new QAction(nullptr); + action->setSeparator(true); + return action; + }) {} void InternetService::ShowUrlBox(const QString& title, const QString& url) { QMessageBox url_box; @@ -64,50 +79,27 @@ void InternetService::ShowUrlBox(const QString& title, const QString& url) { } QList InternetService::GetPlaylistActions() { - if (!separator_) { - separator_ = new QAction(this); - separator_->setSeparator(true); - } - return QList() << GetAppendToPlaylistAction() << GetReplacePlaylistAction() - << GetOpenInNewPlaylistAction() << separator_; + << GetOpenInNewPlaylistAction() << separator_.get(); } QAction* InternetService::GetAppendToPlaylistAction() { - if (!append_to_playlist_) { - append_to_playlist_ = new QAction(IconLoader::Load("media-playback-start", - IconLoader::Base), - tr("Append to current playlist"), this); - connect(append_to_playlist_, SIGNAL(triggered()), this, - SLOT(AppendToPlaylist())); - } - - return append_to_playlist_; + connect(append_to_playlist_.get(), SIGNAL(triggered()), this, + SLOT(AppendToPlaylist())); + return append_to_playlist_.get(); } QAction* InternetService::GetReplacePlaylistAction() { - if (!replace_playlist_) { - replace_playlist_ = new QAction(IconLoader::Load("media-playback-start", - IconLoader::Base), - tr("Replace current playlist"), this); - connect(replace_playlist_, SIGNAL(triggered()), this, - SLOT(ReplacePlaylist())); - } - - return replace_playlist_; + connect(replace_playlist_.get(), SIGNAL(triggered()), this, + SLOT(ReplacePlaylist())); + return replace_playlist_.get(); } QAction* InternetService::GetOpenInNewPlaylistAction() { - if (!open_in_new_playlist_) { - open_in_new_playlist_ = new QAction(IconLoader::Load("document-new", - IconLoader::Base), - tr("Open in new playlist"), this); - connect(open_in_new_playlist_, SIGNAL(triggered()), this, - SLOT(OpenInNewPlaylist())); - } - - return open_in_new_playlist_; + connect(open_in_new_playlist_.get(), SIGNAL(triggered()), this, + SLOT(OpenInNewPlaylist())); + return open_in_new_playlist_.get(); } void InternetService::AddItemToPlaylist(const QModelIndex& index, diff --git a/src/internet/core/internetservice.h b/src/internet/core/internetservice.h index 15f41ef17..cb1cf44f7 100644 --- a/src/internet/core/internetservice.h +++ b/src/internet/core/internetservice.h @@ -23,10 +23,12 @@ #ifndef INTERNET_CORE_INTERNETSERVICE_H_ #define INTERNET_CORE_INTERNETSERVICE_H_ +#include #include #include #include +#include "core/lazy.h" #include "core/song.h" #include "playlist/playlistitem.h" #include "smartplaylists/generator.h" @@ -83,7 +85,7 @@ class InternetService : public QObject { virtual QString Icon() { return QString(); } - signals: +signals: void StreamError(const QString& message); void StreamMetadataFound(const QUrl& original_url, const Song& song); @@ -135,10 +137,10 @@ class InternetService : public QObject { InternetModel* model_; QString name_; - QAction* append_to_playlist_; - QAction* replace_playlist_; - QAction* open_in_new_playlist_; - QAction* separator_; + Lazy append_to_playlist_; + Lazy replace_playlist_; + Lazy open_in_new_playlist_; + Lazy separator_; }; Q_DECLARE_METATYPE(InternetService*);