]> git.sesse.net Git - kdenlive/blobdiff - src/renderwidget.cpp
Make audio / video bitrate easily configurable in custom render profiles: http:/...
[kdenlive] / src / renderwidget.cpp
index d0d486e580acfc20c0cdee13bc05a9af494d8e0c..c521e39fc7d5ec22543fea6d741ee13af8654902 100644 (file)
@@ -464,6 +464,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 +500,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());
@@ -619,6 +632,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);
@@ -678,19 +710,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);
@@ -799,8 +825,12 @@ void RenderWidget::updateButtons()
 }
 
 
-void RenderWidget::focusFirstVisibleItem()
+void RenderWidget::focusFirstVisibleItem(const QString &profile)
 {
+    if (!profile.isEmpty()) {
+       QList <QListWidgetItem *> 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;
@@ -903,7 +933,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;
         }
     }
@@ -956,8 +986,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);
 
@@ -1169,17 +1199,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);
@@ -1202,12 +1233,15 @@ void RenderWidget::refreshCategory()
         }
     }
 
-    // activate first visible item
+    // activate requested item or first visible
+    QList<QListWidgetItem *> 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();
@@ -1225,10 +1259,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);
@@ -1345,9 +1380,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();
     }
@@ -1475,10 +1509,7 @@ void RenderWidget::reloadProfiles()
 
 void RenderWidget::parseProfiles(QString meta, QString group, 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);
@@ -1509,27 +1540,11 @@ 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<QListWidgetItem *> 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)
@@ -2007,8 +2022,6 @@ void RenderWidget::slotHideLog()
 
 void RenderWidget::setRenderProfile(QMap <QString, QString> 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) {
@@ -2042,35 +2055,14 @@ void RenderWidget::setRenderProfile(QMap <QString, QString> 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<QListWidgetItem *> 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<QListWidgetItem *> 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()
@@ -2166,14 +2158,19 @@ void RenderWidget::errorMessage(const QString &message)
     }
     else {
 #if KDE_IS_VERSION(4,7,0)
+       if (m_view.tabWidget->currentIndex() == 0 && m_infoMessage->isVisible())  {
 #if KDE_IS_VERSION(4,10,0)
-        m_infoMessage->animatedHide();
+           m_infoMessage->animatedHide();
 #else
-       QTimer::singleShot(0, m_infoMessage, SLOT(animatedHide()));
+           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());
+       m_view.errorBox->setHidden(true);
+       m_view.errorLabel->setText(QString());
 #endif
 
     }