]> git.sesse.net Git - kdenlive/blobdiff - src/renderwidget.cpp
* Vectorscope added
[kdenlive] / src / renderwidget.cpp
index 26cd92944549c23c822e4ac079d58b5782227d11..7d447b7ad2e42578a7d873247626ad7ab27b6126 100644 (file)
@@ -32,7 +32,6 @@
 #include <KColorScheme>
 #include <KNotification>
 #include <KStartupInfo>
-// #include <knewstuff2/engine.h>
 
 #include <QDomDocument>
 #include <QItemDelegate>
@@ -88,20 +87,16 @@ RenderWidget::RenderWidget(const QString &projectfolder, QWidget * parent) :
         m_view.buttonInfo->setDown(true);
     } else m_view.advanced_params->hide();
 
-    m_view.rescale_size->setInputMask("0099\\x0099");
-    m_view.rescale_size->setText("320x240");
+    m_view.rescale_keep->setChecked(KdenliveSettings::rescalekeepratio());
+    connect(m_view.rescale_width, SIGNAL(valueChanged(int)), this, SLOT(slotUpdateRescaleWidth(int)));
+    connect(m_view.rescale_height, SIGNAL(valueChanged(int)), this, SLOT(slotUpdateRescaleHeight(int)));
+    m_view.rescale_keep->setIcon(KIcon("insert-link"));
+    m_view.rescale_keep->setToolTip(i18n("Preserve aspect ratio"));
+    connect(m_view.rescale_keep, SIGNAL(clicked()), this, SLOT(slotSwitchAspectRatio()));
 
+    connect(m_view.buttonRender, SIGNAL(clicked()), this, SLOT(slotPrepareExport()));
+    connect(m_view.buttonGenerateScript, SIGNAL(clicked()), this, SLOT(slotGenerateScript()));
 
-    QMenu *renderMenu = new QMenu(i18n("Start Rendering"), this);
-    QAction *renderAction = renderMenu->addAction(KIcon("video-x-generic"), i18n("Render to File"));
-    connect(renderAction, SIGNAL(triggered()), this, SLOT(slotPrepareExport()));
-    QAction *scriptAction = renderMenu->addAction(KIcon("application-x-shellscript"), i18n("Generate Script"));
-    connect(scriptAction, SIGNAL(triggered()), this, SLOT(slotGenerateScript()));
-
-    m_view.buttonStart->setMenu(renderMenu);
-    m_view.buttonStart->setPopupMode(QToolButton::MenuButtonPopup);
-    m_view.buttonStart->setDefaultAction(renderAction);
-    m_view.buttonStart->setToolButtonStyle(Qt::ToolButtonTextOnly);
     m_view.abort_job->setEnabled(false);
     m_view.start_script->setEnabled(false);
     m_view.delete_script->setEnabled(false);
@@ -109,6 +104,13 @@ RenderWidget::RenderWidget(const QString &projectfolder, QWidget * parent) :
     m_view.format_list->setAlternatingRowColors(true);
     m_view.size_list->setAlternatingRowColors(true);
 
+    KColorScheme scheme(palette().currentColorGroup(), KColorScheme::Window);
+    QPalette p = m_view.errorLabel->palette();
+    p.setColor(QPalette::Background, scheme.background(KColorScheme::NegativeBackground).color());
+    m_view.errorLabel->setAutoFillBackground(true);
+    m_view.errorLabel->setPalette(p);
+    m_view.errorLabel->setHidden(true);
+
     parseProfiles();
     parseScriptFiles();
 
@@ -133,7 +135,7 @@ RenderWidget::RenderWidget(const QString &projectfolder, QWidget * parent) :
     connect(m_view.buttonClose, SIGNAL(clicked()), this, SLOT(hide()));
     connect(m_view.buttonClose2, SIGNAL(clicked()), this, SLOT(hide()));
     connect(m_view.buttonClose3, SIGNAL(clicked()), this, SLOT(hide()));
