diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index fff156733..e5f15c1b1 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -131,6 +131,7 @@ MainWindow::MainWindow(QNetworkAccessManager* network, QWidget *parent) connect(ui_.action_clear_playlist, SIGNAL(triggered()), playlist_, SLOT(Clear())); connect(ui_.action_edit_track, SIGNAL(triggered()), SLOT(EditTracks())); connect(ui_.action_renumber_tracks, SIGNAL(triggered()), SLOT(RenumberTracks())); + connect(ui_.action_selection_set_value, SIGNAL(triggered()), SLOT(SelectionSetValue())); connect(ui_.action_configure, SIGNAL(triggered()), settings_dialog_, SLOT(show())); connect(ui_.action_about, SIGNAL(triggered()), about_dialog_, SLOT(show())); connect(ui_.action_shuffle, SIGNAL(triggered()), playlist_, SLOT(Shuffle())); @@ -236,8 +237,10 @@ MainWindow::MainWindow(QNetworkAccessManager* network, QWidget *parent) playlist_play_pause_ = playlist_menu_->addAction(tr("Play"), this, SLOT(PlaylistPlay())); playlist_menu_->addAction(ui_.action_stop); playlist_stop_after_ = playlist_menu_->addAction(QIcon(":media-playback-stop.png"), tr("Stop after this track"), this, SLOT(PlaylistStopAfter())); + playlist_menu_->addSeparator(); playlist_menu_->addAction(ui_.action_edit_track); playlist_menu_->addAction(ui_.action_renumber_tracks); + playlist_menu_->addAction(ui_.action_selection_set_value); playlist_menu_->addSeparator(); playlist_menu_->addAction(ui_.action_clear_playlist); playlist_menu_->addAction(ui_.action_shuffle); @@ -569,18 +572,28 @@ void MainWindow::PlaylistRightClick(const QPoint& global_pos, const QModelIndex& playlist_stop_after_->setEnabled(index.isValid()); // Are any of the selected songs editable? - bool editable = false; + int editable = 0; foreach (const QModelIndex& index, ui_.playlist->selectionModel()->selection().indexes()) { if (index.column() != 0) continue; if (playlist_->item_at(index.row())->Metadata().IsEditable()) { - editable = true; - break; + editable++; } } ui_.action_edit_track->setEnabled(editable); ui_.action_renumber_tracks->setEnabled(editable); + ui_.action_selection_set_value->setEnabled(editable >= 2); + + Playlist::Column column = (Playlist::Column)playlist_menu_index_.column(); + ui_.action_selection_set_value->setVisible( + column <= Playlist::Column_Genre && + column != Playlist::Column_Length); + + QString column_name = Playlist::column_name(column); + QString column_value = playlist_->data(playlist_menu_index_).toString(); + ui_.action_selection_set_value->setText(tr("Set %1 to \"%2\"...") + .arg(column_name.toLower()).arg(column_value)); playlist_menu_->popup(global_pos); } @@ -647,6 +660,54 @@ void MainWindow::RenumberTracks() { } } +void MainWindow::SelectionSetValue() { + Playlist::Column column = (Playlist::Column)playlist_menu_index_.column(); + QVariant column_value = playlist_->data(playlist_menu_index_); + + QModelIndexList indexes=ui_.playlist->selectionModel()->selection().indexes(); + foreach (const QModelIndex& index, indexes) { + if (index.column() != 0) + continue; + + int row = index.row(); + Song song = playlist_->item_at(row)->Metadata(); + + if (song.IsEditable()) { + switch(column) { + case Playlist::Column_Title: + song.set_title(column_value.toString()); + break; + case Playlist::Column_Artist: + song.set_artist(column_value.toString()); + break; + case Playlist::Column_Album: + song.set_album(column_value.toString()); + break; + case Playlist::Column_AlbumArtist: + song.set_albumartist(column_value.toString()); + break; + case Playlist::Column_Composer: + song.set_composer(column_value.toString()); + break; + case Playlist::Column_Track: + song.set_track(column_value.toInt()); + break; + case Playlist::Column_Disc: + song.set_disc(column_value.toInt()); + break; + case Playlist::Column_Year: + song.set_year(column_value.toInt()); + break; + case Playlist::Column_Genre: + song.set_genre(column_value.toString()); + break; + } + song.Save(); + playlist_->item_at(row)->Reload(); + } + } +} + void MainWindow::LibraryScanStarted() { multi_loading_indicator_->TaskStarted(MultiLoadingIndicator::UpdatingLibrary); } diff --git a/src/mainwindow.h b/src/mainwindow.h index 77fcb6cee..f8b5964f2 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -73,6 +73,7 @@ class MainWindow : public QMainWindow { void PlaylistStopAfter(); void EditTracks(); void RenumberTracks(); + void SelectionSetValue(); void PlayIndex(const QModelIndex& index); void StopAfterCurrent(); diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 91b9723d6..4bee0cfe1 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -656,14 +656,15 @@ - - - :/edit-track.png:/edit-track.png - Renumber tracks in this order... + + + Set value for all selected tracks... + + diff --git a/src/playlist.cpp b/src/playlist.cpp index 1442ca37e..9eee6c7c9 100644 --- a/src/playlist.cpp +++ b/src/playlist.cpp @@ -57,28 +57,9 @@ QVariant Playlist::headerData(int section, Qt::Orientation, int role) const { if (role != Qt::DisplayRole) return QVariant(); - switch (section) { - case Column_Title: return tr("Title"); - case Column_Artist: return tr("Artist"); - case Column_Album: return tr("Album"); - case Column_Length: return tr("Length"); - case Column_Track: return tr("Track"); - case Column_Disc: return tr("Disc"); - case Column_Year: return tr("Year"); - case Column_Genre: return tr("Genre"); - case Column_AlbumArtist: return tr("Album artist"); - case Column_Composer: return tr("Composer"); - - case Column_BPM: return tr("BPM"); - case Column_Bitrate: return tr("Bit rate"); - case Column_Samplerate: return tr("Sample rate"); - case Column_Filename: return tr("File name"); - case Column_BaseFilename: return tr("File name (without path)"); - case Column_Filesize: return tr("File size"); - case Column_Filetype: return tr("File type"); - case Column_DateModified: return tr("Date modified"); - case Column_DateCreated: return tr("Date created"); - } + QString name = column_name((Playlist::Column)section); + if(name.size()) + return name; return QVariant(); } @@ -468,6 +449,32 @@ bool Playlist::CompareItems(int column, Qt::SortOrder order, return false; } +QString Playlist::column_name(Column column) { + switch (column) { + case Column_Title: return tr("Title"); + case Column_Artist: return tr("Artist"); + case Column_Album: return tr("Album"); + case Column_Length: return tr("Length"); + case Column_Track: return tr("Track"); + case Column_Disc: return tr("Disc"); + case Column_Year: return tr("Year"); + case Column_Genre: return tr("Genre"); + case Column_AlbumArtist: return tr("Album artist"); + case Column_Composer: return tr("Composer"); + + case Column_BPM: return tr("BPM"); + case Column_Bitrate: return tr("Bit rate"); + case Column_Samplerate: return tr("Sample rate"); + case Column_Filename: return tr("File name"); + case Column_BaseFilename: return tr("File name (without path)"); + case Column_Filesize: return tr("File size"); + case Column_Filetype: return tr("File type"); + case Column_DateModified: return tr("Date modified"); + case Column_DateCreated: return tr("Date created"); + } + return ""; +} + void Playlist::sort(int column, Qt::SortOrder order) { if (ignore_sorting_) return; diff --git a/src/playlist.h b/src/playlist.h index 5f951ad57..b2115b179 100644 --- a/src/playlist.h +++ b/src/playlist.h @@ -71,6 +71,8 @@ class Playlist : public QAbstractListModel { static bool CompareItems(int column, Qt::SortOrder order, const PlaylistItem* a, const PlaylistItem* b); + static QString column_name(Column column); + // Persistence void Save() const; void Restore();