SmartPlaylists: Add option to restore smart playlists to the defaults

Fixes #1848
This commit is contained in:
Jonas Kvinge
2025-12-19 00:49:05 +01:00
parent 63c14e014b
commit 4a5afbeb1e
5 changed files with 79 additions and 6 deletions

View File

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

View File

@@ -66,6 +66,7 @@ class SmartPlaylistsModel : public SimpleTreeModel<SmartPlaylistsItem> {
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<SmartPlaylistsItem> {
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<CollectionBackend> collection_backend_;

View File

@@ -60,6 +60,7 @@ SmartPlaylistsViewContainer::SmartPlaylistsViewContainer(const SharedPtr<Player>
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<Player>
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<Player>
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();
}

View File

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

View File

@@ -95,6 +95,19 @@
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="restore_">
<property name="toolTip">
<string>Restore defaults</string>
</property>
<property name="iconSize">
<size>
<width>22</width>
<height>22</height>
</size>
</property>
</widget>
</item>
<item>
<spacer name="spacer_buttons">
<property name="orientation">