-    connect(m_view.rescale, SIGNAL(toggled(bool)), m_view.rescale_size, SLOT(setEnabled(bool)));
+    connect(m_view.rescale, SIGNAL(toggled(bool)), m_view.rescale_box, SLOT(setEnabled(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 &)));
@@ -151,8 +153,9 @@ RenderWidget::RenderWidget(const QString &projectfolder, QWidget * parent) :
 
     connect(m_view.format_selection, SIGNAL(activated(int)), this, SLOT(refreshView()));
 
-    m_view.buttonStart->setEnabled(false);
-    m_view.rescale_size->setEnabled(false);
+    m_view.buttonRender->setEnabled(false);
+    m_view.buttonGenerateScript->setEnabled(false);
+    m_view.rescale_box->setEnabled(false);
     m_view.guides_box->setVisible(false);
     m_view.open_dvd->setVisible(false);
     m_view.create_chapter->setVisible(false);
@@ -195,9 +198,8 @@ RenderWidget::RenderWidget(const QString &projectfolder, QWidget * parent) :
     }
 
     QDBusConnectionInterface* interface = QDBusConnection::sessionBus().interface();
-    if (!interface || !interface->isServiceRegistered("org.kde.ksmserver")) {
+    if (!interface || (!interface->isServiceRegistered("org.kde.ksmserver") && !interface->isServiceRegistered("org.gnome.SessionManager")))
         m_view.shutdown->setEnabled(false);
-    }
 
     focusFirstVisibleItem();
 }
