]> git.sesse.net Git - kdenlive/blobdiff - src/kdenlivesettingsdialog.cpp
Fix Blackmagic Decklink output, cleanup pause / play stuff in all configs (SDL /...
[kdenlive] / src / kdenlivesettingsdialog.cpp
index 34297068c8e61ff847ac971ade8d10fabbb2b8fe..847bad756890117d8fd4dd81c66bedfb0cc6da5f 100644 (file)
@@ -22,9 +22,9 @@
 #ifdef USE_V4L
 #include "v4l/v4lcapture.h"
 #endif
-#include "blackmagic/devices.h"
 #include "encodingprofilesdialog.h"
 #include "kdenlivesettings.h"
+#include "renderer.h"
 
 #include <KStandardDirs>
 #include <KDebug>
@@ -33,6 +33,7 @@
 #include <kde_file.h>
 #include <KIO/NetAccess>
 #include <kdeversion.h>
+#include <KMessageBox>
 
 #include <QDir>
 #include <QTimer>
@@ -83,6 +84,8 @@ KdenliveSettingsDialog::KdenliveSettingsDialog(const QMap<QString, QString>& map
     m_configEnv.mltpathurl->setMode(KFile::Directory);
     m_configEnv.mltpathurl->lineEdit()->setObjectName("kcfg_mltpath");
     m_configEnv.rendererpathurl->lineEdit()->setObjectName("kcfg_rendererpath");
+    m_configEnv.ffmpegurl->lineEdit()->setObjectName("kcfg_ffmpegpath");
+    m_configEnv.ffplayurl->lineEdit()->setObjectName("kcfg_ffplaypath");
     m_configEnv.kcfg_mltthreads->setMaximum( QThread::idealThreadCount() < 4 ? QThread::idealThreadCount() : 3 );
     m_configEnv.tmppathurl->setMode(KFile::Directory);
     m_configEnv.tmppathurl->lineEdit()->setObjectName("kcfg_currenttmpfolder");
@@ -103,7 +106,7 @@ KdenliveSettingsDialog::KdenliveSettingsDialog(const QMap<QString, QString>& map
     for (int i = 0; i < 10; i++) {
         QString path = "/dev/video" + QString::number(i);
         if (QFile::exists(path)) {
-            QStringList deviceInfo = V4lCaptureHandler::getDeviceName(path.toUtf8().constData());
+            QStringList deviceInfo = V4lCaptureHandler::getDeviceName(path);
             if (!deviceInfo.isEmpty()) {
                 m_configCapture.kcfg_detectedv4ldevices->addItem(deviceInfo.at(0), path);
                 m_configCapture.kcfg_detectedv4ldevices->setItemData(m_configCapture.kcfg_detectedv4ldevices->count() - 1, deviceInfo.at(1), Qt::UserRole + 1);
@@ -112,7 +115,6 @@ KdenliveSettingsDialog::KdenliveSettingsDialog(const QMap<QString, QString>& map
     }
     connect(m_configCapture.kcfg_detectedv4ldevices, SIGNAL(currentIndexChanged(int)), this, SLOT(slotUpdatev4lDevice()));
     connect(m_configCapture.kcfg_v4l_format, SIGNAL(currentIndexChanged(int)), this, SLOT(slotUpdatev4lCaptureProfile()));
-    connect(m_configCapture.kcfg_v4l_captureaudio, SIGNAL(toggled(bool)), m_configCapture.kcfg_v4l_alsadevice, SLOT(setEnabled(bool)));
     connect(m_configCapture.config_v4l, SIGNAL(clicked()), this, SLOT(slotEditVideo4LinuxProfile()));
 
     slotUpdatev4lDevice();
@@ -120,10 +122,10 @@ KdenliveSettingsDialog::KdenliveSettingsDialog(const QMap<QString, QString>& map
 
     m_page4 = addPage(p4, i18n("Capture"), "media-record");
     m_configCapture.tabWidget->setCurrentIndex(KdenliveSettings::defaultcapture());
-#ifndef USE_V4L
+#ifdef Q_WS_MAC
     m_configCapture.tabWidget->setEnabled(false);
     m_configCapture.kcfg_defaultcapture->setEnabled(false);
-    m_configCapture.label->setText(i18n("Capture is not yet available on this platform."));
+    m_configCapture.label->setText(i18n("Capture is not yet available on Mac OS X."));
 #endif
 
     QWidget *p5 = new QWidget;
@@ -135,11 +137,22 @@ KdenliveSettingsDialog::KdenliveSettingsDialog(const QMap<QString, QString>& map
     m_configShuttle.shuttledisabled->hide();
 
     // Store the button pointers into an array for easier handling them in the other functions.
+    // TODO: impl enumerator or live with cut and paste :-)))
     m_shuttle_buttons.push_back(m_configShuttle.shuttle1);
     m_shuttle_buttons.push_back(m_configShuttle.shuttle2);
     m_shuttle_buttons.push_back(m_configShuttle.shuttle3);
     m_shuttle_buttons.push_back(m_configShuttle.shuttle4);
     m_shuttle_buttons.push_back(m_configShuttle.shuttle5);
+    m_shuttle_buttons.push_back(m_configShuttle.shuttle6);
+    m_shuttle_buttons.push_back(m_configShuttle.shuttle7);
+    m_shuttle_buttons.push_back(m_configShuttle.shuttle8);
+    m_shuttle_buttons.push_back(m_configShuttle.shuttle9);
+    m_shuttle_buttons.push_back(m_configShuttle.shuttle10);
+    m_shuttle_buttons.push_back(m_configShuttle.shuttle11);
+    m_shuttle_buttons.push_back(m_configShuttle.shuttle12);
+    m_shuttle_buttons.push_back(m_configShuttle.shuttle13);
+    m_shuttle_buttons.push_back(m_configShuttle.shuttle14);
+    m_shuttle_buttons.push_back(m_configShuttle.shuttle15);
 
     // populate the buttons with the current configuration. The items are sorted
     // according to the user-selected language, so they do not appear in random order.
@@ -176,6 +189,8 @@ KdenliveSettingsDialog::KdenliveSettingsDialog(const QMap<QString, QString>& map
 
     QWidget *p6 = new QWidget;
     m_configSdl.setupUi(p6);
+    m_configSdl.reload_blackmagic->setIcon(KIcon("view-refresh"));
+    connect(m_configSdl.reload_blackmagic, SIGNAL(clicked(bool)), this, SLOT(slotReloadBlackMagic()));
 
 #ifndef USE_OPENGL
     m_configSdl.kcfg_openglmonitors->setHidden(true);
@@ -188,7 +203,18 @@ KdenliveSettingsDialog::KdenliveSettingsDialog(const QMap<QString, QString>& map
     m_page7 = addPage(p7, i18n("Transcode"), "edit-copy");
     connect(m_configTranscode.button_add, SIGNAL(clicked()), this, SLOT(slotAddTranscode()));
     connect(m_configTranscode.button_delete, SIGNAL(clicked()), this, SLOT(slotDeleteTranscode()));
-    connect(m_configTranscode.profiles_list, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(slotDialogModified()));
+    connect(m_configTranscode.profiles_list, SIGNAL(itemChanged(QListWidgetItem *)), this, SLOT(slotDialogModified()));
+    connect(m_configTranscode.profiles_list, SIGNAL(currentRowChanged(int)), this, SLOT(slotSetTranscodeProfile()));
+    
+    connect(m_configTranscode.profile_name, SIGNAL(textChanged(const QString &)), this, SLOT(slotEnableTranscodeUpdate()));
+    connect(m_configTranscode.profile_description, SIGNAL(textChanged(const QString &)), this, SLOT(slotEnableTranscodeUpdate()));
+    connect(m_configTranscode.profile_extension, SIGNAL(textChanged(const QString &)), this, SLOT(slotEnableTranscodeUpdate()));
+    connect(m_configTranscode.profile_parameters, SIGNAL(textChanged()), this, SLOT(slotEnableTranscodeUpdate()));
+    connect(m_configTranscode.profile_audioonly, SIGNAL(stateChanged(int)), this, SLOT(slotEnableTranscodeUpdate()));
+    
+    connect(m_configTranscode.button_update, SIGNAL(pressed()), this, SLOT(slotUpdateTranscodingProfile()));
+    
+    m_configTranscode.profile_parameters->setMaximumHeight(QFontMetrics(font()).lineSpacing() * 5);
 
     connect(m_configCapture.kcfg_rmd_capture_audio, SIGNAL(clicked(bool)), m_configCapture.audio_group, SLOT(setVisible(bool)));
 
@@ -255,16 +281,11 @@ KdenliveSettingsDialog::KdenliveSettingsDialog(const QMap<QString, QString>& map
     slotUpdateV4lProfile(-1);
     slotUpdateDecklinkProfile(-1);
 
-    BMInterface::getBlackMagicDeviceList(m_configCapture.kcfg_decklink_capturedevice);
-    if (m_configCapture.kcfg_decklink_capturedevice->count() > 0) {
-        QStringList modes = m_configCapture.kcfg_decklink_capturedevice->itemData(m_configCapture.kcfg_decklink_capturedevice->currentIndex()).toStringList();
-        m_configCapture.kcfg_decklink_capturedevice->setToolTip(i18n("Supported capture modes:\n") + modes.join("\n"));
+    Render::getBlackMagicDeviceList(m_configCapture.kcfg_decklink_capturedevice);
+    if (!Render::getBlackMagicOutputDeviceList(m_configSdl.kcfg_blackmagic_output_device)) {
+        // No blackmagic card found
+       m_configSdl.kcfg_external_display->setEnabled(false);
     }
-    connect(m_configCapture.kcfg_decklink_capturedevice, SIGNAL(currentIndexChanged(int)), this, SLOT(slotUpdateHDMIModes()));
-
-    if (BMInterface::getBlackMagicOutputDeviceList(m_configSdl.kcfg_blackmagic_output_device)) {
-        // Found blackmagic card
-    } else m_configSdl.kcfg_external_display->setEnabled(false);
 
     double dvgrabVersion = 0;
     if (!KdenliveSettings::dvgrab_path().isEmpty()) {
@@ -298,12 +319,6 @@ KdenliveSettingsDialog::KdenliveSettingsDialog(const QMap<QString, QString>& map
 
 KdenliveSettingsDialog::~KdenliveSettingsDialog() {}
 
-void KdenliveSettingsDialog::slotUpdateHDMIModes()
-{
-    QStringList modes = m_configCapture.kcfg_decklink_capturedevice->itemData(m_configCapture.kcfg_decklink_capturedevice->currentIndex()).toStringList();
-    m_configCapture.kcfg_decklink_capturedevice->setToolTip(i18n("Supported capture modes:\n") + modes.join("\n"));
-}
-
 void KdenliveSettingsDialog::slotUpdateRmdRegionStatus()
 {
     m_configCapture.region_group->setHidden(m_configCapture.kcfg_rmd_capture_type->currentIndex() != 1);
@@ -393,13 +408,17 @@ void KdenliveSettingsDialog::initDevices()
                 }
                 if (line.contains("capture")) {
                     deviceId = line.section(':', 0, 0);
-                    m_configCapture.kcfg_rmd_alsa_device->addItem(line.section(':', 1, 1), "plughw:" + QString::number(deviceId.section('-', 0, 0).toInt()) + ',' + QString::number(deviceId.section('-', 1, 1).toInt()));
-                    m_configCapture.kcfg_v4l_alsadevice->addItem(line.section(':', 1, 1), "hw:" + QString::number(deviceId.section('-', 0, 0).toInt()) + ',' + QString::number(deviceId.section('-', 1, 1).toInt()));
+                    m_configCapture.kcfg_rmd_alsa_device->addItem(line.section(':', 1, 1).simplified(), "plughw:" + QString::number(deviceId.section('-', 0, 0).toInt()) + ',' + QString::number(deviceId.section('-', 1, 1).toInt()));
+                    m_configCapture.kcfg_v4l_alsadevice->addItem(line.section(':', 1, 1).simplified(), "hw:" + QString::number(deviceId.section('-', 0, 0).toInt()) + ',' + QString::number(deviceId.section('-', 1, 1).toInt()));
                 }
             }
             file.close();
         }
     }
+    
+    // Add pulseaudio capture option
+    m_configCapture.kcfg_v4l_alsadevice->addItem(i18n("PulseAudio"), "pulse");
+    
     if (!KdenliveSettings::audiodevicename().isEmpty()) {
         // Select correct alsa device
         int ix = m_configSdl.kcfg_audio_device->findData(KdenliveSettings::audiodevicename());
@@ -433,12 +452,12 @@ void KdenliveSettingsDialog::slotReadAudioDevices()
     QStringList lines = result.split('\n');
     foreach(const QString & data, lines) {
         //kDebug() << "// READING LINE: " << data;
-        if (!data.startsWith(" ") && data.count(':') > 1) {
+        if (!data.startsWith(' ') && data.count(':') > 1) {
             QString card = data.section(':', 0, 0).section(' ', -1);
             QString device = data.section(':', 1, 1).section(' ', -1);
-            m_configSdl.kcfg_audio_device->addItem(data.section(':', -1), "plughw:" + card + ',' + device);
-            m_configCapture.kcfg_rmd_alsa_device->addItem(data.section(':', -1), "plughw:" + card + ',' + device);
-            m_configCapture.kcfg_v4l_alsadevice->addItem(data.section(':', -1), "hw:" + card + ',' + device);
+            m_configSdl.kcfg_audio_device->addItem(data.section(':', -1).simplified(), "plughw:" + card + ',' + device);
+            m_configCapture.kcfg_rmd_alsa_device->addItem(data.section(':', -1).simplified(), "plughw:" + card + ',' + device);
+            m_configCapture.kcfg_v4l_alsadevice->addItem(data.section(':', -1).simplified(), "hw:" + card + ',' + device);
         }
     }
 }
@@ -476,47 +495,58 @@ void KdenliveSettingsDialog::showPage(int page, int option)
 void KdenliveSettingsDialog::slotEditVideoApplication()
 {
     KService::Ptr service;
-    KOpenWithDialog dlg(KUrl::List(), i18n("Select default video player"), m_configEnv.kcfg_defaultplayerapp->text(), this);
-    if (dlg.exec() != QDialog::Accepted)
+    QPointer<KOpenWithDialog> dlg = new KOpenWithDialog(KUrl::List(), i18n("Select default video player"), m_configEnv.kcfg_defaultplayerapp->text(), this);
+    if (dlg->exec() != QDialog::Accepted)
+    {
+        delete dlg;
         return;
+    }
 
-    service = dlg.service();
+    service = dlg->service();
     m_configEnv.kcfg_defaultplayerapp->setText(service->exec());
+    delete dlg;
 }
 
 void KdenliveSettingsDialog::slotEditAudioApplication()
 {
     KService::Ptr service;
-    KOpenWithDialog dlg(KUrl::List(), i18n("Select default audio editor"), m_configEnv.kcfg_defaultaudioapp->text(), this);
-    if (dlg.exec() != QDialog::Accepted)
+    QPointer<KOpenWithDialog> dlg = new KOpenWithDialog(KUrl::List(), i18n("Select default audio editor"), m_configEnv.kcfg_defaultaudioapp->text(), this);
+    if (dlg->exec() != QDialog::Accepted)
+    {
+        delete dlg;
         return;
+    }
 
-    service = dlg.service();
+    service = dlg->service();
     m_configEnv.kcfg_defaultaudioapp->setText(service->exec());
+    delete dlg;
 }
 
 void KdenliveSettingsDialog::slotEditImageApplication()
 {
     KService::Ptr service;
-    KOpenWithDialog dlg(KUrl::List(), i18n("Select default image editor"), m_configEnv.kcfg_defaultimageapp->text(), this);
-    if (dlg.exec() != QDialog::Accepted)
+    QPointer<KOpenWithDialog> dlg = new KOpenWithDialog(KUrl::List(), i18n("Select default image editor"), m_configEnv.kcfg_defaultimageapp->text(), this);
+    if (dlg->exec() != QDialog::Accepted)
+    {
+        delete dlg;
         return;
-
-    service = dlg.service();
+    }
+    service = dlg->service();
     m_configEnv.kcfg_defaultimageapp->setText(service->exec());
+    delete dlg;
 }
 
-#ifdef USE_JOGSHUTTLE
 void KdenliveSettingsDialog::slotCheckShuttle(int state)
 {
-    m_configShuttle.config_group->setEnabled(state);
+#ifdef USE_JOGSHUTTLE
+  m_configShuttle.config_group->setEnabled(state);
     if (m_configShuttle.shuttledevicelist->count() == 0) {
         // parse devices
         QString baseName = "/dev/input/event";
         int fd;
         for (int i = 0; i < 30; i++) {
             QString filename = baseName + QString::number(i);
-            kDebug() << "/// CHECKING OFR: " << filename;
+            kDebug() << "/// CHECKING device: " << filename;
 
             char name[256] = "unknown";
             fd = KDE_open((char *) filename.toUtf8().data(), O_RDONLY);
@@ -527,16 +557,17 @@ void KdenliveSettingsDialog::slotCheckShuttle(int state)
         }
         if (KdenliveSettings::shuttledevice().isEmpty()) QTimer::singleShot(1500, this, SLOT(slotUpdateShuttleDevice()));
     }
+#endif /* USE_JOGSHUTTLE */
 }
 
 void KdenliveSettingsDialog::slotUpdateShuttleDevice(int ix)
 {
+#ifdef USE_JOGSHUTTLE
     QString device = m_configShuttle.shuttledevicelist->itemData(ix).toString();
     //KdenliveSettings::setShuttledevice(device);
     m_configShuttle.kcfg_shuttledevice->setText(device);
-}
-
 #endif /* USE_JOGSHUTTLE */
+}
 
 void KdenliveSettingsDialog::updateWidgets()
 {
@@ -618,19 +649,19 @@ void KdenliveSettingsDialog::updateSettings()
 
     // Check encoding profiles
     QString data = m_configCapture.kcfg_v4l_profile->itemData(m_configCapture.kcfg_v4l_profile->currentIndex()).toString();
-    if (!data.isEmpty() && (data.section(";", 0, 0) != KdenliveSettings::v4l_parameters() || data.section(";", 1, 1) != KdenliveSettings::v4l_extension())) {
-        KdenliveSettings::setV4l_parameters(data.section(";", 0, 0));
-        KdenliveSettings::setV4l_extension(data.section(";", 1, 1));
+    if (!data.isEmpty() && (data.section(';', 0, 0) != KdenliveSettings::v4l_parameters() || data.section(';', 1, 1) != KdenliveSettings::v4l_extension())) {
+        KdenliveSettings::setV4l_parameters(data.section(';', 0, 0));
+        KdenliveSettings::setV4l_extension(data.section(';', 1, 1));
     }
     data = m_configCapture.kcfg_decklink_profile->itemData(m_configCapture.kcfg_decklink_profile->currentIndex()).toString();
-    if (!data.isEmpty() && (data.section(";", 0, 0) != KdenliveSettings::decklink_parameters() || data.section(";", 1, 1) != KdenliveSettings::decklink_extension())) {
-        KdenliveSettings::setDecklink_parameters(data.section(";", 0, 0));
-        KdenliveSettings::setDecklink_extension(data.section(";", 1, 1));
+    if (!data.isEmpty() && (data.section(';', 0, 0) != KdenliveSettings::decklink_parameters() || data.section(';', 1, 1) != KdenliveSettings::decklink_extension())) {
+        KdenliveSettings::setDecklink_parameters(data.section(';', 0, 0));
+        KdenliveSettings::setDecklink_extension(data.section(';', 1, 1));
     }
     data = m_configProject.kcfg_proxy_profile->itemData(m_configProject.kcfg_proxy_profile->currentIndex()).toString();
-    if (!data.isEmpty() && (data.section(";", 0, 0) != KdenliveSettings::proxyparams() || data.section(";", 1, 1) != KdenliveSettings::proxyextension())) {
-        KdenliveSettings::setProxyparams(data.section(";", 0, 0));
-        KdenliveSettings::setProxyextension(data.section(";", 1, 1));
+    if (!data.isEmpty() && (data.section(';', 0, 0) != KdenliveSettings::proxyparams() || data.section(';', 1, 1) != KdenliveSettings::proxyextension())) {
+        KdenliveSettings::setProxyparams(data.section(';', 0, 0));
+        KdenliveSettings::setProxyextension(data.section(';', 1, 1));
     }
 
 
@@ -741,52 +772,117 @@ void KdenliveSettingsDialog::slotCheckAlsaDriver()
 
 void KdenliveSettingsDialog::loadTranscodeProfiles()
 {
-    KSharedConfigPtr config = KSharedConfig::openConfig("kdenlivetranscodingrc");
+    KSharedConfigPtr config = KSharedConfig::openConfig("kdenlivetranscodingrc", KConfig::CascadeConfig);
     KConfigGroup transConfig(config, "Transcoding");
     // read the entries
     m_configTranscode.profiles_list->blockSignals(true);
+    m_configTranscode.profiles_list->clear();
     QMap< QString, QString > profiles = transConfig.entryMap();
     QMapIterator<QString, QString> i(profiles);
     while (i.hasNext()) {
         i.next();
-        QTreeWidgetItem *item = new QTreeWidgetItem(m_configTranscode.profiles_list, QStringList() << i.key() << i.value());
-        item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable);
+        QListWidgetItem *item = new QListWidgetItem(i.key());
+        QString data = i.value();
+        if (data.contains(';')) item->setToolTip(data.section(';', 1, 1));
+        item->setData(Qt::UserRole, data);
+        m_configTranscode.profiles_list->addItem(item);
+        //item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable);
     }
     m_configTranscode.profiles_list->blockSignals(false);
+    m_configTranscode.profiles_list->setCurrentRow(0);
 }
 
 void KdenliveSettingsDialog::saveTranscodeProfiles()
 {
-    KSharedConfigPtr config = KSharedConfig::openConfig("kdenlivetranscodingrc");
+    KSharedConfigPtr config = KSharedConfig::openConfig("kdenlivetranscodingrc", KConfig::CascadeConfig);
     //KSharedConfigPtr config = KGlobal::config();
     KConfigGroup transConfig(config, "Transcoding");
     // read the entries
     transConfig.deleteGroup();
-    int max = m_configTranscode.profiles_list->topLevelItemCount();
+    int max = m_configTranscode.profiles_list->count();
     for (int i = 0; i < max; i++) {
-        QTreeWidgetItem *item = m_configTranscode.profiles_list->topLevelItem(i);
-        transConfig.writeEntry(item->text(0), item->text(1));
+        QListWidgetItem *item = m_configTranscode.profiles_list->item(i);
+        transConfig.writeEntry(item->text(), item->data(Qt::UserRole).toString());
     }
     config->sync();
 }
 
 void KdenliveSettingsDialog::slotAddTranscode()
 {
-    QTreeWidgetItem *item = new QTreeWidgetItem(m_configTranscode.profiles_list, QStringList() << i18n("Name") << i18n("Parameters"));
-    item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable);
+    if (!m_configTranscode.profiles_list->findItems(m_configTranscode.profile_name->text(), Qt::MatchExactly).isEmpty()) {
+        KMessageBox::sorry(this, i18n("A profile with that name already exists"));
+        return;
+    }
+    QListWidgetItem *item = new QListWidgetItem(m_configTranscode.profile_name->text());
+    QString data = m_configTranscode.profile_parameters->toPlainText();
+    data.append(" %1." + m_configTranscode.profile_extension->text());
+    data.append(';');
+    if (!m_configTranscode.profile_description->text().isEmpty()) 
+        data.append(m_configTranscode.profile_description->text());
+    if (m_configTranscode.profile_audioonly->isChecked()) data.append(";audio");
+    item->setData(Qt::UserRole, data);
+    m_configTranscode.profiles_list->addItem(item);
     m_configTranscode.profiles_list->setCurrentItem(item);
-    m_configTranscode.profiles_list->editItem(item);
+    slotDialogModified();
+}
+
+void KdenliveSettingsDialog::slotUpdateTranscodingProfile()
+{
+    QListWidgetItem *item = m_configTranscode.profiles_list->currentItem();
+    if (!item) return;
+    m_configTranscode.button_update->setEnabled(false);
+    item->setText(m_configTranscode.profile_name->text());
+    QString data = m_configTranscode.profile_parameters->toPlainText();
+    data.append(" %1." + m_configTranscode.profile_extension->text());
+    data.append(';');
+    if (!m_configTranscode.profile_description->text().isEmpty())
+        data.append(m_configTranscode.profile_description->text());
+    if (m_configTranscode.profile_audioonly->isChecked()) data.append(";audio");
+    item->setData(Qt::UserRole, data);
     slotDialogModified();
 }
 
 void KdenliveSettingsDialog::slotDeleteTranscode()
 {
-    QTreeWidgetItem *item = m_configTranscode.profiles_list->currentItem();
+    QListWidgetItem *item = m_configTranscode.profiles_list->currentItem();
     if (item == NULL) return;
     delete item;
     slotDialogModified();
 }
 
+void KdenliveSettingsDialog::slotEnableTranscodeUpdate()
+{
+    if (!m_configTranscode.profile_box->isEnabled()) return;
+    bool allow = true;
+    if (m_configTranscode.profile_name->text().isEmpty() || m_configTranscode.profile_extension->text().isEmpty()) allow = false;
+    m_configTranscode.button_update->setEnabled(allow);
+}
+
+void KdenliveSettingsDialog::slotSetTranscodeProfile()
+{
+    m_configTranscode.profile_box->setEnabled(false);
+    m_configTranscode.button_update->setEnabled(false);
+    m_configTranscode.profile_name->clear();
+    m_configTranscode.profile_description->clear();
+    m_configTranscode.profile_extension->clear();
+    m_configTranscode.profile_parameters->clear();
+    m_configTranscode.profile_audioonly->setChecked(false);
+    QListWidgetItem *item = m_configTranscode.profiles_list->currentItem();
+    if (!item) {
+        return;
+    }
+    m_configTranscode.profile_name->setText(item->text());
+    QString data = item->data(Qt::UserRole).toString();
+    if (data.contains(';')) {
+        m_configTranscode.profile_description->setText(data.section(';', 1, 1));
+        if (data.section(';', 2, 2) == "audio") m_configTranscode.profile_audioonly->setChecked(true);
+        data = data.section(';', 0, 0).simplified();
+    }
+    m_configTranscode.profile_extension->setText(data.section('.', -1));
+    m_configTranscode.profile_parameters->setPlainText(data.section(' ', 0, -2));
+    m_configTranscode.profile_box->setEnabled(true);
+}
+
 void KdenliveSettingsDialog::slotShuttleModified()
 {
 #ifdef USE_JOGSHUTTLE
@@ -828,19 +924,19 @@ void KdenliveSettingsDialog::slotUpdatev4lDevice()
         m_configCapture.kcfg_v4l_format->addItem(i18n("Current settings"));
     }
 
-    QStringList pixelformats = info.split(">", QString::SkipEmptyParts);
+    QStringList pixelformats = info.split('>', QString::SkipEmptyParts);
     QString itemSize;
     QString pixelFormat;
     QStringList itemRates;
     for (int i = 0; i < pixelformats.count(); i++) {
         QString format = pixelformats.at(i).section(':', 0, 0);
-        QStringList sizes = pixelformats.at(i).split(":", QString::SkipEmptyParts);
+        QStringList sizes = pixelformats.at(i).split(':', QString::SkipEmptyParts);
         pixelFormat = sizes.takeFirst();
         for (int j = 0; j < sizes.count(); j++) {
-            itemSize = sizes.at(j).section("=", 0, 0);
-            itemRates = sizes.at(j).section("=", 1, 1).split(",", QString::SkipEmptyParts);
+            itemSize = sizes.at(j).section('=', 0, 0);
+            itemRates = sizes.at(j).section('=', 1, 1).split(',', QString::SkipEmptyParts);
             for (int k = 0; k < itemRates.count(); k++) {
-                m_configCapture.kcfg_v4l_format->addItem("[" + format + "] " + itemSize + " (" + itemRates.at(k) + ")", QStringList() << format << itemSize.section('x', 0, 0) << itemSize.section('x', 1, 1) << itemRates.at(k).section('/', 0, 0) << itemRates.at(k).section('/', 1, 1));
+                m_configCapture.kcfg_v4l_format->addItem('[' + format + "] " + itemSize + " (" + itemRates.at(k) + ')', QStringList() << format << itemSize.section('x', 0, 0) << itemSize.section('x', 1, 1) << itemRates.at(k).section('/', 0, 0) << itemRates.at(k).section('/', 1, 1));
             }
         }
     }
@@ -919,7 +1015,7 @@ void KdenliveSettingsDialog::slotManageEncodingProfile()
         if (m_configCapture.tabWidget->currentIndex() == 1) type = 1;
         else if (m_configCapture.tabWidget->currentIndex() == 3) type = 2;
     }
-    EncodingProfilesDialog *d = new EncodingProfilesDialog(type);
+    QPointer<EncodingProfilesDialog> d = new EncodingProfilesDialog(type);
     d->exec();
     delete d;
     loadEncodingProfiles();
@@ -980,7 +1076,7 @@ void KdenliveSettingsDialog::slotUpdateDecklinkProfile(int ix)
     else ix = m_configCapture.kcfg_decklink_profile->currentIndex();
     QString data = m_configCapture.kcfg_decklink_profile->itemData(ix).toString();
     if (data.isEmpty()) return;
-    m_configCapture.decklink_parameters->setPlainText(data.section(";", 0, 0));
+    m_configCapture.decklink_parameters->setPlainText(data.section(';', 0, 0));
     //
 }
 
@@ -990,7 +1086,7 @@ void KdenliveSettingsDialog::slotUpdateV4lProfile(int ix)
     else ix = m_configCapture.kcfg_v4l_profile->currentIndex();
     QString data = m_configCapture.kcfg_v4l_profile->itemData(ix).toString();
     if (data.isEmpty()) return;
-    m_configCapture.v4l_parameters->setPlainText(data.section(";", 0, 0));
+    m_configCapture.v4l_parameters->setPlainText(data.section(';', 0, 0));
     //
 }
 
@@ -1000,14 +1096,14 @@ void KdenliveSettingsDialog::slotUpdateProxyProfile(int ix)
     else ix = m_configProject.kcfg_proxy_profile->currentIndex();
     QString data = m_configProject.kcfg_proxy_profile->itemData(ix).toString();
     if (data.isEmpty()) return;
-    m_configProject.proxyparams->setPlainText(data.section(";", 0, 0));
+    m_configProject.proxyparams->setPlainText(data.section(';', 0, 0));
     //
 }
 
 void KdenliveSettingsDialog::slotEditVideo4LinuxProfile()
 {
     QString vl4ProfilePath = KStandardDirs::locateLocal("appdata", "profiles/video4linux");
-    ProfilesDialog *w = new ProfilesDialog(vl4ProfilePath);
+    QPointer<ProfilesDialog> w = new ProfilesDialog(vl4ProfilePath);
     if (w->exec() == QDialog::Accepted) {
         // save and update profile
         loadCurrentV4lProfileInfo();
@@ -1015,6 +1111,15 @@ void KdenliveSettingsDialog::slotEditVideo4LinuxProfile()
     delete w;
 }
 
+void KdenliveSettingsDialog::slotReloadBlackMagic()
+{
+    Render::getBlackMagicDeviceList(m_configCapture.kcfg_decklink_capturedevice, true);
+    if (!Render::getBlackMagicOutputDeviceList(m_configSdl.kcfg_blackmagic_output_device), true) {
+        // No blackmagic card found
+       m_configSdl.kcfg_external_display->setEnabled(false);
+    }
+    m_configSdl.kcfg_external_display->setEnabled(KdenliveSettings::decklink_device_found());
+}
 #include "kdenlivesettingsdialog.moc"