]> git.sesse.net Git - kdenlive/blobdiff - src/renderwidget.cpp
Use a qsplitter
[kdenlive] / src / renderwidget.cpp
index c800c0437164e136bc1e59dfee0f1fabb87e25e9..a71ec3bf30f2a454d9f035bdefa72c8b2d1565b3 100644 (file)
@@ -134,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),
@@ -236,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()));
 
@@ -255,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()));
@@ -382,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);
@@ -391,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());
@@ -400,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));
 }
 
@@ -408,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);
@@ -423,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));
     }
 }
 
@@ -450,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());
@@ -464,6 +463,25 @@ void RenderWidget::slotSaveProfile()
     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();
@@ -481,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());
@@ -504,7 +516,7 @@ void RenderWidget::slotSaveProfile()
 }
 
 
-void RenderWidget::saveProfile(QDomElement newprofile)
+void RenderWidget::saveProfile(const QDomElement &newprofile)
 {
     QString exportFile = KStandardDirs::locateLocal("appdata", "export/customprofiles.xml");
     QDomDocument doc;
@@ -545,7 +557,7 @@ void RenderWidget::saveProfile(QDomElement newprofile)
                 break;
             }
         }
-        i++;
+        ++i;
     }
 
     profiles.appendChild(newprofile);
@@ -605,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());
@@ -619,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);
@@ -666,7 +697,7 @@ void RenderWidget::slotEditProfile()
                     break;
                 }
             }
-            i++;
+            ++i;
         }
 
         QDomElement profileElement = doc.createElement("profile");
@@ -678,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);
@@ -754,7 +779,7 @@ void RenderWidget::slotDeleteProfile(bool refresh)
             doc.documentElement().removeChild(profiles.item(i));
             break;
         }
-        i++;
+        ++i;
     }
 
     if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
@@ -835,12 +860,12 @@ void RenderWidget::slotPrepareExport(bool scriptExport)
 }
 
 
-void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const QMap <QString, QString> metadata, const QString &playlistPath, const QString &scriptPath, bool exportAudio)
+void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const QMap<QString, QString> &metadata, const QString &playlistPath, const QString &scriptPath, bool exportAudio)
 {
     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.
@@ -907,7 +932,7 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const
     if (m_view.export_meta->isChecked()) {
         QMap<QString, QString>::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;
         }
     }
@@ -960,8 +985,8 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const
     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<int>(m_view.checkTwoPass->isChecked()) + 1);
 
@@ -1158,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());
@@ -1199,7 +1224,7 @@ void RenderWidget::refreshCategory(const QString &group, const QString &profile)
         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());
@@ -1265,7 +1290,7 @@ void RenderWidget::refreshView(const QString &profile)
     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) {
@@ -1366,7 +1391,7 @@ void RenderWidget::refreshView(const QString &profile)
     }
 }
 
-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);
@@ -1481,7 +1506,7 @@ 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.destination_list->blockSignals(true);
     m_view.destination_list->clear();
@@ -1521,7 +1546,7 @@ void RenderWidget::parseProfiles(QString meta, QString group, QString profile)
     refreshCategory(group, profile);
 }
 
-void RenderWidget::parseFile(QString exportFile, bool editable)
+void RenderWidget::parseFile(const QString &exportFile, bool editable)
 {
     kDebug() << "// Parsing file: " << exportFile;
     kDebug() << "------------------------------";
@@ -1550,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();
@@ -1740,7 +1765,7 @@ void RenderWidget::parseFile(QString exportFile, bool editable)
             n = n.nextSibling();
         }
 
-        i++;
+        ++i;
     }
 }
 
@@ -1847,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<RenderJobItem*>(m_view.running_jobs->topLevelItem(i));
         if (current == static_cast<RenderJobItem*> (m_view.running_jobs->currentItem())) {
             current->setSizeHint(1, QSize(m_view.running_jobs->columnWidth(1), fontMetrics().height() * 3));
@@ -1931,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));
@@ -1994,7 +2019,7 @@ void RenderWidget::slotHideLog()
     m_view.error_box->setVisible(false);
 }
 
-void RenderWidget::setRenderProfile(QMap <QString, QString> props)
+void RenderWidget::setRenderProfile(const QMap<QString, QString> &props)
 {
     m_view.scanning_list->setCurrentIndex(props.value("renderscanning").toInt());
     int exportAudio = props.value("renderexportaudio").toInt();
@@ -2212,7 +2237,7 @@ 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);
     }   
 }
@@ -2234,3 +2259,5 @@ void RenderWidget::keyPressEvent(QKeyEvent *e) {
     else QDialog::keyPressEvent(e);
 }
 
+
+#include "renderwidget.moc"