File indexing completed on 2024-04-28 08:40:15
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 }