X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Frenderwidget.cpp;h=6f91e5227450204ed0183061cd39e9c13d1c3d16;hb=e0fa1332f109b6455207ea701da386b2fddddf09;hp=23356a1b1b5c74ed4ea4625329499b2fb410d8ad;hpb=d11a222d4a33f2844e4a0776028fa5d862cb4f69;p=kdenlive diff --git a/src/renderwidget.cpp b/src/renderwidget.cpp index 23356a1b..6f91e522 100644 --- a/src/renderwidget.cpp +++ b/src/renderwidget.cpp @@ -47,6 +47,8 @@ #include #include +#include "locale.h" + // Render profiles roles const int GroupRole = Qt::UserRole; @@ -132,7 +134,7 @@ const QString RenderJobItem::metadata() const } -RenderWidget::RenderWidget(const QString &projectfolder, bool enableProxy, MltVideoProfile profile, QWidget * parent) : +RenderWidget::RenderWidget(const QString &projectfolder, bool enableProxy, const MltVideoProfile &profile, QWidget * parent) : QDialog(parent), m_projectFolder(projectfolder), m_profile(profile), @@ -234,7 +236,7 @@ RenderWidget::RenderWidget(const QString &projectfolder, bool enableProxy, MltVi connect(m_view.delete_script, SIGNAL(clicked()), this, SLOT(slotDeleteScript())); connect(m_view.scripts_list, SIGNAL(itemSelectionChanged()), this, SLOT(slotCheckScript())); connect(m_view.running_jobs, SIGNAL(itemSelectionChanged()), this, SLOT(slotCheckJob())); - connect(m_view.running_jobs, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(slotPlayRendering(QTreeWidgetItem *, int))); + connect(m_view.running_jobs, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)), this, SLOT(slotPlayRendering(QTreeWidgetItem*,int))); connect(m_view.buttonInfo, SIGNAL(clicked()), this, SLOT(showInfoPanel())); @@ -253,13 +255,13 @@ RenderWidget::RenderWidget(const QString &projectfolder, bool enableProxy, MltVi connect(m_view.buttonClose3, SIGNAL(clicked()), this, SLOT(hide())); connect(m_view.rescale, SIGNAL(toggled(bool)), this, SLOT(setRescaleEnabled(bool))); connect(m_view.destination_list, SIGNAL(activated(int)), this, SLOT(refreshCategory())); - connect(m_view.out_file, SIGNAL(textChanged(const QString &)), this, SLOT(slotUpdateButtons())); - connect(m_view.out_file, SIGNAL(urlSelected(const KUrl &)), this, SLOT(slotUpdateButtons(const KUrl &))); + connect(m_view.out_file, SIGNAL(textChanged(QString)), this, SLOT(slotUpdateButtons())); + connect(m_view.out_file, SIGNAL(urlSelected(KUrl)), this, SLOT(slotUpdateButtons(KUrl))); connect(m_view.format_list, SIGNAL(currentRowChanged(int)), this, SLOT(refreshView())); connect(m_view.size_list, SIGNAL(currentRowChanged(int)), this, SLOT(refreshParams())); connect(m_view.show_all_profiles, SIGNAL(stateChanged(int)), this, SLOT(refreshView())); - connect(m_view.size_list, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(slotEditItem(QListWidgetItem *))); + connect(m_view.size_list, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(slotEditItem(QListWidgetItem*))); connect(m_view.render_guide, SIGNAL(clicked(bool)), this, SLOT(slotUpdateGuideBox())); connect(m_view.render_zone, SIGNAL(clicked(bool)), this, SLOT(slotUpdateGuideBox())); @@ -274,6 +276,7 @@ RenderWidget::RenderWidget(const QString &projectfolder, bool enableProxy, MltVi m_view.splitter->setStretchFactor(0, 2); m_view.out_file->setMode(KFile::File); + m_view.out_file->setFocusPolicy(Qt::ClickFocus); m_view.running_jobs->setHeaderLabels(QStringList() << QString() << i18n("File")); m_jobsDelegate = new RenderViewDelegate(this); @@ -379,7 +382,7 @@ void RenderWidget::setGuides(QDomElement guidesxml, double duration) m_view.guide_start->clear(); m_view.guide_end->clear(); QDomNodeList nodes = guidesxml.elementsByTagName("guide"); - if (nodes.count() > 0) { + if (!nodes.isEmpty()) { m_view.guide_start->addItem(i18n("Beginning"), "0"); m_view.render_guide->setEnabled(true); m_view.create_chapter->setEnabled(true); @@ -388,7 +391,7 @@ void RenderWidget::setGuides(QDomElement guidesxml, double duration) m_view.create_chapter->setEnabled(false); } double fps = (double) m_profile.frame_rate_num / m_profile.frame_rate_den; - for (int i = 0; i < nodes.count(); i++) { + for (int i = 0; i < nodes.count(); ++i) { QDomElement e = nodes.item(i).toElement(); if (!e.isNull()) { GenTime pos = GenTime(e.attribute("time").toDouble()); @@ -397,7 +400,7 @@ void RenderWidget::setGuides(QDomElement guidesxml, double duration) m_view.guide_end->addItem(e.attribute("comment") + '/' + guidePos, e.attribute("time").toDouble()); } } - if (nodes.count() > 0) + if (!nodes.isEmpty()) m_view.guide_end->addItem(i18n("End"), QString::number(duration)); } @@ -405,7 +408,7 @@ void RenderWidget::setGuides(QDomElement guidesxml, double duration) * Will be called when the user selects an output file via the file dialog. * File extension will be added automatically. */ -void RenderWidget::slotUpdateButtons(KUrl url) +void RenderWidget::slotUpdateButtons(const KUrl &url) { if (m_view.out_file->url().isEmpty()) { m_view.buttonGenerateScript->setEnabled(false); @@ -420,9 +423,8 @@ void RenderWidget::slotUpdateButtons(KUrl url) m_view.buttonGenerateScript->setEnabled(false); return; } - QString extension = item->data(ExtensionRole).toString(); - url = filenameWithExtension(url, extension); - m_view.out_file->setUrl(url); + const QString extension = item->data(ExtensionRole).toString(); + m_view.out_file->setUrl(filenameWithExtension(url, extension)); } } @@ -447,7 +449,7 @@ void RenderWidget::slotSaveProfile() QDialog *d = new QDialog(this); ui.setupUi(d); - for (int i = 0; i < m_view.destination_list->count(); i++) + for (int i = 0; i < m_view.destination_list->count(); ++i) ui.destination_list->addItem(m_view.destination_list->itemIcon(i), m_view.destination_list->itemText(i), m_view.destination_list->itemData(i, Qt::UserRole)); ui.destination_list->setCurrentIndex(m_view.destination_list->currentIndex()); @@ -457,10 +459,29 @@ void RenderWidget::slotSaveProfile() if (customGroup.isEmpty()) customGroup = i18nc("Group Name", "Custom"); ui.group_name->setText(customGroup); - QStringList arguments = m_view.advanced_params->toPlainText().split(" ", QString::SkipEmptyParts); + QStringList arguments = m_view.advanced_params->toPlainText().split(' ', QString::SkipEmptyParts); ui.parameters->setText(arguments.join(" ")); ui.extension->setText(m_view.size_list->currentItem()->data(ExtensionRole).toString()); ui.profile_name->setFocus(); + QListWidgetItem *item = m_view.size_list->currentItem(); + if (ui.parameters->toPlainText().contains("%bitrate")) { + if ( item && item->data(BitratesRole).canConvert(QVariant::StringList) && item->data(BitratesRole).toStringList().count()) { + QStringList bitrates = item->data(BitratesRole).toStringList(); + ui.vbitrates_list->setText(bitrates.join(",")); + if (item->data(DefaultBitrateRole).canConvert(QVariant::String)) + ui.default_vbitrate->setValue(item->data(DefaultBitrateRole).toInt()); + } + } + else ui.vbitrates->setHidden(true); + if (ui.parameters->toPlainText().contains("%audiobitrate")) { + if ( item && item->data(AudioBitratesRole).canConvert(QVariant::StringList) && item->data(AudioBitratesRole).toStringList().count()) { + QStringList bitrates = item->data(AudioBitratesRole).toStringList(); + ui.abitrates_list->setText(bitrates.join(",")); + if (item->data(DefaultAudioBitrateRole).canConvert(QVariant::String)) + ui.default_abitrate->setValue(item->data(DefaultAudioBitrateRole).toInt()); + } + } + else ui.abitrates->setHidden(true); if (d->exec() == QDialog::Accepted && !ui.profile_name->text().simplified().isEmpty()) { QString newProfileName = ui.profile_name->text().simplified(); @@ -478,19 +499,13 @@ void RenderWidget::slotSaveProfile() profileElement.setAttribute("args", args); if (args.contains("%bitrate")) { // profile has a variable bitrate - profileElement.setAttribute("defaultbitrate", m_view.comboBitrates->currentText()); - QStringList bitrateValues; - for (int i = 0; i < m_view.comboBitrates->count(); i++) - bitrateValues << m_view.comboBitrates->itemText(i); - profileElement.setAttribute("bitrates", bitrateValues.join(",")); + profileElement.setAttribute("defaultbitrate", QString::number(ui.default_vbitrate->value())); + profileElement.setAttribute("bitrates", ui.vbitrates_list->text()); } if (args.contains("%audiobitrate")) { // profile has a variable bitrate - profileElement.setAttribute("defaultaudiobitrate", m_view.comboAudioBitrates->currentText()); - QStringList bitrateValues; - for (int i = 0; i < m_view.comboAudioBitrates->count(); i++) - bitrateValues << m_view.comboAudioBitrates->itemText(i); - profileElement.setAttribute("audiobitrates", bitrateValues.join(",")); + profileElement.setAttribute("defaultaudiobitrate", QString::number(ui.default_abitrate->value())); + profileElement.setAttribute("audiobitrates", ui.abitrates_list->text()); } doc.appendChild(profileElement); saveProfile(doc.documentElement()); @@ -542,7 +557,7 @@ void RenderWidget::saveProfile(QDomElement newprofile) break; } } - i++; + ++i; } profiles.appendChild(newprofile); @@ -602,7 +617,7 @@ void RenderWidget::slotEditProfile() QDialog *d = new QDialog(this); ui.setupUi(d); - for (int i = 0; i < m_view.destination_list->count(); i++) + for (int i = 0; i < m_view.destination_list->count(); ++i) ui.destination_list->addItem(m_view.destination_list->itemIcon(i), m_view.destination_list->itemText(i), m_view.destination_list->itemData(i, Qt::UserRole)); ui.destination_list->setCurrentIndex(m_view.destination_list->currentIndex()); @@ -616,6 +631,25 @@ void RenderWidget::slotEditProfile() ui.extension->setText(extension); ui.parameters->setText(params); ui.profile_name->setFocus(); + if (ui.parameters->toPlainText().contains("%bitrate")) { + if ( item->data(BitratesRole).canConvert(QVariant::StringList) && item->data(BitratesRole).toStringList().count()) { + QStringList bitrates = item->data(BitratesRole).toStringList(); + ui.vbitrates_list->setText(bitrates.join(",")); + if (item->data(DefaultBitrateRole).canConvert(QVariant::String)) + ui.default_vbitrate->setValue(item->data(DefaultBitrateRole).toInt()); + } + } + else ui.vbitrates->setHidden(true); + if (ui.parameters->toPlainText().contains("%audiobitrate")) { + if ( item->data(AudioBitratesRole).canConvert(QVariant::StringList) && item->data(AudioBitratesRole).toStringList().count()) { + QStringList bitrates = item->data(AudioBitratesRole).toStringList(); + ui.abitrates_list->setText(bitrates.join(",")); + if (item->data(DefaultAudioBitrateRole).canConvert(QVariant::String)) + ui.default_abitrate->setValue(item->data(DefaultAudioBitrateRole).toInt()); + } + } + else ui.abitrates->setHidden(true); + d->setWindowTitle(i18n("Edit Profile")); if (d->exec() == QDialog::Accepted) { slotDeleteProfile(false); @@ -663,7 +697,7 @@ void RenderWidget::slotEditProfile() break; } } - i++; + ++i; } QDomElement profileElement = doc.createElement("profile"); @@ -675,19 +709,13 @@ void RenderWidget::slotEditProfile() profileElement.setAttribute("args", args); if (args.contains("%bitrate")) { // profile has a variable bitrate - profileElement.setAttribute("defaultbitrate", m_view.comboBitrates->currentText()); - QStringList bitrateValues; - for (int i = 0; i < m_view.comboBitrates->count(); i++) - bitrateValues << m_view.comboBitrates->itemText(i); - profileElement.setAttribute("bitrates", bitrateValues.join(",")); + profileElement.setAttribute("defaultbitrate", QString::number(ui.default_vbitrate->value())); + profileElement.setAttribute("bitrates", ui.vbitrates_list->text()); } if (args.contains("%audiobitrate")) { // profile has a variable bitrate - profileElement.setAttribute("defaultaudiobitrate", m_view.comboAudioBitrates->currentText()); - QStringList bitrateValues; - for (int i = 0; i < m_view.comboAudioBitrates->count(); i++) - bitrateValues << m_view.comboAudioBitrates->itemText(i); - profileElement.setAttribute("audiobitrates", bitrateValues.join(",")); + profileElement.setAttribute("defaultaudiobitrate", QString::number(ui.default_abitrate->value())); + profileElement.setAttribute("audiobitrates", ui.abitrates_list->text()); } profiles.appendChild(profileElement); @@ -751,7 +779,7 @@ void RenderWidget::slotDeleteProfile(bool refresh) doc.documentElement().removeChild(profiles.item(i)); break; } - i++; + ++i; } if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { @@ -796,8 +824,12 @@ void RenderWidget::updateButtons() } -void RenderWidget::focusFirstVisibleItem() +void RenderWidget::focusFirstVisibleItem(const QString &profile) { + if (!profile.isEmpty()) { + QList child = m_view.size_list->findItems(profile, Qt::MatchExactly); + if (!child.isEmpty()) m_view.size_list->setCurrentItem(child.at(0)); + } if (m_view.size_list->currentItem()) { updateButtons(); return; @@ -833,7 +865,7 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const QListWidgetItem *item = m_view.size_list->currentItem(); if (!item) return; - QString dest = m_view.out_file->url().path(); + QString dest = m_view.out_file->url().path().trimmed(); if (dest.isEmpty()) return; // Check whether target file has an extension. @@ -841,7 +873,7 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const QString extension = item->data(ExtensionRole).toString(); if (!dest.endsWith(extension, Qt::CaseInsensitive)) { if (KMessageBox::questionYesNo(this, i18n("File has no extension. Add extension (%1)?", extension)) == KMessageBox::Yes) { - dest.append("." + extension); + dest.append('.' + extension); } } @@ -869,7 +901,8 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const // Set locale for render process if required if (QLocale().decimalPoint() != QLocale::system().decimalPoint()) { - render_process_args << QString("-locale:%1").arg(QLocale().name()); + const QString currentLocale = setlocale(LC_NUMERIC, NULL); + render_process_args << QString("-locale:%1").arg(currentLocale); } double guideStart = 0; @@ -899,7 +932,7 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const if (m_view.export_meta->isChecked()) { QMap::const_iterator i = metadata.constBegin(); while (i != metadata.constEnd()) { - renderArgs.append(QString(" %1=\"%2\"").arg(i.key()).arg(i.value())); + renderArgs.append(QString(" %1=%2").arg(i.key()).arg(QString(QUrl::toPercentEncoding(i.value())))); ++i; } } @@ -949,11 +982,11 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const renderArgs.append(subsize); } bool resizeProfile = (subsize != currentSize); - QStringList paramsList = renderArgs.split(" ", QString::SkipEmptyParts); + QStringList paramsList = renderArgs.split(' ', QString::SkipEmptyParts); QScriptEngine sEngine; - sEngine.globalObject().setProperty("bitrate", m_view.comboBitrates->currentText()); - sEngine.globalObject().setProperty("audiobitrate", m_view.comboAudioBitrates->currentText()); + sEngine.globalObject().setProperty("bitrate", m_view.comboBitrates->currentText().toInt()); + sEngine.globalObject().setProperty("audiobitrate", m_view.comboAudioBitrates->currentText().toInt()); sEngine.globalObject().setProperty("dar", '@' + QString::number(m_profile.display_aspect_num) + '/' + QString::number(m_profile.display_aspect_den)); sEngine.globalObject().setProperty("passes", static_cast(m_view.checkTwoPass->isChecked()) + 1); @@ -976,6 +1009,7 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const render_process_args << "consumer:" + (scriptExport ? "$SOURCE" : playlistPath); else render_process_args << (scriptExport ? "$SOURCE" : playlistPath); + render_process_args << (scriptExport ? "$TARGET" : KUrl(dest).url()); render_process_args << paramsList; @@ -991,8 +1025,8 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const } QTextStream outStream(&file); outStream << "#! /bin/sh" << "\n" << "\n"; - outStream << "SOURCE=" << "\"" + KUrl(playlistPath).url() + "\"" << "\n"; - outStream << "TARGET=" << "\"" + KUrl(dest).url() + "\"" << "\n"; + outStream << "SOURCE=" << "\"" + QUrl(playlistPath).toEncoded() + "\"" << "\n"; + outStream << "TARGET=" << "\"" + QUrl(dest).toEncoded() + "\"" << "\n"; outStream << "RENDERER=" << "\"" + m_renderer + "\"" << "\n"; outStream << "MELT=" << "\"" + KdenliveSettings::rendererpath() + "\"" << "\n"; outStream << "PARAMETERS=" << "\"" + render_process_args.join(" ") + "\"" << "\n"; @@ -1082,6 +1116,7 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const renderItem->setMetadata(url); } } + renderItem->setData(1, ParametersRole, render_process_args); if (exportAudio == false) renderItem->setData(1, ExtraInfoRole, i18n("Video without audio track")); else renderItem->setData(1, ExtraInfoRole, QString()); @@ -1104,7 +1139,7 @@ void RenderWidget::checkRenderStatus() item = static_cast (m_view.running_jobs->topLevelItem(0)); bool waitingJob = false; - // Find first aiting job + // Find first waiting job while (item) { if (item->status() == WAITINGJOB) { item->setData(1, TimeRole, QTime::currentTime()); @@ -1148,7 +1183,7 @@ int RenderWidget::waitingJobsCount() const return count; } -void RenderWidget::setProfile(MltVideoProfile profile) +void RenderWidget::setProfile(const MltVideoProfile &profile) { m_view.scanning_list->setCurrentIndex(0); m_view.rescale_width->setValue(KdenliveSettings::defaultrescalewidth()); @@ -1163,17 +1198,18 @@ void RenderWidget::setProfile(MltVideoProfile profile) } } -void RenderWidget::refreshCategory() + + +void RenderWidget::refreshCategory(const QString &group, const QString &profile) { m_view.format_list->blockSignals(true); m_view.format_list->clear(); QListWidgetItem *sizeItem; - + QString destination; if (m_view.destination_list->currentIndex() > 0) destination = m_view.destination_list->itemData(m_view.destination_list->currentIndex()).toString(); - if (destination == "dvd") { m_view.open_dvd->setVisible(true); m_view.create_chapter->setVisible(true); @@ -1188,7 +1224,7 @@ void RenderWidget::refreshCategory() m_view.open_browser->setVisible(false); // hide groups that are not in the correct destination - for (int i = 0; i < m_renderCategory.count(); i++) { + for (int i = 0; i < m_renderCategory.count(); ++i) { sizeItem = m_renderCategory.at(i); if (sizeItem->data(MetaGroupRole).toString() == destination) { m_view.format_list->addItem(sizeItem->clone()); @@ -1196,12 +1232,15 @@ void RenderWidget::refreshCategory() } } - // activate first visible item + // activate requested item or first visible + QList child; + if (!group.isEmpty()) child = m_view.format_list->findItems(group, Qt::MatchExactly); + if (!child.isEmpty()) { + m_view.format_list->setCurrentItem(child.at(0)); + child.clear(); + } else m_view.format_list->setCurrentRow(0); QListWidgetItem * item = m_view.format_list->currentItem(); - if (!item) { - m_view.format_list->setCurrentRow(0); - item = m_view.format_list->currentItem(); - } + m_view.format_list->blockSignals(false); if (!item) { m_view.format_list->setEnabled(false); m_view.format_list->clear(); @@ -1219,10 +1258,11 @@ void RenderWidget::refreshCategory() m_view.format_list->setVisible(true); else m_view.format_list->setVisible(false); - refreshView(); + + refreshView(profile); } -void RenderWidget::refreshView() +void RenderWidget::refreshView(const QString &profile) { if (!m_view.format_list->currentItem()) return; m_view.size_list->blockSignals(true); @@ -1236,16 +1276,21 @@ void RenderWidget::refreshView() KIcon brokenIcon("dialog-close"); KIcon warningIcon("dialog-warning"); - const QStringList formatsList = KdenliveSettings::supportedformats(); - const QStringList vcodecsList = KdenliveSettings::videocodecs(); - const QStringList acodecsList = KdenliveSettings::audiocodecs(); + QStringList formatsList; + QStringList vcodecsList; + QStringList acodecsList; + if (!KdenliveSettings::bypasscodeccheck()) { + formatsList= KdenliveSettings::supportedformats(); + vcodecsList = KdenliveSettings::videocodecs(); + acodecsList = KdenliveSettings::audiocodecs(); + } KColorScheme scheme(palette().currentColorGroup(), KColorScheme::Window); const QColor disabled = scheme.foreground(KColorScheme::InactiveText).color(); const QColor disabledbg = scheme.background(KColorScheme::NegativeBackground).color(); double project_framerate = (double) m_profile.frame_rate_num / m_profile.frame_rate_den; - for (int i = 0; i < m_renderItems.count(); i++) { + for (int i = 0; i < m_renderItems.count(); ++i) { sizeItem = m_renderItems.at(i); QListWidgetItem *dupItem = NULL; if ((sizeItem->data(GroupRole).toString() == group || sizeItem->data(GroupRole).toString().isEmpty()) && sizeItem->data(MetaGroupRole).toString() == destination) { @@ -1334,9 +1379,8 @@ void RenderWidget::refreshView() } } } - focusFirstVisibleItem(); + focusFirstVisibleItem(profile); m_view.size_list->blockSignals(false); - m_view.format_list->blockSignals(false); if (m_view.size_list->count() > 0) { refreshParams(); } @@ -1347,7 +1391,7 @@ void RenderWidget::refreshView() } } -KUrl RenderWidget::filenameWithExtension(KUrl url, QString extension) +KUrl RenderWidget::filenameWithExtension(KUrl url, const QString &extension) { if (url.isEmpty()) url = KUrl(m_projectFolder); QString directory = url.directory(KUrl::AppendTrailingSlash | KUrl::ObeyTrailingSlash); @@ -1422,7 +1466,7 @@ void RenderWidget::refreshParams() m_view.bitrateLabel->setEnabled(true); if ( item->data(BitratesRole).canConvert(QVariant::StringList) && item->data(BitratesRole).toStringList().count()) { QStringList bitrates = item->data(BitratesRole).toStringList(); - foreach (QString bitrate, bitrates) + foreach (const QString &bitrate, bitrates) m_view.comboBitrates->addItem(bitrate); if (item->data(DefaultBitrateRole).canConvert(QVariant::String)) m_view.comboBitrates->setCurrentIndex(bitrates.indexOf(item->data(DefaultBitrateRole).toString())); @@ -1439,7 +1483,7 @@ void RenderWidget::refreshParams() m_view.audiobitrateLabel->setEnabled(true); if ( item->data(AudioBitratesRole).canConvert(QVariant::StringList) && item->data(AudioBitratesRole).toStringList().count()) { QStringList audiobitrates = item->data(AudioBitratesRole).toStringList(); - foreach (QString bitrate, audiobitrates) + foreach (const QString &bitrate, audiobitrates) m_view.comboAudioBitrates->addItem(bitrate); if (item->data(DefaultAudioBitrateRole).canConvert(QVariant::String)) m_view.comboAudioBitrates->setCurrentIndex(audiobitrates.indexOf(item->data(DefaultAudioBitrateRole).toString())); @@ -1462,12 +1506,9 @@ void RenderWidget::reloadProfiles() parseProfiles(); } -void RenderWidget::parseProfiles(QString meta, QString group, QString profile) +void RenderWidget::parseProfiles(const QString &meta, const QString &group, const QString &profile) { - m_view.size_list->blockSignals(true); - m_view.format_list->blockSignals(true); - m_view.size_list->clear(); - m_view.format_list->clear(); + m_view.destination_list->blockSignals(true); m_view.destination_list->clear(); qDeleteAll(m_renderItems); qDeleteAll(m_renderCategory); @@ -1498,30 +1539,14 @@ void RenderWidget::parseProfiles(QString meta, QString group, QString profile) parseFile(exportFolder + filename, true); if (QFile::exists(exportFolder + "customprofiles.xml")) parseFile(exportFolder + "customprofiles.xml", true); - if (!meta.isEmpty()) { - m_view.destination_list->blockSignals(true); - m_view.destination_list->setCurrentIndex(m_view.destination_list->findData(meta)); - m_view.destination_list->blockSignals(false); - } - refreshCategory(); - QList child; - if (!group.isEmpty()) child = m_view.format_list->findItems(group, Qt::MatchExactly); - if (!child.isEmpty()) { - for (int i = 0; i < child.count(); i++) { - if (child.at(i)->data(MetaGroupRole).toString() == meta) { - m_view.format_list->setCurrentItem(child.at(i)); - break; - } - } - } - child.clear(); - m_view.size_list->blockSignals(false); - m_view.format_list->blockSignals(false); - if (!profile.isEmpty()) child = m_view.size_list->findItems(profile, Qt::MatchExactly); - if (!child.isEmpty()) m_view.size_list->setCurrentItem(child.at(0)); + int categoryIndex = m_view.destination_list->findData(meta); + if (categoryIndex == -1) categoryIndex = 0; + m_view.destination_list->setCurrentIndex(categoryIndex); + m_view.destination_list->blockSignals(false); + refreshCategory(group, profile); } -void RenderWidget::parseFile(QString exportFile, bool editable) +void RenderWidget::parseFile(const QString &exportFile, bool editable) { kDebug() << "// Parsing file: " << exportFile; kDebug() << "------------------------------"; @@ -1540,7 +1565,6 @@ void RenderWidget::parseFile(QString exportFile, bool editable) bool replaceLibfaacCodec = false; if (!acodecsList.contains("aac") && acodecsList.contains("libfaac")) replaceLibfaacCodec = true; - if (editable || groups.count() == 0) { QDomElement profiles = doc.documentElement(); if (editable && profiles.attribute("version", 0).toInt() < 1) { @@ -1551,7 +1575,7 @@ void RenderWidget::parseFile(QString exportFile, bool editable) newprofiles.setAttribute("version", 1); newdoc.appendChild(newprofiles); QDomNodeList profilelist = doc.elementsByTagName("profile"); - for (int i = 0; i < profilelist.count(); i++) { + for (int i = 0; i < profilelist.count(); ++i) { QString category = i18nc("Category Name", "Custom"); QString extension; QDomNode parent = profilelist.at(i).parentNode(); @@ -1741,7 +1765,7 @@ void RenderWidget::parseFile(QString exportFile, bool editable) n = n.nextSibling(); } - i++; + ++i; } } @@ -1790,7 +1814,7 @@ void RenderWidget::setRenderStatus(const QString &dest, int status, const QStrin item->setData(1, Qt::UserRole, t); QString itemGroup = item->data(0, Qt::UserRole).toString(); if (itemGroup == "dvd") { - emit openDvdWizard(item->text(1), item->metadata()); + emit openDvdWizard(item->text(1)); } else if (itemGroup == "websites") { QString url = item->metadata(); if (!url.isEmpty()) new KRun(url, this); @@ -1848,7 +1872,7 @@ void RenderWidget::slotCheckJob() } m_view.abort_job->setEnabled(activate); /* - for (int i = 0; i < m_view.running_jobs->topLevelItemCount(); i++) { + for (int i = 0; i < m_view.running_jobs->topLevelItemCount(); ++i) { current = static_cast(m_view.running_jobs->topLevelItem(i)); if (current == static_cast (m_view.running_jobs->currentItem())) { current->setSizeHint(1, QSize(m_view.running_jobs->columnWidth(1), fontMetrics().height() * 3)); @@ -1889,7 +1913,7 @@ void RenderWidget::parseScriptFiles() QTextStream stream(&file); while (!stream.atEnd()) { QString line = stream.readLine(); - kDebug()<<"# :"<setIcon(0, KIcon("dialog-cancel")); @@ -1916,18 +1940,14 @@ void RenderWidget::parseScriptFiles() item->setData(0, Qt::UserRole, '1'); } else item->setIcon(0, KIcon("application-x-executable-script")); item->setSizeHint(0, QSize(m_view.scripts_list->columnWidth(0), fontMetrics().height() * 2)); - item->setData(1, Qt::UserRole, KUrl(target).path()); + item->setData(1, Qt::UserRole, KUrl(QUrl::fromEncoded(target.toUtf8())).pathOrUrl()); item->setData(1, Qt::UserRole + 1, scriptpath.path()); } -// bool activate = false; QTreeWidgetItem *script = m_view.scripts_list->topLevelItem(0); if (script) { m_view.scripts_list->setCurrentItem(script); script->setSelected(true); -// activate = true; } -// m_view.start_script->setEnabled(activate); -// m_view.delete_script->setEnabled(activate); } void RenderWidget::slotCheckScript() @@ -1936,7 +1956,7 @@ void RenderWidget::slotCheckScript() if (current == NULL) return; m_view.start_script->setEnabled(current->data(0, Qt::UserRole).toString().isEmpty()); m_view.delete_script->setEnabled(true); - for (int i = 0; i < m_view.scripts_list->topLevelItemCount(); i++) { + for (int i = 0; i < m_view.scripts_list->topLevelItemCount(); ++i) { current = m_view.scripts_list->topLevelItem(i); if (current == m_view.scripts_list->currentItem()) { current->setSizeHint(1, QSize(m_view.scripts_list->columnWidth(1), fontMetrics().height() * 3)); @@ -1999,10 +2019,8 @@ void RenderWidget::slotHideLog() m_view.error_box->setVisible(false); } -void RenderWidget::setRenderProfile(QMap props) +void RenderWidget::setRenderProfile(const QMap &props) { - m_view.destination_list->blockSignals(true); - m_view.format_list->blockSignals(true); m_view.scanning_list->setCurrentIndex(props.value("renderscanning").toInt()); int exportAudio = props.value("renderexportaudio").toInt(); switch (exportAudio) { @@ -2036,41 +2054,20 @@ void RenderWidget::setRenderProfile(QMap props) if (!url.isEmpty()) m_view.out_file->setUrl(KUrl(url)); // set destination - for (int i = 0; i < m_view.destination_list->count(); i++) { - if (m_view.destination_list->itemData(i, Qt::UserRole) == props.value("renderdestination")) { - m_view.destination_list->setCurrentIndex(i); - break; - } - } - refreshCategory(); - - // set category - QString group = props.value("rendercategory"); - if (!group.isEmpty()) { - QList childs = m_view.format_list->findItems(group, Qt::MatchExactly); - if (!childs.isEmpty()) { - m_view.format_list->setCurrentItem(childs.at(0)); - m_view.format_list->scrollToItem(childs.at(0)); - } - refreshView(); - } - - // set profile - QList childs = m_view.size_list->findItems(props.value("renderprofile"), Qt::MatchExactly); - if (!childs.isEmpty()) { - m_view.size_list->setCurrentItem(childs.at(0)); - m_view.size_list->scrollToItem(childs.at(0)); - } - //refreshView(); + int categoryIndex = m_view.destination_list->findData(props.value("renderdestination")); + if (categoryIndex == -1) categoryIndex = 0; + m_view.destination_list->blockSignals(true); + m_view.destination_list->setCurrentIndex(categoryIndex); m_view.destination_list->blockSignals(false); - m_view.format_list->blockSignals(false); - + + // Clear previous error messages + refreshCategory(props.value("rendercategory"), props.value("renderprofile")); } bool RenderWidget::startWaitingRenderJobs() { m_blockProcessing = true; - QString autoscriptFile = getFreeScriptName("auto"); + QString autoscriptFile = getFreeScriptName(KUrl(), "auto"); QFile file(autoscriptFile); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { kWarning() << "////// ERROR writing to file: " << autoscriptFile; @@ -2108,15 +2105,18 @@ bool RenderWidget::startWaitingRenderJobs() return true; } -QString RenderWidget::getFreeScriptName(const QString &prefix) +QString RenderWidget::getFreeScriptName(const KUrl &projectName, const QString &prefix) { int ix = 0; QString scriptsFolder = m_projectFolder + "scripts/"; KStandardDirs::makeDir(scriptsFolder); QString path; + QString fileName; + if (projectName.isEmpty()) fileName = i18n("script"); + else fileName = projectName.fileName().section('.', 0, -2) + "_"; while (path.isEmpty() || QFile::exists(path)) { ix++; - path = scriptsFolder + prefix + i18n("script") + QString::number(ix).rightJustified(3, '0', false) + ".sh"; + path = scriptsFolder + prefix + fileName + QString::number(ix).rightJustified(3, '0', false) + ".sh"; } return path; } @@ -2144,7 +2144,12 @@ void RenderWidget::errorMessage(const QString &message) #if KDE_IS_VERSION(4,7,0) m_infoMessage->setMessageType(KMessageWidget::Warning); m_infoMessage->setText(message); +#if KDE_IS_VERSION(4,10,0) m_infoMessage->animatedShow(); +#else + // Workaround KDE bug in KMessageWidget + QTimer::singleShot(0, m_infoMessage, SLOT(animatedShow())); +#endif #else m_view.errorLabel->setText(message); m_view.errorBox->setHidden(false); @@ -2152,10 +2157,19 @@ void RenderWidget::errorMessage(const QString &message) } else { #if KDE_IS_VERSION(4,7,0) - m_infoMessage->animatedHide(); + if (m_view.tabWidget->currentIndex() == 0 && m_infoMessage->isVisible()) { +#if KDE_IS_VERSION(4,10,0) + m_infoMessage->animatedHide(); #else - m_view.errorBox->setHidden(true); - m_view.errorLabel->setText(QString()); + QTimer::singleShot(0, m_infoMessage, SLOT(animatedHide())); +#endif + } else { + // Seems like animated hide does not work when page is not visible + m_infoMessage->hide(); + } +#else + m_view.errorBox->setHidden(true); + m_view.errorLabel->setText(QString()); #endif } @@ -2223,8 +2237,25 @@ bool RenderWidget::proxyRendering() void RenderWidget::setRescaleEnabled(bool enable) { - for (int i = 0; i < m_view.rescale_box->layout()->count(); i++) { + for (int i = 0; i < m_view.rescale_box->layout()->count(); ++i) { if (m_view.rescale_box->itemAt(i)->widget()) m_view.rescale_box->itemAt(i)->widget()->setEnabled(enable); } } +void RenderWidget::keyPressEvent(QKeyEvent *e) { + if(e->key()==Qt::Key_Return || e->key()==Qt::Key_Enter) { + switch (m_view.tabWidget->currentIndex()) { + case 1: + if (m_view.start_job->isEnabled()) slotStartCurrentJob(); + break; + case 2: + if (m_view.start_script->isEnabled()) slotStartScript(); + break; + default: + if (m_view.buttonRender->isEnabled()) slotPrepareExport(); + break; + } + } + else QDialog::keyPressEvent(e); +} +