File indexing completed on 2024-04-21 04:48:10

0001 /* AUDEX CDDA EXTRACTOR
0002  * SPDX-FileCopyrightText: Copyright (C) 2007 Marco Nelles
0003  * <https://userbase.kde.org/Audex>
0004  *
0005  * SPDX-License-Identifier: GPL-3.0-or-later
0006  */
0007 
0008 #include "cddaheaderdatadialog.h"
0009 
0010 #include <QDialogButtonBox>
0011 #include <QVBoxLayout>
0012 
0013 #define GENRE_MAX 148
0014 static const char *ID3_GENRES[GENRE_MAX] = {"Blues",
0015                                             "Classic Rock",
0016                                             "Country",
0017                                             "Dance",
0018                                             "Disco",
0019                                             "Funk",
0020                                             "Grunge",
0021                                             "Hip-Hop",
0022                                             "Jazz",
0023                                             "Metal",
0024                                             "New Age",
0025                                             "Oldies",
0026                                             "Other",
0027                                             "Pop",
0028                                             "R&B",
0029                                             "Rap",
0030                                             "Reggae",
0031                                             "Rock",
0032                                             "Techno",
0033                                             "Industrial",
0034                                             "Alternative",
0035                                             "Ska",
0036                                             "Death Metal",
0037                                             "Pranks",
0038                                             "Soundtrack",
0039                                             "Euro-Techno",
0040                                             "Ambient",
0041                                             "Trip-Hop",
0042                                             "Vocal",
0043                                             "Jazz+Funk",
0044                                             "Fusion",
0045                                             "Trance",
0046                                             "Classical",
0047                                             "Instrumental",
0048                                             "Acid",
0049                                             "House",
0050                                             "Game",
0051                                             "Sound Clip",
0052                                             "Gospel",
0053                                             "Noise",
0054                                             "Alt",
0055                                             "Bass",
0056                                             "Soul",
0057                                             "Punk",
0058                                             "Space",
0059                                             "Meditative",
0060                                             "Instrumental Pop",
0061                                             "Instrumental Rock",
0062                                             "Ethnic",
0063                                             "Gothic",
0064                                             "Darkwave",
0065                                             "Techno-Industrial",
0066                                             "Electronic",
0067                                             "Pop-Folk",
0068                                             "Eurodance",
0069                                             "Dream",
0070                                             "Southern Rock",
0071                                             "Comedy",
0072                                             "Cult",
0073                                             "Gangsta Rap",
0074                                             "Top 40",
0075                                             "Christian Rap",
0076                                             "Pop/Funk",
0077                                             "Jungle",
0078                                             "Native American",
0079                                             "Cabaret",
0080                                             "New Wave",
0081                                             "Psychedelic",
0082                                             "Rave",
0083                                             "Showtunes",
0084                                             "Trailer",
0085                                             "Lo-Fi",
0086                                             "Tribal",
0087                                             "Acid Punk",
0088                                             "Acid Jazz",
0089                                             "Polka",
0090                                             "Retro",
0091                                             "Musical",
0092                                             "Rock & Roll",
0093                                             "Hard Rock",
0094                                             "Folk",
0095                                             "Folk/Rock",
0096                                             "National Folk",
0097                                             "Swing",
0098                                             "Fast-Fusion",
0099                                             "Bebob",
0100                                             "Latin",
0101                                             "Revival",
0102                                             "Celtic",
0103                                             "Bluegrass",
0104                                             "Avantgarde",
0105                                             "Gothic Rock",
0106                                             "Progressive Rock",
0107                                             "Psychedelic Rock",
0108                                             "Symphonic Rock",
0109                                             "Slow Rock",
0110                                             "Big Band",
0111                                             "Chorus",
0112                                             "Easy Listening",
0113                                             "Acoustic",
0114                                             "Humour",
0115                                             "Speech",
0116                                             "Chanson",
0117                                             "Opera",
0118                                             "Chamber Music",
0119                                             "Sonata",
0120                                             "Symphony",
0121                                             "Booty Bass",
0122                                             "Primus",
0123                                             "Porn Groove",
0124                                             "Satire",
0125                                             "Slow Jam",
0126                                             "Club",
0127                                             "Tango",
0128                                             "Samba",
0129                                             "Folklore",
0130                                             "Ballad",
0131                                             "Power Ballad",
0132                                             "Rhythmic Soul",
0133                                             "Freestyle",
0134                                             "Duet",
0135                                             "Punk Rock",
0136                                             "Drum Solo",
0137                                             "A Cappella",
0138                                             "Euro-House",
0139                                             "Dance Hall",
0140                                             "Goa",
0141                                             "Drum & Bass",
0142                                             "Club-House",
0143                                             "Hardcore",
0144                                             "Terror",
0145                                             "Indie",
0146                                             "BritPop",
0147                                             "Negerpunk",
0148                                             "Polsk Punk",
0149                                             "Beat",
0150                                             "Christian Gangsta Rap",
0151                                             "Heavy Metal",
0152                                             "Black Metal",
0153                                             "Crossover",
0154                                             "Contemporary Christian",
0155                                             "Christian Rock",
0156                                             "Merengue",
0157                                             "Salsa",
0158                                             "Thrash Metal",
0159                                             "Anime",
0160                                             "JPop",
0161                                             "Synthpop"};
0162 
0163 CDDAHeaderDataDialog::CDDAHeaderDataDialog(CDDAModel *cddaModel, QWidget *parent)
0164     : QDialog(parent)
0165 {
0166     Q_UNUSED(parent);
0167 
0168     cdda_model = cddaModel;
0169     if (!cdda_model) {
0170         qDebug() << "CDDAModel is NULL!";
0171         return;
0172     }
0173 
0174     setWindowTitle(i18n("Edit Data"));
0175 
0176     auto *mainLayout = new QVBoxLayout;
0177     setLayout(mainLayout);
0178 
0179     QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Apply | QDialogButtonBox::Cancel);
0180     okButton = buttonBox->button(QDialogButtonBox::Ok);
0181     applyButton = buttonBox->button(QDialogButtonBox::Apply);
0182     okButton->setDefault(true);
0183     okButton->setShortcut(Qt::CTRL | Qt::Key_Return);
0184     connect(buttonBox, &QDialogButtonBox::accepted, this, &CDDAHeaderDataDialog::slotAccepted);
0185     connect(buttonBox, &QDialogButtonBox::rejected, this, &CDDAHeaderDataDialog::reject);
0186     connect(applyButton, &QPushButton::clicked, this, &CDDAHeaderDataDialog::slotApplied);
0187 
0188     QWidget *widget = new QWidget(this);
0189     mainLayout->addWidget(widget);
0190     mainLayout->addWidget(buttonBox);
0191     ui.setupUi(widget);
0192 
0193     QStringList genres;
0194     for (int i = 0; i < GENRE_MAX; ++i)
0195         genres.append(QString().fromLatin1(ID3_GENRES[i]));
0196     genres.sort();
0197     KCompletion *comp = ui.kcombobox_genre->completionObject();
0198     comp->insertItems(genres);
0199     ui.kcombobox_genre->addItems(genres);
0200     connect(ui.kcombobox_genre, SIGNAL(returnPressed(const QString &)), comp, SLOT(addItem(const QString &)));
0201 
0202     ui.checkBox_various->setChecked(cdda_model->isVarious());
0203     connect(ui.checkBox_various, SIGNAL(toggled(bool)), this, SLOT(trigger_changed()));
0204     ui.checkBox_multicd->setChecked(cdda_model->isMultiCD());
0205     connect(ui.checkBox_multicd, SIGNAL(toggled(bool)), this, SLOT(enable_checkbox_multicd(bool)));
0206     connect(ui.checkBox_multicd, SIGNAL(toggled(bool)), this, SLOT(trigger_changed()));
0207     ui.qlineedit_artist->setText(cdda_model->artist());
0208     connect(ui.qlineedit_artist, SIGNAL(textEdited(const QString &)), this, SLOT(trigger_changed()));
0209     ui.qlineedit_title->setText(cdda_model->title());
0210     connect(ui.qlineedit_title, SIGNAL(textEdited(const QString &)), this, SLOT(trigger_changed()));
0211     ui.kintspinbox_cdnum->setValue(cdda_model->cdNum());
0212     connect(ui.kintspinbox_cdnum, SIGNAL(valueChanged(int)), this, SLOT(trigger_changed()));
0213     ui.kintspinbox_trackoffset->setValue(cdda_model->trackOffset());
0214     connect(ui.kintspinbox_trackoffset, SIGNAL(valueChanged(int)), this, SLOT(trigger_changed()));
0215     ui.kcombobox_genre->lineEdit()->setText(cdda_model->genre());
0216     connect(ui.kcombobox_genre->lineEdit(), SIGNAL(textEdited(const QString &)), this, SLOT(trigger_changed()));
0217     {
0218         bool ok;
0219         int year = cdda_model->year().toInt(&ok);
0220         if (ok)
0221             ui.kintspinbox_year->setValue(year);
0222         else
0223             ui.kintspinbox_year->setValue(QDate::currentDate().year());
0224     }
0225     connect(ui.kintspinbox_year, SIGNAL(valueChanged(int)), this, SLOT(trigger_changed()));
0226     ui.ktextedit_extdata->setText(cdda_model->extendedData().join("\n"));
0227     connect(ui.ktextedit_extdata, SIGNAL(textChanged()), this, SLOT(trigger_changed()));
0228     ui.qlineedit_cddbdiscid->setText(QString("0x%1").arg(DiscIDCalculator::CDDBId(cdda_model->discSignature()), 0, 16));
0229 
0230     enable_checkbox_multicd(cdda_model->isMultiCD());
0231 
0232     applyButton->setEnabled(false);
0233 }
0234 
0235 CDDAHeaderDataDialog::~CDDAHeaderDataDialog()
0236 {
0237 }
0238 
0239 void CDDAHeaderDataDialog::slotAccepted()
0240 {
0241     save();
0242     accept();
0243 }
0244 
0245 void CDDAHeaderDataDialog::slotApplied()
0246 {
0247     save();
0248 }
0249 
0250 void CDDAHeaderDataDialog::save()
0251 {
0252     cdda_model->setVarious(ui.checkBox_various->isChecked());
0253     cdda_model->setMultiCD(ui.checkBox_multicd->isChecked());
0254     cdda_model->setArtist(ui.qlineedit_artist->text());
0255     cdda_model->setTitle(ui.qlineedit_title->text());
0256     cdda_model->setCDNum(ui.kintspinbox_cdnum->value());
0257     cdda_model->setTrackOffset(ui.kintspinbox_trackoffset->value());
0258     cdda_model->setGenre(ui.kcombobox_genre->lineEdit()->text());
0259     cdda_model->setYear(QString("%1").arg(ui.kintspinbox_year->value()));
0260     cdda_model->setExtendedData(ui.ktextedit_extdata->toPlainText().split('\n'));
0261     applyButton->setEnabled(false);
0262 }
0263 
0264 void CDDAHeaderDataDialog::trigger_changed()
0265 {
0266     if (ui.checkBox_various->isChecked() != cdda_model->isVarious()) {
0267         applyButton->setEnabled(true);
0268         return;
0269     }
0270     if (ui.checkBox_multicd->isChecked() != cdda_model->isMultiCD()) {
0271         applyButton->setEnabled(true);
0272         return;
0273     }
0274     if (ui.qlineedit_artist->text() != cdda_model->artist()) {
0275         applyButton->setEnabled(true);
0276         return;
0277     }
0278     if (ui.qlineedit_title->text() != cdda_model->title()) {
0279         applyButton->setEnabled(true);
0280         return;
0281     }
0282     if (ui.checkBox_various->isChecked())
0283         if (ui.kintspinbox_cdnum->value() != cdda_model->cdNum()) {
0284             applyButton->setEnabled(true);
0285             return;
0286         }
0287     if (ui.kintspinbox_trackoffset->value() != cdda_model->trackOffset()) {
0288         applyButton->setEnabled(true);
0289         return;
0290     }
0291     if (ui.kcombobox_genre->lineEdit()->text() != cdda_model->genre()) {
0292         applyButton->setEnabled(true);
0293         return;
0294     }
0295     if (ui.kintspinbox_year->value() != cdda_model->year().toInt()) {
0296         applyButton->setEnabled(true);
0297         return;
0298     }
0299     if (ui.ktextedit_extdata->toPlainText().split('\n') != cdda_model->extendedData()) {
0300         applyButton->setEnabled(true);
0301         return;
0302     }
0303 
0304     applyButton->setEnabled(false);
0305 }
0306 
0307 void CDDAHeaderDataDialog::enable_checkbox_multicd(bool enabled)
0308 {
0309     ui.kintspinbox_cdnum->setEnabled(enabled);
0310     ui.label_cdnum->setEnabled(enabled);
0311 }