Clementine-audio-player-Mac.../src/edittagdialog.cpp

144 lines
4.0 KiB
C++

/* This file is part of Clementine.
Clementine is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Clementine is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Clementine. If not, see <http://www.gnu.org/licenses/>.
*/
#include "playlistdelegates.h"
#include "edittagdialog.h"
#include "library.h"
#include <QtDebug>
const char* EditTagDialog::kHintText = QT_TR_NOOP("[click to edit]");
EditTagDialog::EditTagDialog(QWidget* parent)
: QDialog(parent)
{
ui_.setupUi(this);
}
bool EditTagDialog::SetSongs(const SongList &s) {
SongList songs;
foreach (const Song& song, s) {
if (song.IsEditable())
songs << song;
}
songs_ = songs;
if (songs.count() == 0)
return false;
// Don't allow editing of fields that don't make sense for multiple items
ui_.title->setEnabled(songs.count() == 1);
ui_.track->setEnabled(songs.count() == 1);
ui_.comment->setEnabled(songs.count() == 1);
common_artist_ = songs[0].artist();
common_album_ = songs[0].album();
common_genre_ = songs[0].genre();
common_year_ = songs[0].year();
if (songs.count() == 1) {
const Song& song = songs[0];
ui_.title->setText(song.title());
ui_.artist->setText(song.artist());
ui_.album->setText(song.album());
ui_.genre->setText(song.genre());
ui_.year->setValue(song.year());
ui_.track->setValue(song.track());
ui_.comment->setPlainText(song.comment());
ui_.filename->setText(song.filename());
ui_.artist->ClearHint();
ui_.album->ClearHint();
ui_.genre->ClearHint();
} else {
// Find any fields that are common to all items
ui_.title->clear();
ui_.track->clear();
ui_.comment->clear();
foreach (const Song& song, songs) {
if (common_artist_ != song.artist()) {
common_artist_ = QString::null;
ui_.artist->SetHint(kHintText);
}
if (common_album_ != song.album()) {
common_album_ = QString::null;
ui_.album->SetHint(kHintText);
}
if (common_genre_ != song.genre()) {
common_genre_ = QString::null;
ui_.genre->SetHint(kHintText);
}
if (common_year_ != song.year())
common_year_ = -1;
}
ui_.artist->setText(common_artist_);
ui_.album->setText(common_album_);
ui_.genre->setText(common_genre_);
ui_.year->setValue(common_year_);
ui_.filename->setText(tr("Editing %n tracks", "", songs.count()));
}
return true;
}
void EditTagDialog::SetTagCompleter(LibraryBackend* backend) {
new TagCompleter(backend, Playlist::Column_Artist, ui_.artist);
new TagCompleter(backend, Playlist::Column_Album, ui_.album);
}
void EditTagDialog::accept() {
foreach (const Song& old, songs_) {
Song song(old);
int track = ui_.track->text().isEmpty() ? -1 : ui_.track->value();
int year = ui_.year->text().isEmpty() ? -1 : ui_.year->value();
if (ui_.title->isEnabled())
song.set_title(ui_.title->text());
if (ui_.artist->isEnabled() && !(common_artist_.isNull() && ui_.artist->text().isEmpty()))
song.set_artist(ui_.artist->text());
if (ui_.album->isEnabled() && !(common_album_.isNull() && ui_.album->text().isEmpty()))
song.set_album(ui_.album->text());
if (ui_.genre->isEnabled() && !(common_genre_.isNull() && ui_.genre->text().isEmpty()))
song.set_genre(ui_.genre->text());
if (ui_.year->isEnabled() && !(common_year_ == -1 && year == -1))
song.set_year(year);
if (ui_.track->isEnabled())
song.set_track(track);
if (ui_.comment->isEnabled())
song.set_comment(ui_.comment->toPlainText());
song.Save();
emit SongEdited(old, song);
}
QDialog::accept();
}