@@ -293,15 +295,17 @@ void RenderWidget::setGuides(QDomElement guidesxml, double duration)
  */
 void RenderWidget::slotUpdateButtons(KUrl url)
 {
-    if (m_view.out_file->url().isEmpty()) m_view.buttonStart->setEnabled(false);
-    else {
+    if (m_view.out_file->url().isEmpty()) {
+        m_view.buttonGenerateScript->setEnabled(false);
+        m_view.buttonRender->setEnabled(false);
+    } else {
         updateButtons(); // This also checks whether the selected format is available
-        //m_view.buttonStart->setEnabled(true);
     }
     if (url != 0) {
         QListWidgetItem *item = m_view.size_list->currentItem();
         if (!item) {
-            m_view.buttonStart->setEnabled(false);
+            m_view.buttonRender->setEnabled(false);
+            m_view.buttonGenerateScript->setEnabled(false);
             return;
         }
         QString extension = item->data(ExtensionRole).toString();
@@ -316,9 +320,12 @@ void RenderWidget::slotUpdateButtons(KUrl url)
  */
 void RenderWidget::slotUpdateButtons()
 {
-    if (m_view.out_file->url().isEmpty()) m_view.buttonStart->setEnabled(false);
-    else updateButtons(); // This also checks whether the selected format is available
-    //else m_view.buttonStart->setEnabled(true);
+    if (m_view.out_file->url().isEmpty()) {
+        m_view.buttonRender->setEnabled(false);
+        m_view.buttonGenerateScript->setEnabled(false);
+    } else {
+        updateButtons(); // This also checks whether the selected format is available
+    }
 }
 
 void RenderWidget::slotSaveProfile()
@@ -619,10 +626,12 @@ void RenderWidget::updateButtons()
         m_view.buttonSave->setEnabled(false);
         m_view.buttonDelete->setEnabled(false);
         m_view.buttonEdit->setEnabled(false);
-        m_view.buttonStart->setEnabled(false);
+        m_view.buttonRender->setEnabled(false);
+        m_view.buttonGenerateScript->setEnabled(false);
     } else {
         m_view.buttonSave->setEnabled(true);
-        m_view.buttonStart->setEnabled(m_view.size_list->currentItem()->toolTip().isEmpty());
+        m_view.buttonRender->setEnabled(m_view.size_list->currentItem()->toolTip().isEmpty());
+        m_view.buttonGenerateScript->setEnabled(m_view.size_list->currentItem()->toolTip().isEmpty());
         QString edit = m_view.size_list->currentItem()->data(EditableRole).toString();
         if (edit.isEmpty() || !edit.endsWith("customprofiles.xml")) {
             m_view.buttonDelete->setEnabled(false);
@@ -651,13 +660,17 @@ void RenderWidget::slotPrepareExport(bool scriptExport)
         KMessageBox::sorry(this, i18n("Cannot find the melt program required for rendering (part of Mlt)"));
         return;
     }
-    if (m_view.play_after->isChecked() && KdenliveSettings::defaultplayerapp().isEmpty())
+    if (m_view.play_after->isChecked() && KdenliveSettings::defaultplayerapp().isEmpty()) {
         KMessageBox::sorry(this, i18n("Cannot play video after rendering because the default video player application is not set.\nPlease define it in Kdenlive settings dialog."));
+    }
     QString chapterFile;
     if (m_view.create_chapter->isChecked()) chapterFile = m_view.out_file->url().path() + ".dvdchapter";
 
     // mantisbt 1051
-    KStandardDirs::makeDir(m_view.out_file->url().directory());
+    if (!KStandardDirs::makeDir(m_view.out_file->url().directory())) {
+        KMessageBox::sorry(this, i18n("The directory %1, could not be created.\nPlease make sure you have the required permissions.", m_view.out_file->url().directory()));
+        return;
+    }
 
     emit prepareRenderingData(scriptExport, m_view.render_zone->isChecked(), chapterFile);
 }
@@ -722,8 +735,8 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const
     int width;
     int height;
     if (m_view.rescale->isChecked() && m_view.rescale->isEnabled()) {
-        width = m_view.rescale_size->text().section('x', 0, 0).toInt();
-        height = m_view.rescale_size->text().section('x', 1, 1).toInt();
+        width = m_view.rescale_width->value();
+        height = m_view.rescale_height->value();
     } else {
         width = m_profile.width;
         height = m_profile.height;
@@ -808,7 +821,7 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const
     m_view.tabWidget->setCurrentIndex(1);
 
     // Save rendering profile to document
-    emit selectedRenderProfile(m_view.size_list->currentItem()->data(MetaGroupRole).toString(), m_view.size_list->currentItem()->text(), dest);
+    emit selectedRenderProfile(m_view.size_list->currentItem()->data(MetaGroupRole).toString(), m_view.size_list->currentItem()->data(GroupRole).toString(), m_view.size_list->currentItem()->text(), dest);
 
     // insert item in running jobs list
     QTreeWidgetItem *renderItem;
@@ -816,7 +829,7 @@ void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const
     if (!existing.isEmpty()) {
         renderItem = existing.at(0);
         if (renderItem->data(1, Qt::UserRole + 2).toInt() == RUNNINGJOB) {
-            KMessageBox::information(this, i18n("There is already a job writing file:<br><b>%1</b><br>Abort the job if you want to overwrite it...", dest), i18n("Already running"));
+            KMessageBox::information(this, i18n("There is already a job writing file:<br /><b>%1</b><br />Abort the job if you want to overwrite it...", dest), i18n("Already running"));
             return;
         }
         renderItem->setData(1, Qt::UserRole + 4, QString());
@@ -915,6 +928,12 @@ void RenderWidget::setProfile(MltVideoProfile profile)
     if (m_profile.description.contains("pal", Qt::CaseInsensitive) || m_profile.description.contains("25", Qt::CaseInsensitive) || m_profile.description.contains("50", Qt::CaseInsensitive)) m_view.format_selection->setCurrentIndex(0);
     else m_view.format_selection->setCurrentIndex(1);
     m_view.scanning_list->setCurrentIndex(0);
+    m_view.rescale_width->setValue(KdenliveSettings::defaultrescalewidth());
+    if (!m_view.rescale_keep->isChecked()) {
+        m_view.rescale_height->blockSignals(true);
+        m_view.rescale_height->setValue(KdenliveSettings::defaultrescaleheight());
+        m_view.rescale_height->blockSignals(false);
+    }
     refreshView();
 }
 
@@ -936,11 +955,12 @@ void RenderWidget::refreshCategory()
         m_view.open_dvd->setVisible(false);
         m_view.create_chapter->setVisible(false);
     }
-    if (destination == "websites") m_view.open_browser->setVisible(true);
-    else m_view.open_browser->setVisible(false);
-    if (!destination.isEmpty() && QString("dvd websites audioonly").contains(destination))
-        m_view.rescale->setEnabled(false);
-    else m_view.rescale->setEnabled(true);
+
+    if (destination == "websites")
+        m_view.open_browser->setVisible(true);
+    else
+        m_view.open_browser->setVisible(false);
+
     // hide groups that are not in the correct destination
     for (int i = 0; i < m_renderCategory.count(); i++) {
         sizeItem = m_renderCategory.at(i);
@@ -967,8 +987,10 @@ void RenderWidget::refreshCategory()
         m_view.size_list->setEnabled(true);
     }
 
-    if (m_view.format_list->count() > 1) m_view.format_list->setVisible(true);
-    else m_view.format_list->setVisible(false);
+    if (m_view.format_list->count() > 1)
+        m_view.format_list->setVisible(true);
+    else
+        m_view.format_list->setVisible(false);
     refreshView();
 }
 
@@ -1092,30 +1114,27 @@ KUrl RenderWidget::filenameWithExtension(KUrl url, QString extension)
     return KUrl(directory + filename);
 }
 
