25 #include <QListWidget> 26 #include <QPushButton> 27 #include <QRadioButton> 31 #include <QStringList> 43 #include <KConfigGroup> 44 #include <KHelpClient> 45 #include <KLocalizedString> 46 #include <KSharedConfig> 64 #define CONFIG_DEFAULT_SECTION "plugin fileinfo - setup dialog" 68 :QDialog(parent), Ui::FileInfoDlg(), m_info(info)
72 connect(cbCompression, SIGNAL(currentIndexChanged(
int)),
74 connect(cbMpegLayer, SIGNAL(currentIndexChanged(
int)),
76 connect(chkMpegCopyrighted, SIGNAL(clicked(
bool)),
78 connect(chkMpegOriginal, SIGNAL(clicked(
bool)),
80 connect(btHelp->button(QDialogButtonBox::Help), SIGNAL(clicked()),
95 buttonBox->button(QDialogButtonBox::Ok)->setFocus();
106 const QString &description)
109 widget->setToolTip(description);
110 widget->setWhatsThis(
_(
"<b>") + name +
_(
"</b><br>") + description);
128 if (edit) edit->setText(QVariant(
m_info.
get(property)).toString());
137 QString file_name = fi.fileName();
138 edFileName->setText(file_name);
139 edFileName->setEnabled(file_name.length() != 0);
143 if (!mimetype.length())
144 mimetype =
_(
"audio/x-wav");
146 qDebug(
"mimetype = %s",
DBG(mimetype));
153 if (file_name.length()) {
159 qDebug(
"switching mime type to '%s'",
DBG(mt));
169 if (!comps.contains(comp)) {
174 qDebug(
"compression '%s' not supported: switch to '%s'",
181 QList<Kwave::Compression::Type> comps_found;
187 comps_found.append(c);
191 if (!comps_found.isEmpty() && !comps_found.contains(comp)) {
193 (comps_found.isEmpty() && !comps.isEmpty()) ?
194 comps.last() : comps_found.first();
197 qDebug(
"mime type/compression mismatch: " 198 "switch from '%s' to '%s'",
204 edFileFormat->setText(mimetype);
210 QString dotted = QLocale().toString(size);
211 if (size < 10*1024) {
212 edFileSize->setText(i18n(
"%1 bytes", dotted));
213 }
else if (size < 10*1024*1024) {
214 edFileSize->setText(i18n(
"%1 kB (%2 byte)",
215 (size / 1024), dotted));
217 edFileSize->setText(i18n(
"%1 MB (%2 byte)",
218 (size / (1024*1024)), dotted));
221 edFileSize->setEnabled(
false);
230 lblSampleRate->setText(i18n(
"Sample rate:"));
232 lblSampleRate->text().length() - 1),
233 i18n(
"Here you can select one of the predefined\n" 234 "well-known sample rates or you can enter\n" 235 "any sample rate on your own."));
236 cbSampleRate->setEditText(QString::number(
m_info.
rate()));
239 lblResolution->setText(i18n(
"Resolution:"));
241 lblResolution->text().length() - 1),
242 i18n(
"Select a resolution in bits in which the file\n" 247 lblChannels->setText(i18n(
"Tracks:"));
249 lblChannels->text().length() - 1),
250 i18n(
"Shows the number of tracks of the signal.\n" 251 "You can add or delete tracks via the Edit menu."));
255 connect(sbChannels, SIGNAL(valueChanged(
int)),
260 lblLength->setText(i18n(
"Length:"));
262 lblLength->text().length() - 1),
263 i18n(
"Shows the length of the file in samples\n" 264 "and if possible as time."));
267 if (!qFuzzyIsNull(rate)) {
268 double ms =
static_cast<double>(samples) * 1E3 / rate;
269 txtLength->setText(i18n(
"%1 (%2 samples)",
273 txtLength->setText(i18n(
"%1 samples",
279 cbSampleFormat->clear();
281 const QList<int> formats = sf.
keys();
282 foreach (
const int &k, formats) {
283 cbSampleFormat->addItem(
293 cbSampleFormat->setCurrentIndex(cbSampleFormat->findData(format));
312 compressionWidget->init(
m_info);
320 cfg.readEntry(
"default_abr_nominal_bitrate", -1);
323 cfg.readEntry(
"default_abr_lower_bitrate",-1);
326 cfg.readEntry(
"default_abr_upper_bitrate",-1);
327 compressionWidget->setBitrates(abr_bitrate, min_bitrate, max_bitrate);
332 cfg.readEntry(
"default_vbr_quality", -1);
333 compressionWidget->setQuality(quality);
349 InfoTab->setTabEnabled(2,
isMpeg());
354 if ((layer < 1) || (layer > 3))
356 cbMpegLayer->setCurrentIndex(layer - 1);
363 if ((ver < 1) || (ver > 5)) ver = 4;
367 if ((ver < 0) || (ver > 2)) ver = 1;
368 cbMpegVersion->setCurrentIndex(ver);
389 }
else if (layer < 3) {
398 if ((modeext >= 0) && (modeext <= 3)) {
399 cbMpegModeExt->setEnabled(
true);
400 cbMpegModeExt->setCurrentIndex(modeext);
401 chkMpegIntensityStereo->setEnabled(
false);
402 chkMpegMSStereo->setEnabled(
false);
403 }
else if ((modeext >= 4) && (modeext <= 7)) {
404 cbMpegModeExt->setEnabled(
false);
405 cbMpegModeExt->setCurrentIndex(-1);
406 chkMpegIntensityStereo->setEnabled(
true);
407 chkMpegIntensityStereo->setChecked(modeext & 0x01);
408 chkMpegMSStereo->setEnabled(
true);
409 chkMpegMSStereo->setChecked(modeext & 0x02);
411 cbMpegModeExt->setEnabled(
false);
412 cbMpegModeExt->setCurrentIndex(-1);
413 chkMpegIntensityStereo->setEnabled(
false);
414 chkMpegMSStereo->setEnabled(
false);
421 case 0: cbMpegEmphasis->setCurrentIndex(0);
break;
422 case 1: cbMpegEmphasis->setCurrentIndex(1);
break;
423 case 3: cbMpegEmphasis->setCurrentIndex(2);
break;
424 default: cbMpegEmphasis->setEnabled(
false);
break;
430 chkMpegCopyrighted->setChecked(copyrighted);
436 chkMpegOriginal->setChecked(original);
460 cbGenre->addItem(genre);
463 cbGenre->setCurrentIndex(cbGenre->findText(genre));
470 if (date_str.length())
471 date = QDate::fromString(date_str, Qt::ISODate);
473 if (!date.isValid()) {
475 int year = date_str.toInt();
476 if ((year > 0) && (year <= 9999))
477 date = QDate(year, 1, 1);
479 if (!date.isValid()) {
481 date = QDate::currentDate();
484 dateEdit->setDate(date);
506 sbCDs->setValue(cds);
511 sbTrack->setValue(track);
516 sbTracks->setValue(tracks);
549 lstKeywords->setWhatsThis(
_(
"<b>") +
554 lstKeywords->setKeywords(keywords.split(
_(
";")));
556 connect(lstKeywords, SIGNAL(autoGenerate()),
564 QDate date(dateEdit->date());
566 if (date_dialog.exec() == QDialog::Accepted) {
567 date = date_dialog.date();
568 dateEdit->setDate(date);
575 dateEdit->setDate(QDate::currentDate());
583 lblChannelsVerbose->setText(i18n(
"(Mono)"));
586 lblChannelsVerbose->setText(i18n(
"(Stereo)"));
589 lblChannelsVerbose->setText(i18n(
"(Quadro)"));
592 lblChannelsVerbose->setText(
_(
""));
600 cbCompression->blockSignals(
true);
602 QList<Kwave::Compression::Type> supported_compressions;
606 if (mime_type.length()) {
615 foreach (QString m, mime_types) {
617 if (!encoder)
continue;
620 if (!supported_compressions.contains(c))
621 supported_compressions.append(c);
626 if (supported_compressions.isEmpty())
630 cbCompression->clear();
633 cbCompression->addItem(compression.
name(), compression.
toInt());
636 cbCompression->blockSignals(
false);
640 int new_index = cbCompression->findData(c);
645 new_index = cbCompression->count() - 1;
647 cbCompression->setCurrentIndex(new_index);
653 if (!cbCompression || !edFileFormat)
return;
657 cbCompression->currentIndex()).
toInt()
661 const QString preferred_mime_type = comp.preferredMimeType();
665 if (preferred_mime_type.length()) {
667 edFileFormat->setText(preferred_mime_type);
672 if (!file_mime_type.length()) {
678 foreach (
const QString &mime_type, mime_types) {
681 if (!encoder)
continue;
682 QList<Kwave::Compression::Type> comps =
684 if (comps.contains(compression)) {
685 edFileFormat->setText(mime_type);
702 InfoTab->setTabEnabled(2,
isMpeg());
703 if ((mpeg_layer > 0) && (cbMpegLayer->currentIndex() != (mpeg_layer - 1)))
704 cbMpegLayer->setCurrentIndex(mpeg_layer - 1);
707 const bool abr = comp.hasABR();
710 const bool vbr = comp.hasVBR();
711 compressionWidget->enableABR(abr, lower, upper);
712 compressionWidget->enableVBR(vbr);
713 cbSampleFormat->setEnabled(!comp.sampleFormats().isEmpty());
717 else if (!abr && vbr)
725 int compression = cbCompression->itemData(
726 cbCompression->currentIndex()).
toInt();
741 if (!cbMpegLayer || !
isMpeg())
return;
743 int layer = cbMpegLayer->currentIndex() + 1;
758 int index = cbCompression->findData(compression);
759 if (index >= 0) cbCompression->setCurrentIndex(index);
774 cbMpegModeExt->setEnabled(
false);
775 cbMpegModeExt->setCurrentIndex(-1);
777 chkMpegIntensityStereo->setEnabled(
false);
778 chkMpegIntensityStereo->setChecked(
false);
779 chkMpegMSStereo->setEnabled(
false);
780 chkMpegMSStereo->setChecked(
false);
781 }
else if (cbMpegModeExt->isEnabled() && (layer >= 3)) {
783 cbMpegModeExt->setEnabled(
false);
786 if ((modeext < 4) || (modeext > 7)) {
788 chkMpegIntensityStereo->setChecked(modeext & 0x01);
789 chkMpegMSStereo->setChecked(modeext & 0x02);
792 chkMpegIntensityStereo->setEnabled(
true);
793 chkMpegMSStereo->setEnabled(
true);
794 }
else if (!cbMpegModeExt->isEnabled() && (layer <= 2)) {
798 if ((modeext < 0) || (modeext > 3)) {
800 cbMpegModeExt->setCurrentIndex(modeext);
802 cbMpegModeExt->setEnabled(
true);
804 chkMpegIntensityStereo->setEnabled(
false);
805 chkMpegMSStereo->setEnabled(
false);
812 chkMpegCopyrighted->setText((checked) ? i18n(
"Yes") : i18n(
"No"));
818 chkMpegOriginal->setText((checked) ? i18n(
"Yes") : i18n(
"No"));
825 QStringList list = lstKeywords->keywords();
831 const QString space =
_(
" ");
832 list += edName->text().split(space);
833 list += edSubject->text().split(space);
834 list += edVersion->text().split(space);
835 list += cbGenre->currentText();
836 list += edAuthor->text().split(space);
837 list += edOrganization->text().split(space);
838 list += edCopyright->text().split(space);
839 list += edLicense->text().split(space);
840 list += edSource->text().split(space);
841 list += edSourceForm->text().split(space);
842 list += edAlbum->text().split(space);
843 list += edProduct->text().split(space);
844 list += edArchival->text().split(space);
845 list += edContact->text().split(space);
846 list += edSoftware->text().split(space);
847 list += edTechnican->text().split(space);
848 list += edEngineer->text().split(space);
849 list += edCommissioned->text().split(space);
850 list += edISRC->text().split(space);
853 QMutableStringListIterator it(list);
854 while (it.hasNext()) {
855 QString token = it.next();
858 while (token.length()) {
859 QString old_value = token;
861 QChar c = token[token.length()-1];
862 if (c.isPunct() || c.isMark() || c.isSpace())
863 token = token.left(token.length()-1);
864 if (!token.length())
break;
867 if (c.isPunct() || c.isMark() || c.isSpace())
868 token = token.right(token.length()-1);
870 if (token == old_value)
break;
874 if (!token.length()) {
882 if ((ok) || (token.length() < 3)) {
888 bool is_duplicate =
false;
889 QStringListIterator it2(list);
890 while (it2.hasNext()) {
891 QString token2 = it2.next();
892 if (list.indexOf(token) == list.lastIndexOf(token2))
continue;
893 if (token2.compare(token, Qt::CaseInsensitive) == 0) {
895 unsigned int upper1 = 0;
896 unsigned int upper2 = 0;
897 for (
int i=0; i < token.length(); ++i)
898 if (token[i].category() == QChar::Letter_Uppercase)
900 for (
int i=0; i < token2.length(); ++i)
901 if (token2[i].category() == QChar::Letter_Uppercase)
903 if (upper2 < upper1) {
919 lstKeywords->setKeywords(list);
926 value = value.simplified();
929 if (!value.length()) {
943 int nominal, upper, lower;
944 compressionWidget->getABRrates(nominal, lower, upper);
945 cfg.writeEntry(
"default_abr_nominal_bitrate", nominal);
946 cfg.writeEntry(
"default_abr_upper_bitrate", upper);
947 cfg.writeEntry(
"default_abr_lower_bitrate", lower);
949 int quality = compressionWidget->baseQuality();
950 cfg.writeEntry(
"default_vbr_quality", quality);
954 qDebug(
"FileInfoDialog::accept()");
969 cbSampleFormat->itemData(cbSampleFormat->currentIndex()).
toInt();
974 cbCompression->itemData(cbCompression->currentIndex()).
toInt()
983 int layer = cbMpegLayer->currentIndex() + 1;
998 }
else if (cbMpegModeExt->isEnabled()) {
1000 int modeext = cbMpegModeExt->currentIndex();
1005 if (chkMpegIntensityStereo->isChecked()) modeext |= 1;
1006 if (chkMpegMSStereo->isChecked()) modeext |= 2;
1011 switch (cbMpegEmphasis->currentIndex()) {
1012 case 1: emphasis = 1;
break;
1013 case 2: emphasis = 3;
break;
1015 default: emphasis = 0;
break;
1019 bool copyrighted = chkMpegCopyrighted->isChecked();
1022 bool original = chkMpegOriginal->isChecked();
1039 int nominal, upper, lower;
1040 compressionWidget->getABRrates(nominal, lower, upper);
1041 bool use_lowest = compressionWidget->lowestEnabled();
1042 bool use_highest = compressionWidget->highestEnabled();
1046 (use_lowest) ? QVariant(lower) : del);
1048 (use_highest) ? QVariant(upper) : del);
1053 int quality = compressionWidget->baseQuality();
1076 QDate date = dateEdit->date();
1077 if ( (date != QDate::currentDate()) ||
1089 int cd = sbCD->value();
1090 int cds = sbCDs->value();
1091 int track = sbTrack->value();
1092 int tracks = sbTracks->value();
1112 lstKeywords->keywords().join(
_(
"; ")));
1114 qDebug(
"FileInfoDialog::accept() [done]");
1123 KHelpClient::invokeHelp(
_(
"fileinfo"));
bool contains(const FileProperty property) const
QString preferredMimeType() const
static QString name(int id, bool localized)
FileInfoDialog(QWidget *parent, Kwave::FileInfo &info)
void acceptEdit(Kwave::FileProperty property, QString value)
QString Q_DECL_EXPORT ms2string(double ms, int precision=6)
QString Q_DECL_EXPORT samples2string(sample_index_t samples)
QString description(IDX type, bool localized) const
DATA data(IDX type) const
QString name(FileProperty key) const
void mpegOriginalChanged(bool checked)
QVariant get(FileProperty key) const
void describeWidget(QWidget *widget, const QString &name, const QString &description)
static Kwave::Compression::Type fromInt(int i)
virtual ~FileInfoDialog() Q_DECL_OVERRIDE
virtual const QList< Kwave::Compression::Type > compressionTypes()
static QString mimeTypeOf(const QUrl &url)
bool connect(Kwave::StreamObject &source, const char *output, Kwave::StreamObject &sink, const char *input)
void set(FileProperty key, const QVariant &value)
static bool cmp(const Kwave::Curve::Point &a, const Kwave::Curve::Point &b)
void mpegCopyrightedChanged(bool checked)
virtual bool supports(const QMimeType &mimetype)
void setRate(double rate)
virtual void accept() Q_DECL_OVERRIDE
QList< IDX > keys() const
QString description(FileProperty key) const
sample_index_t length() const
#define CONFIG_DEFAULT_SECTION
void setupMiscellaneousTab()
static int id(const QString &name)
void setupAuthorCopyrightTab()
static QStringList encodingMimeTypes()
unsigned int tracks() const
void setBits(unsigned int bits)
void autoGenerateKeywords()
static Kwave::Encoder * encoder(const QString &mimetype_name)
static QStringList allTypes()
unsigned int bits() const
void tracksChanged(int tracks)
void compressionChanged()
void initInfoText(QLabel *label, QLineEdit *edit, Kwave::FileProperty property)
void updateAvailableCompressions()
void setupCompressionTab(KConfigGroup &cfg)
void initInfo(QLabel *label, QWidget *widget, Kwave::FileProperty property)
virtual void dump() const Q_DECL_OVERRIDE