diff --git a/src/smartplaylists/smartplaylistsmodel.cpp b/src/smartplaylists/smartplaylistsmodel.cpp index 0950f1d11..a233a3872 100644 --- a/src/smartplaylists/smartplaylistsmodel.cpp +++ b/src/smartplaylists/smartplaylistsmodel.cpp @@ -134,13 +134,10 @@ void SmartPlaylistsModel::Init() { // Append the new ones s.beginWriteArray(collection_backend_->songs_table(), playlist_index + unwritten_defaults); - for (; version < default_smart_playlists_.count(); ++version) { - const GeneratorList generators = default_smart_playlists_.value(version); - for (PlaylistGeneratorPtr gen : generators) { - SaveGenerator(&s, playlist_index++, gen); - } - } + WriteDefaultsToSettings(&s, version, playlist_index); s.endArray(); + + version = default_smart_playlists_.count(); } s.setValue(collection_backend_->songs_table() + u"_version"_s, version); @@ -269,6 +266,46 @@ PlaylistGeneratorPtr SmartPlaylistsModel::CreateGenerator(const QModelIndex &idx } +void SmartPlaylistsModel::WriteDefaultsToSettings(Settings *s, const int start_version, const int start_index) { + + int playlist_index = start_index; + for (int version = start_version; version < default_smart_playlists_.count(); ++version) { + const GeneratorList generators = default_smart_playlists_.value(version); + for (PlaylistGeneratorPtr gen : generators) { + SaveGenerator(s, playlist_index++, gen); + } + } + +} + +void SmartPlaylistsModel::RestoreDefaults() { + + root_->ClearNotify(); + + Settings s; + s.beginGroup(kSettingsGroup); + + int total_defaults = 0; + for (const GeneratorList &generators : default_smart_playlists_) { + total_defaults += static_cast(generators.count()); + } + + s.beginWriteArray(collection_backend_->songs_table(), total_defaults); + WriteDefaultsToSettings(&s, 0, 0); + s.endArray(); + + s.setValue(collection_backend_->songs_table() + u"_version"_s, default_smart_playlists_.count()); + + const int count = s.beginReadArray(collection_backend_->songs_table()); + for (int i = 0; i < count; ++i) { + s.setArrayIndex(i); + ItemFromSmartPlaylist(s, true); + } + s.endArray(); + s.endGroup(); + +} + QVariant SmartPlaylistsModel::data(const QModelIndex &idx, const int role) const { if (!idx.isValid()) return QVariant(); diff --git a/src/smartplaylists/smartplaylistsmodel.h b/src/smartplaylists/smartplaylistsmodel.h index b1efffa04..8cfbd00b3 100644 --- a/src/smartplaylists/smartplaylistsmodel.h +++ b/src/smartplaylists/smartplaylistsmodel.h @@ -66,6 +66,7 @@ class SmartPlaylistsModel : public SimpleTreeModel { void AddGenerator(PlaylistGeneratorPtr gen); void UpdateGenerator(const QModelIndex &idx, PlaylistGeneratorPtr gen); void DeleteGenerator(const QModelIndex &idx); + void RestoreDefaults(); private: QVariant data(const QModelIndex &idx, int role = Qt::DisplayRole) const override; @@ -79,6 +80,7 @@ class SmartPlaylistsModel : public SimpleTreeModel { static void SaveGenerator(Settings *s, const int i, PlaylistGeneratorPtr generator); void ItemFromSmartPlaylist(const Settings &s, const bool notify); + void WriteDefaultsToSettings(Settings *s, const int start_version, const int start_index); private: SharedPtr collection_backend_; diff --git a/src/smartplaylists/smartplaylistsviewcontainer.cpp b/src/smartplaylists/smartplaylistsviewcontainer.cpp index 10c969643..970af9ea7 100644 --- a/src/smartplaylists/smartplaylistsviewcontainer.cpp +++ b/src/smartplaylists/smartplaylistsviewcontainer.cpp @@ -60,6 +60,7 @@ SmartPlaylistsViewContainer::SmartPlaylistsViewContainer(const SharedPtr action_new_smart_playlist_(nullptr), action_edit_smart_playlist_(nullptr), action_delete_smart_playlist_(nullptr), + action_restore_defaults_(nullptr), action_append_to_playlist_(nullptr), action_replace_current_playlist_(nullptr), action_open_in_new_playlist_(nullptr), @@ -74,6 +75,7 @@ SmartPlaylistsViewContainer::SmartPlaylistsViewContainer(const SharedPtr model_->Init(); action_new_smart_playlist_ = context_menu_->addAction(IconLoader::Load(u"document-new"_s), tr("New smart playlist..."), this, &SmartPlaylistsViewContainer::NewSmartPlaylist); + action_restore_defaults_ = context_menu_->addAction(IconLoader::Load(u"view-refresh"_s), tr("Restore defaults"), this, &SmartPlaylistsViewContainer::RestoreDefaultsFromContext); action_append_to_playlist_ = context_menu_selected_->addAction(IconLoader::Load(u"media-playback-start"_s), tr("Append to current playlist"), this, &SmartPlaylistsViewContainer::AppendToPlaylist); action_replace_current_playlist_ = context_menu_selected_->addAction(IconLoader::Load(u"media-playback-start"_s), tr("Replace current playlist"), this, &SmartPlaylistsViewContainer::ReplaceCurrentPlaylist); @@ -90,13 +92,16 @@ SmartPlaylistsViewContainer::SmartPlaylistsViewContainer(const SharedPtr action_delete_smart_playlist_ = context_menu_selected_->addAction(IconLoader::Load(u"edit-delete"_s), tr("Delete smart playlist"), this, &SmartPlaylistsViewContainer::DeleteSmartPlaylistFromContext); context_menu_selected_->addSeparator(); + context_menu_selected_->addAction(action_restore_defaults_); ui_->new_->setDefaultAction(action_new_smart_playlist_); ui_->edit_->setIcon(IconLoader::Load(u"edit-rename"_s)); ui_->delete_->setIcon(IconLoader::Load(u"edit-delete"_s)); + ui_->restore_->setIcon(IconLoader::Load(u"view-refresh"_s)); QObject::connect(ui_->edit_, &QToolButton::clicked, this, &SmartPlaylistsViewContainer::EditSmartPlaylistFromButton); QObject::connect(ui_->delete_, &QToolButton::clicked, this, &SmartPlaylistsViewContainer::DeleteSmartPlaylistFromButton); + QObject::connect(ui_->restore_, &QToolButton::clicked, this, &SmartPlaylistsViewContainer::RestoreDefaults); QObject::connect(ui_->view, &SmartPlaylistsView::ItemsSelectedChanged, this, &SmartPlaylistsViewContainer::ItemsSelectedChanged); QObject::connect(ui_->view, &SmartPlaylistsView::doubleClicked, this, &SmartPlaylistsViewContainer::ItemDoubleClicked); @@ -130,6 +135,7 @@ void SmartPlaylistsViewContainer::ReloadSettings() { ui_->new_->setIconSize(QSize(iconsize, iconsize)); ui_->delete_->setIconSize(QSize(iconsize, iconsize)); ui_->edit_->setIconSize(QSize(iconsize, iconsize)); + ui_->restore_->setIconSize(QSize(iconsize, iconsize)); } @@ -304,3 +310,15 @@ void SmartPlaylistsViewContainer::ItemDoubleClicked(const QModelIndex &idx) { Q_EMIT AddToPlaylist(q_mimedata); } + +void SmartPlaylistsViewContainer::RestoreDefaultsFromContext() { + + RestoreDefaults(); + +} + +void SmartPlaylistsViewContainer::RestoreDefaults() { + + model_->RestoreDefaults(); + +} diff --git a/src/smartplaylists/smartplaylistsviewcontainer.h b/src/smartplaylists/smartplaylistsviewcontainer.h index e42226978..feb44046f 100644 --- a/src/smartplaylists/smartplaylistsviewcontainer.h +++ b/src/smartplaylists/smartplaylistsviewcontainer.h @@ -83,11 +83,13 @@ class SmartPlaylistsViewContainer : public QWidget { void EditSmartPlaylist(const QModelIndex &idx); void DeleteSmartPlaylist(const QModelIndex &idx); + void RestoreDefaults(); void EditSmartPlaylistFromButton(); void DeleteSmartPlaylistFromButton(); void EditSmartPlaylistFromContext(); void DeleteSmartPlaylistFromContext(); + void RestoreDefaultsFromContext(); void NewSmartPlaylistFinished(); void EditSmartPlaylistFinished(); @@ -113,6 +115,7 @@ class SmartPlaylistsViewContainer : public QWidget { QAction *action_new_smart_playlist_; QAction *action_edit_smart_playlist_; QAction *action_delete_smart_playlist_; + QAction *action_restore_defaults_; QAction *action_append_to_playlist_; QAction *action_replace_current_playlist_; QAction *action_open_in_new_playlist_; diff --git a/src/smartplaylists/smartplaylistsviewcontainer.ui b/src/smartplaylists/smartplaylistsviewcontainer.ui index 93b0d7a18..b08ac71c7 100644 --- a/src/smartplaylists/smartplaylistsviewcontainer.ui +++ b/src/smartplaylists/smartplaylistsviewcontainer.ui @@ -95,6 +95,19 @@ + + + + Restore defaults + + + + 22 + 22 + + + +