-
-/**
- * Called when a new format or size has been selected.
- */
 void RenderWidget::refreshParams()
 {
     // Format not available (e.g. codec not installed); Disable start button
     QListWidgetItem *item = m_view.size_list->currentItem();
     if (!item || item->isHidden()) {
         m_view.advanced_params->clear();
-        m_view.buttonStart->setEnabled(false);
+        m_view.buttonRender->setEnabled(false);
+        m_view.buttonGenerateScript->setEnabled(false);
         return;
     }
     QString params = item->data(ParamsRole).toString();
     QString extension = item->data(ExtensionRole).toString();
     m_view.advanced_params->setPlainText(params);
     QString destination = m_view.destination_list->itemData(m_view.destination_list->currentIndex()).toString();
-    if (params.contains(" s=") || destination == "audioonly") {
+    if (params.contains(" s=") || params.startsWith("s=") || destination == "audioonly") {
         // profile has a fixed size, do not allow resize
         m_view.rescale->setEnabled(false);
-        m_view.rescale_size->setEnabled(false);
+        m_view.rescale_box->setEnabled(false);
     } else {
         m_view.rescale->setEnabled(true);
-        m_view.rescale_size->setEnabled(true);
+        m_view.rescale_box->setEnabled(m_view.rescale->isChecked());
     }
     KUrl url = filenameWithExtension(m_view.out_file->url(), extension);
     m_view.out_file->setUrl(url);
@@ -1138,7 +1157,8 @@ void RenderWidget::refreshParams()
         m_view.buttonEdit->setEnabled(true);
     }
 
-    m_view.buttonStart->setEnabled(m_view.size_list->currentItem()->toolTip().isEmpty());
+    m_view.buttonRender->setEnabled(m_view.size_list->currentItem()->toolTip().isEmpty());
+    m_view.buttonGenerateScript->setEnabled(m_view.size_list->currentItem()->toolTip().isEmpty());
 }
 
 void RenderWidget::reloadProfiles()
@@ -1220,7 +1240,7 @@ void RenderWidget::parseFile(QString exportFile, bool editable)
     QListWidgetItem *item = NULL;
     const QStringList acodecsList = KdenliveSettings::audiocodecs();
     bool replaceVorbisCodec = false;
-    if (!acodecsList.contains("vorbis") && acodecsList.contains("libvorbis")) replaceVorbisCodec = true;
+    if (acodecsList.contains("libvorbis")) replaceVorbisCodec = true;
     bool replaceLibfaacCodec = false;
     if (!acodecsList.contains("aac") && acodecsList.contains("libfaac")) replaceLibfaacCodec = true;
 
