diff --git a/data/icons.qrc b/data/icons.qrc index eb488f7b..59e94625 100644 --- a/data/icons.qrc +++ b/data/icons.qrc @@ -24,6 +24,7 @@ icons/128x128/document-open-folder.png icons/128x128/document-open.png icons/128x128/document-save.png + icons/128x128/document-save-all.png icons/128x128/document-search.png icons/128x128/download.png icons/128x128/edit-clear-list.png @@ -120,6 +121,7 @@ icons/64x64/document-open-folder.png icons/64x64/document-open.png icons/64x64/document-save.png + icons/64x64/document-save-all.png icons/64x64/document-search.png icons/64x64/download.png icons/64x64/edit-clear-list.png @@ -218,6 +220,7 @@ icons/48x48/document-open-remote.png icons/48x48/document-open.png icons/48x48/document-save.png + icons/48x48/document-save-all.png icons/48x48/document-search.png icons/48x48/download.png icons/48x48/edit-clear-list.png @@ -319,6 +322,7 @@ icons/32x32/document-open-remote.png icons/32x32/document-open.png icons/32x32/document-save.png + icons/32x32/document-save-all.png icons/32x32/document-search.png icons/32x32/download.png icons/32x32/edit-clear-list.png @@ -420,6 +424,7 @@ icons/22x22/document-open-remote.png icons/22x22/document-open.png icons/22x22/document-save.png + icons/22x22/document-save-all.png icons/22x22/document-search.png icons/22x22/download.png icons/22x22/edit-clear-list.png diff --git a/data/icons/128x128/document-save-all.png b/data/icons/128x128/document-save-all.png new file mode 100644 index 00000000..d925be45 Binary files /dev/null and b/data/icons/128x128/document-save-all.png differ diff --git a/data/icons/22x22/document-save-all.png b/data/icons/22x22/document-save-all.png new file mode 100644 index 00000000..159857f5 Binary files /dev/null and b/data/icons/22x22/document-save-all.png differ diff --git a/data/icons/32x32/document-save-all.png b/data/icons/32x32/document-save-all.png new file mode 100644 index 00000000..45e7af3b Binary files /dev/null and b/data/icons/32x32/document-save-all.png differ diff --git a/data/icons/48x48/document-save-all.png b/data/icons/48x48/document-save-all.png new file mode 100644 index 00000000..3e409979 Binary files /dev/null and b/data/icons/48x48/document-save-all.png differ diff --git a/data/icons/64x64/document-save-all.png b/data/icons/64x64/document-save-all.png new file mode 100644 index 00000000..31821bb1 Binary files /dev/null and b/data/icons/64x64/document-save-all.png differ diff --git a/data/icons/full/document-save-all.png b/data/icons/full/document-save-all.png new file mode 100644 index 00000000..d925be45 Binary files /dev/null and b/data/icons/full/document-save-all.png differ diff --git a/src/core/mainwindow.cpp b/src/core/mainwindow.cpp index 8ba25112..a3e0967a 100644 --- a/src/core/mainwindow.cpp +++ b/src/core/mainwindow.cpp @@ -458,6 +458,7 @@ MainWindow::MainWindow(Application *app, std::shared_ptr tray_ic ui_->action_remove_duplicates->setIcon(IconLoader::Load("list-remove")); ui_->action_remove_unavailable->setIcon(IconLoader::Load("list-remove")); ui_->action_remove_from_playlist->setIcon(IconLoader::Load("list-remove")); + ui_->action_save_all_playlists->setIcon(IconLoader::Load("document-save-all")); // Configure @@ -563,8 +564,7 @@ MainWindow::MainWindow(Application *app, std::shared_ptr tray_ic ui_->button_scrobble->setDefaultAction(ui_->action_toggle_scrobbling); ui_->button_love->setDefaultAction(ui_->action_love); - ui_->playlist->SetActions(ui_->action_new_playlist, ui_->action_load_playlist, ui_->action_save_playlist, ui_->action_clear_playlist, ui_->action_next_playlist, /* These two actions aren't associated */ ui_->action_previous_playlist /* to a button but to the main window */ ); - + ui_->playlist->SetActions(ui_->action_new_playlist, ui_->action_load_playlist, ui_->action_save_playlist, ui_->action_clear_playlist, ui_->action_next_playlist, /* These two actions aren't associated */ ui_->action_previous_playlist /* to a button but to the main window */, ui_->action_save_all_playlists); // Add the shuffle and repeat action groups to the menu ui_->action_shuffle_mode->setMenu(ui_->playlist_sequence->shuffle_menu()); ui_->action_repeat_mode->setMenu(ui_->playlist_sequence->repeat_menu()); diff --git a/src/core/mainwindow.ui b/src/core/mainwindow.ui index 37fb9ae5..f9e2aa83 100644 --- a/src/core/mainwindow.ui +++ b/src/core/mainwindow.ui @@ -483,6 +483,7 @@ + @@ -747,6 +748,11 @@ Ctrl+Shift+O + + + &Save all playlists + + Go to next playlist tab diff --git a/src/playlist/playlistcontainer.cpp b/src/playlist/playlistcontainer.cpp index 443b5b22..f2541c19 100644 --- a/src/playlist/playlistcontainer.cpp +++ b/src/playlist/playlistcontainer.cpp @@ -132,7 +132,7 @@ PlaylistContainer::~PlaylistContainer() { delete ui_; } PlaylistView *PlaylistContainer::view() const { return ui_->playlist; } -void PlaylistContainer::SetActions(QAction *new_playlist, QAction *load_playlist, QAction *save_playlist, QAction *clear_playlist, QAction *next_playlist, QAction *previous_playlist) { +void PlaylistContainer::SetActions(QAction *new_playlist, QAction *load_playlist, QAction *save_playlist, QAction *clear_playlist, QAction *next_playlist, QAction *previous_playlist, QAction *save_all_playlists) { ui_->create_new->setDefaultAction(new_playlist); ui_->load->setDefaultAction(load_playlist); @@ -148,6 +148,7 @@ void PlaylistContainer::SetActions(QAction *new_playlist, QAction *load_playlist QObject::connect(next_playlist, &QAction::triggered, this, &PlaylistContainer::GoToNextPlaylistTab); QObject::connect(previous_playlist, &QAction::triggered, this, &PlaylistContainer::GoToPreviousPlaylistTab); QObject::connect(clear_playlist, &QAction::triggered, this, &PlaylistContainer::ClearPlaylist); + QObject::connect(save_all_playlists, &QAction::triggered, manager_, &PlaylistManager::SaveAllPlaylists); } diff --git a/src/playlist/playlistcontainer.h b/src/playlist/playlistcontainer.h index 23dbb609..eacab439 100644 --- a/src/playlist/playlistcontainer.h +++ b/src/playlist/playlistcontainer.h @@ -53,7 +53,7 @@ class PlaylistContainer : public QWidget { static const char *kSettingsGroup; - void SetActions(QAction *new_playlist, QAction *load_playlist, QAction *save_playlist, QAction *clear_playlist, QAction *next_playlist, QAction *previous_playlist); + void SetActions(QAction *new_playlist, QAction *load_playlist, QAction *save_playlist, QAction *clear_playlist, QAction *next_playlist, QAction *previous_playlist, QAction *save_all_playlists); void SetManager(PlaylistManager *manager); void ReloadSettings(); diff --git a/src/playlist/playlistmanager.cpp b/src/playlist/playlistmanager.cpp index 49f7ba01..1fc6d93d 100644 --- a/src/playlist/playlistmanager.cpp +++ b/src/playlist/playlistmanager.cpp @@ -650,3 +650,15 @@ void PlaylistManager::RateCurrentSong(const float rating) { void PlaylistManager::RateCurrentSong2(const int rating) { RateCurrentSong(static_cast(rating) / 5.0F); } + +void PlaylistManager::SaveAllPlaylists() { + + const QString path = QFileDialog::getExistingDirectory(nullptr, tr("Select directory for the playlists"), QDir::homePath(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); + + for (QMap::const_iterator it = playlists_.constBegin(); it != playlists_.constEnd(); ++it) { + const Data &data = *it; + const QString filepath = path + "/" + data.name + ".m3u"; + Save(it.key(), filepath, Playlist::Path_Absolute); + } + +} diff --git a/src/playlist/playlistmanager.h b/src/playlist/playlistmanager.h index 7764ad71..6c696224 100644 --- a/src/playlist/playlistmanager.h +++ b/src/playlist/playlistmanager.h @@ -222,6 +222,8 @@ class PlaylistManager : public PlaylistManagerInterface { // Rate current song using 0 - 5 scale. void RateCurrentSong2(const int rating) override; + void SaveAllPlaylists(); + private slots: void SetActivePlaying() override; void SetActivePaused() override;