24 #include "ui_cdinfodialog.h"
27 #include <QStringList>
28 #include <QStandardItemModel>
32 #include <kcharsets.h>
39 class CDInfoDialog::Private
43 : ui(new Ui::CDInfoDialogBase)
50 Ui::CDInfoDialogBase* ui;
51 static QLatin1String SEPARATOR;
52 static const unsigned TRACK_NUMBER = 0;
53 static const unsigned TRACK_TIME = 1;
54 static const unsigned TRACK_TITLE = 2;
55 static const unsigned TRACK_ARTIST = 3;
56 static const unsigned TRACK_COMMENT = 4;
59 QLatin1String CDInfoDialog::Private::SEPARATOR = QLatin1String(
" / " );
69 d->info.set(QLatin1String(
"source" ), QLatin1String(
"user" ));
72 d->ui->m_category->addItems(d->categories.i18nList());
74 d->ui->m_genre->addItems(d->genres.i18nList());
76 m_trackModel =
new QStandardItemModel(0, 5,
this);
77 d->ui->m_trackList->setModel(m_trackModel);
83 KGlobal::locale()->insertCatalog( QLatin1String(
"libkcddb" ));
84 connect( d->ui->m_trackList, SIGNAL(activated(QModelIndex)),
this, SLOT(slotTrackSelected(QModelIndex)) );
85 connect( d->ui->m_trackList, SIGNAL(doubleClicked(QModelIndex)),
this, SLOT(slotTrackDoubleClicked(QModelIndex)) );
86 connect( d->ui->m_artist, SIGNAL(textChanged(QString)),
this, SLOT(artistChanged(QString)) );
87 connect( d->ui->m_genre, SIGNAL(textChanged(QString)),
this, SLOT(genreChanged(QString)) );
88 connect( d->ui->m_multiple, SIGNAL(toggled(
bool)),
this, SLOT(slotMultipleArtists(
bool)) );
90 connect(d->ui->m_changeEncoding,SIGNAL(clicked()),SLOT(slotChangeEncoding()));
93 void CDInfoDialog::slotTrackSelected(
const QModelIndex &index )
95 emit
play(index.data().toUInt()-1);
106 void CDInfoDialog::slotNextTrack()
117 void CDInfoDialog::slotTrackDoubleClicked(
const QModelIndex &index)
126 d->ui->m_artist->setText(info.
get(
Artist).toString().trimmed());
127 d->ui->m_title->setText(info.
get(
Title).toString().trimmed());
128 d->ui->m_category->setItemText(d->ui->m_category->currentIndex(), d->categories.cddb2i18n(info.
get(
Category).toString()));
131 d->ui->m_revision->setText(QString::number(info.
get(QLatin1String(
"revision" )).toInt()));
132 d->ui->m_genre->setItemText(d->ui->m_genre->currentIndex(), d->genres.cddb2i18n(info.
get(
Genre).toString()));
133 d->ui->m_year->setValue(info.
get(
Year).toInt());
134 d->ui->m_comment->setText(info.
get(
Comment).toString().trimmed());
135 d->ui->m_id->setText(info.
get(QLatin1String(
"discid" )).toString().trimmed());
141 d->ui->m_length->setText(framesTime(trackStartFrames[tracks] - trackStartFrames[0]));
144 m_trackModel->clear();
146 labels << i18n(
"Track") << i18n(
"Length") << i18n(
"Title") << i18n(
"Artist") << i18n(
"Comment");
147 m_trackModel->setHorizontalHeaderLabels(labels);
148 for (
unsigned i = 0; i < tracks; i++) {
149 QList<QStandardItem *> trackItems = QList<QStandardItem *>();
151 QStandardItem *trackNumberItem =
new QStandardItem(QString().sprintf(
"%02d", i + 1));
152 trackNumberItem->setEditable(FALSE);
153 trackItems << trackNumberItem;
154 QStandardItem *trackLengthItem =
new QStandardItem(framesTime(trackStartFrames[i + 1] - trackStartFrames[i]));
155 trackLengthItem->setEditable(FALSE);
156 trackItems << trackLengthItem;
157 QStandardItem *trackTitleItem =
new QStandardItem(ti.get(
Title).toString());
158 trackItems << trackTitleItem;
159 QStandardItem *trackArtistItem =
new QStandardItem(ti.get(
Artist).toString());
160 trackItems << trackArtistItem;
161 QStandardItem *trackCommentItem =
new QStandardItem(ti.get(
Comment).toString());
162 trackItems << trackCommentItem;
164 m_trackModel->appendRow(trackItems);
168 if (info.
get(
Artist).toString() == QLatin1String(
"Various" ) || d->ui->m_multiple->isChecked()){
169 d->ui->m_trackList->resizeColumnToContents(Private::TRACK_ARTIST);
173 QString CDInfoDialog::framesTime(
unsigned frames)
178 ms = frames * 1000 / 75.0;
179 time = time.addMSecs((
int)ms);
184 temp2 = time.toString(QLatin1String(
"hh:mm:ss" ));
186 temp2 = time.toString(QLatin1String(
"mm:ss" ));
194 info.
set(
Artist, d->ui->m_artist->text().trimmed());
195 info.
set(
Title, d->ui->m_title->text().trimmed());
196 info.
set(
Category, d->categories.i18n2cddb(d->ui->m_category->currentText()));
197 info.
set(
Genre, d->genres.i18n2cddb(d->ui->m_genre->currentText()));
198 info.
set(
Year, d->ui->m_year->value());
199 info.
set(
Comment, d->ui->m_comment->text().trimmed());
200 info.
set(QLatin1String(
"revision" ), d->ui->m_revision->text().trimmed().toUInt());
201 info.
set(QLatin1String(
"discid" ), d->ui->m_id->text().trimmed());
203 for (
int t = 0; t < m_trackModel->rowCount(); ++t) {
205 track.
set(
Artist, m_trackModel->index(t, Private::TRACK_ARTIST).data().toString().trimmed());
206 track.
set(
Title, m_trackModel->index(t, Private::TRACK_TITLE).data().toString().trimmed());
207 track.
set(
Comment, m_trackModel->index(t, Private::TRACK_COMMENT).data().toString().trimmed());
215 void CDInfoDialog::artistChanged(
const QString &newArtist )
218 if (newArtist.trimmed().compare(QLatin1String(
"Various" ))) {
219 d->ui->m_multiple->setChecked(
false);
221 d->ui->m_multiple->setChecked(
true);
225 void CDInfoDialog::genreChanged(
const QString &newGenre )
230 d->ui->m_category->setEnabled((d->ui->m_revision->text().trimmed().toUInt() < 1) ||
231 (newGenre.compare(QLatin1String(
"Unknown" )) == 0));
235 void CDInfoDialog::slotMultipleArtists(
bool hasMultipleArtist)
237 if (hasMultipleArtist) {
238 for (
int t = 0; t < m_trackModel->rowCount(); ++t) {
239 QString title = m_trackModel->index(t, Private::TRACK_TITLE).data().toString();
240 int separator = title.indexOf(Private::SEPARATOR);
241 if (separator != -1) {
243 m_trackModel->setData(m_trackModel->index(t, Private::TRACK_ARTIST), title.left(separator));
244 m_trackModel->setData(m_trackModel->index(t, Private::TRACK_TITLE), title.mid(separator + 3));
247 d->ui->m_trackList->resizeColumnToContents(Private::TRACK_ARTIST);
248 d->ui->m_trackList->resizeColumnToContents(Private::TRACK_TITLE);
250 for (
int t = 0; t < m_trackModel->rowCount(); ++t) {
251 QString artist = m_trackModel->index(t, Private::TRACK_ARTIST).data().toString();
252 if (!artist.isEmpty()) {
253 m_trackModel->setData(m_trackModel->index(t, Private::TRACK_ARTIST), QString());
254 QString title = m_trackModel->index(t, Private::TRACK_TITLE).data().toString();
255 m_trackModel->setData(m_trackModel->index(t, Private::TRACK_TITLE), artist + Private::SEPARATOR + title);
258 d->ui->m_trackList->hideColumn(Private::TRACK_ARTIST);
259 d->ui->m_trackList->resizeColumnToContents(Private::TRACK_TITLE);
264 void CDInfoDialog::slotChangeEncoding()
267 dialog->setCaption(i18n(
"Change Encoding"));
268 dialog->setButtons( KDialog::Ok | KDialog::Cancel);
269 dialog->setModal(
true );
272 QStringList songTitles;
273 for (
int t = 0; t < m_trackModel->rowCount(); ++t) {
274 QString title = m_trackModel->index(t, Private::TRACK_ARTIST).data().toString().trimmed();
275 if (!title.isEmpty())
276 title.append(Private::SEPARATOR);
277 title.append(m_trackModel->index(t, Private::TRACK_TITLE).data().toString().trimmed());
282 dialog, d->ui->m_artist->text(),d->ui->m_title->text(), songTitles);
284 dialog->setMainWidget(encWidget);
288 KCharsets* charsets = KGlobal::charsets();
289 QTextCodec* codec = charsets->codecForName(charsets->encodingForName(encWidget->
selectedEncoding()));
291 d->ui->m_artist->setText(codec->toUnicode(d->ui->m_artist->text().toLatin1()));
292 d->ui->m_title->setText(codec->toUnicode(d->ui->m_title->text().toLatin1()));
293 d->ui->m_genre->setItemText(d->ui->m_genre->currentIndex(), codec->toUnicode(d->ui->m_genre->currentText().toLatin1()));
294 d->ui->m_comment->setText(codec->toUnicode(d->ui->m_comment->text().toLatin1()));
296 QModelIndex trackIndex = m_trackModel->index(0, 0, QModelIndex());
297 int trackRows = m_trackModel->rowCount(trackIndex);
298 for (
int t = 0; t < trackRows; ++t) {
299 QString artist = m_trackModel->index(t, Private::TRACK_ARTIST, trackIndex).data().toString();
300 m_trackModel->setData(m_trackModel->index(t, Private::TRACK_ARTIST, trackIndex), codec->toUnicode(artist.toLatin1()));
301 QString title = m_trackModel->index(t, Private::TRACK_TITLE, trackIndex).data().toString();
302 m_trackModel->setData(m_trackModel->index(t, Private::TRACK_TITLE, trackIndex), codec->toUnicode(title.toLatin1()));
303 QString comment = m_trackModel->index(t, Private::TRACK_COMMENT, trackIndex).data().toString();
304 m_trackModel->setData(m_trackModel->index(t, Private::TRACK_COMMENT, trackIndex), codec->toUnicode(comment.toLatin1()));
310 #include "cdinfodialog.moc"
CDInfoDialog(QWidget *parent)
The title of the track or CD.
The freedb category of the entry.
Category values defined by CDDB.
QVariant get(const QString &type) const
Get data for type that has been assigned to this disc.
The Genre is completely arbitrary.
void setInfo(const KCDDB::CDInfo &info, const KCDDB::TrackOffsetList &trackStartFrames)
The genre of the track or CD.
A comment for the track or CD.
TrackInfo & track(int trackNumber)
Returns track with nr trackNumber and adds it to the track list if it doesn't exist (first track is 0...
void set(const QString &type, const QVariant &data)
Set any data from this disc.
The artist of the track or CD.
KCDDB::CDInfo info() const
QList< uint > TrackOffsetList
This list is used to calculate the CDDB disc id.
The year the cd or track was produced By default, the year of the track is the same as for the whole ...
int numberOfTracks() const
Returns number of tracks on CD.
Information about a sepecific track in a cd.
void set(const QString &type, const QVariant &data)
Set any data from this track.