@@ -1620,7 +1640,7 @@ void RenderWidget::slotStartScript()
         if (!existing.isEmpty()) {
             renderItem = existing.at(0);
             if (renderItem->data(1, Qt::UserRole + 2).toInt() == RUNNINGJOB) {
-                KMessageBox::information(this, i18n("There is already a job writing file:<br><b>%1</b><br>Abort the job if you want to overwrite it...", destination), i18n("Already running"));
+                KMessageBox::information(this, i18n("There is already a job writing file:<br /><b>%1</b><br />Abort the job if you want to overwrite it...", destination), i18n("Already running"));
                 return;
             }
         } else renderItem = new QTreeWidgetItem(m_view.running_jobs, QStringList() << QString() << destination << QString());
@@ -1659,34 +1679,39 @@ void RenderWidget::slotHideLog()
     m_view.error_box->setVisible(false);
 }
 
-void RenderWidget::setRenderProfile(const QString &dest, const QString &name, const QString &url)
+void RenderWidget::setRenderProfile(const QString &dest, const QString &group, const QString &name, const QString &url)
 {
     m_view.destination_list->blockSignals(true);
     m_view.format_list->blockSignals(true);
-    m_view.size_list->blockSignals(true);
 
     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) == dest) {
             m_view.destination_list->setCurrentIndex(i);
             break;
         }
     }
+    refreshCategory();
+
+    // set category
+    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(name, Qt::MatchExactly);
     if (!childs.isEmpty()) {
-        QListWidgetItem *profile = childs.at(0);
-        if (profile->isHidden()) {
-            QString group = profile->data(GroupRole).toString();
-            childs = m_view.format_list->findItems(group, Qt::MatchExactly);
-            if (!childs.isEmpty()) {
-                m_view.format_list->setCurrentItem(childs.at(0));
-            }
-        }
-        //refreshView();
-        m_view.size_list->blockSignals(false);
-        m_view.size_list->setCurrentItem(profile);
-    } else m_view.size_list->blockSignals(false);
+        m_view.size_list->setCurrentItem(childs.at(0));
+        m_view.size_list->scrollToItem(childs.at(0));
+    }
+    //refreshView();
     m_view.destination_list->blockSignals(false);
     m_view.format_list->blockSignals(false);
 
@@ -1754,5 +1779,42 @@ void RenderWidget::slotPlayRendering(QTreeWidgetItem *item, int)
     KRun::runCommand(command, KdenliveSettings::defaultplayerapp(), KdenliveSettings::defaultplayerapp(), this, startId);
 }
 
+void RenderWidget::missingClips(bool hasMissing)
+{
+    if (hasMissing) {
+        m_view.errorLabel->setText(i18n("Check missing clips"));
+        m_view.errorLabel->setHidden(false);
+    } else m_view.errorLabel->setHidden(true);
+}
 
+void RenderWidget::enableAudio(bool enable)
+{
+    m_view.export_audio->setChecked(enable);
+}
+
+void RenderWidget::slotUpdateRescaleWidth(int val)
+{
+    KdenliveSettings::setDefaultrescalewidth(val);
+    if (!m_view.rescale_keep->isChecked()) return;
+    m_view.rescale_height->blockSignals(true);
+    m_view.rescale_height->setValue(val * m_profile.height / m_profile.width  + 0.5);
+    KdenliveSettings::setDefaultrescaleheight(m_view.rescale_height->value());
+    m_view.rescale_height->blockSignals(false);
+}
+
+void RenderWidget::slotUpdateRescaleHeight(int val)
+{
+    KdenliveSettings::setDefaultrescaleheight(val);
+    if (!m_view.rescale_keep->isChecked()) return;
+    m_view.rescale_width->blockSignals(true);
+    m_view.rescale_width->setValue(val * m_profile.width / m_profile.height + 0.5);
+    KdenliveSettings::setDefaultrescaleheight(m_view.rescale_width->value());
+    m_view.rescale_width->blockSignals(false);
+}
+
+void RenderWidget::slotSwitchAspectRatio()
+{
+    KdenliveSettings::setRescalekeepratio(m_view.rescale_keep->isChecked());
+    if (m_view.rescale_keep->isChecked()) slotUpdateRescaleWidth(m_view.rescale_width->value());
+}