X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fkdenlivesettingsdialog.cpp;h=ff953b5bd3748feeb2fe5a93f6278f9239ad412e;hb=62ccb2748533f481b9cb02040a9bb83613907df0;hp=56b9709db2b070b3ac856a263511beb46e603dc2;hpb=7893afa29547c481ca7e58363a7e82bdb824ebf8;p=kdenlive diff --git a/src/kdenlivesettingsdialog.cpp b/src/kdenlivesettingsdialog.cpp index 56b9709d..ff953b5b 100644 --- a/src/kdenlivesettingsdialog.cpp +++ b/src/kdenlivesettingsdialog.cpp @@ -19,6 +19,11 @@ #include "kdenlivesettingsdialog.h" #include "profilesdialog.h" +#ifdef USE_V4L +#include "v4l/v4lcapture.h" +#endif +#include "blackmagic/devices.h" +#include "encodingprofilesdialog.h" #include "kdenlivesettings.h" #include @@ -32,31 +37,42 @@ #include #include #include +#include #include #include #include #include -#ifndef NO_JOGSHUTTLE +#ifdef USE_JOGSHUTTLE +#include "jogaction.h" +#include "jogshuttleconfig.h" #include -#endif /* NO_JOGSHUTTLE */ +#endif -KdenliveSettingsDialog::KdenliveSettingsDialog(QWidget * parent) : +KdenliveSettingsDialog::KdenliveSettingsDialog(const QMap& mappable_actions, QWidget * parent) : KConfigDialog(parent, "settings", KdenliveSettings::self()), - m_modified(false) + m_modified(false), + m_shuttleModified(false), + m_mappable_actions(mappable_actions) { - + KdenliveSettings::setV4l_format(0); QWidget *p1 = new QWidget; m_configMisc.setupUi(p1); m_page1 = addPage(p1, i18n("Misc"), "configure"); // Hide multi tab option until Kdenlive really supports it m_configMisc.kcfg_activatetabs->setVisible(false); + // Hide avformat-novalidate trick, causes crash (bug #2205 and #2206) + m_configMisc.kcfg_projectloading_avformatnovalidate->setVisible(false); QWidget *p8 = new QWidget; m_configProject.setupUi(p8); m_page8 = addPage(p8, i18n("Project Defaults"), "document-new"); + connect(m_configProject.kcfg_generateproxy, SIGNAL(toggled(bool)), m_configProject.kcfg_proxyminsize, SLOT(setEnabled(bool))); + m_configProject.kcfg_proxyminsize->setEnabled(KdenliveSettings::generateproxy()); + connect(m_configProject.kcfg_generateimageproxy, SIGNAL(toggled(bool)), m_configProject.kcfg_proxyimageminsize, SLOT(setEnabled(bool))); + m_configProject.kcfg_proxyimageminsize->setEnabled(KdenliveSettings::generateimageproxy()); QWidget *p3 = new QWidget; m_configTimeline.setupUi(p3); @@ -67,6 +83,7 @@ KdenliveSettingsDialog::KdenliveSettingsDialog(QWidget * parent) : m_configEnv.mltpathurl->setMode(KFile::Directory); m_configEnv.mltpathurl->lineEdit()->setObjectName("kcfg_mltpath"); m_configEnv.rendererpathurl->lineEdit()->setObjectName("kcfg_rendererpath"); + m_configEnv.kcfg_mltthreads->setMaximum( QThread::idealThreadCount() < 4 ? QThread::idealThreadCount() : 3 ); m_configEnv.tmppathurl->setMode(KFile::Directory); m_configEnv.tmppathurl->lineEdit()->setObjectName("kcfg_currenttmpfolder"); m_configEnv.projecturl->setMode(KFile::Directory); @@ -79,33 +96,88 @@ KdenliveSettingsDialog::KdenliveSettingsDialog(QWidget * parent) : QWidget *p4 = new QWidget; m_configCapture.setupUi(p4); + +#ifdef USE_V4L + + // Video 4 Linux device detection + 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()); + 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); + } + } + } + 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(); +#endif + m_page4 = addPage(p4, i18n("Capture"), "media-record"); m_configCapture.tabWidget->setCurrentIndex(KdenliveSettings::defaultcapture()); #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 OS X.")); + m_configCapture.label->setText(i18n("Capture is not yet available on Mac OS X.")); #endif QWidget *p5 = new QWidget; m_configShuttle.setupUi(p5); -#ifndef NO_JOGSHUTTLE +#ifdef USE_JOGSHUTTLE connect(m_configShuttle.kcfg_enableshuttle, SIGNAL(stateChanged(int)), this, SLOT(slotCheckShuttle(int))); connect(m_configShuttle.shuttledevicelist, SIGNAL(activated(int)), this, SLOT(slotUpdateShuttleDevice(int))); slotCheckShuttle(KdenliveSettings::enableshuttle()); m_configShuttle.shuttledisabled->hide(); -#else + + // Store the button pointers into an array for easier handling them in the other functions. + 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); + + // 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. + QList action_names = mappable_actions.keys(); + qSort(action_names); + + // Here we need to compute the action_id -> index-in-action_names. We iterate over the + // action_names, as the sorting may depend on the user-language. + QStringList actions_map = JogShuttleConfig::actionMap(KdenliveSettings::shuttlebuttons()); + QMap action_pos; + foreach (const QString& action_id, actions_map) { + // This loop find out at what index is the string that would map to the action_id. + for (int i = 0; i < action_names.size(); i++) { + if (mappable_actions[action_names[i]] == action_id) { + action_pos[action_id] = i; + break; + } + } + } + + int i = 0; + foreach (KComboBox* button, m_shuttle_buttons) { + button->addItems(action_names); + connect(button, SIGNAL(activated(int)), this, SLOT(slotShuttleModified())); + ++i; + if (i < actions_map.size()) + button->setCurrentIndex(action_pos[actions_map[i]]); + } +#else /* ! USE_JOGSHUTTLE */ m_configShuttle.kcfg_enableshuttle->hide(); m_configShuttle.kcfg_enableshuttle->setDisabled(true); -#endif /* NO_JOGSHUTTLE */ +#endif /* USE_JOGSHUTTLE */ m_page5 = addPage(p5, i18n("JogShuttle"), "input-mouse"); QWidget *p6 = new QWidget; m_configSdl.setupUi(p6); - // Disable drop B frames, see Kdenlive issue #1330 - m_configSdl.groupBox->setHidden(true); -#if not defined(Q_WS_MAC) && not defined(USE_OPEN_GL) +#ifndef USE_OPENGL m_configSdl.kcfg_openglmonitors->setHidden(true); #endif @@ -118,25 +190,6 @@ KdenliveSettingsDialog::KdenliveSettingsDialog(QWidget * parent) : connect(m_configTranscode.button_delete, SIGNAL(clicked()), this, SLOT(slotDeleteTranscode())); connect(m_configTranscode.profiles_list, SIGNAL(itemChanged(QTreeWidgetItem *, int)), this, SLOT(slotDialogModified())); - QStringList actions; - actions << i18n("Do nothing"); - actions << i18n("Play / Pause"); - actions << i18n("Cut"); - m_configShuttle.kcfg_shuttle1->addItems(actions); - m_configShuttle.kcfg_shuttle2->addItems(actions); - m_configShuttle.kcfg_shuttle3->addItems(actions); - m_configShuttle.kcfg_shuttle4->addItems(actions); - m_configShuttle.kcfg_shuttle5->addItems(actions); - - connect(m_configCapture.kcfg_video4vdevice, SIGNAL(editingFinished()), this, SLOT(rebuildVideo4Commands())); - connect(m_configCapture.kcfg_video4adevice, SIGNAL(editingFinished()), this, SLOT(rebuildVideo4Commands())); - connect(m_configCapture.kcfg_video4vcodec, SIGNAL(editingFinished()), this, SLOT(rebuildVideo4Commands())); - connect(m_configCapture.kcfg_video4acodec, SIGNAL(editingFinished()), this, SLOT(rebuildVideo4Commands())); - connect(m_configCapture.kcfg_video4vformat, SIGNAL(editingFinished()), this, SLOT(rebuildVideo4Commands())); - connect(m_configCapture.kcfg_video4aformat, SIGNAL(editingFinished()), this, SLOT(rebuildVideo4Commands())); - connect(m_configCapture.kcfg_video4size, SIGNAL(editingFinished()), this, SLOT(rebuildVideo4Commands())); - connect(m_configCapture.kcfg_video4rate, SIGNAL(editingFinished()), this, SLOT(rebuildVideo4Commands())); - connect(m_configCapture.kcfg_rmd_capture_audio, SIGNAL(clicked(bool)), m_configCapture.audio_group, SLOT(setVisible(bool))); m_configCapture.audio_group->setVisible(KdenliveSettings::rmd_capture_audio()); @@ -145,6 +198,7 @@ KdenliveSettingsDialog::KdenliveSettingsDialog(QWidget * parent) : connect(m_configEnv.kp_audio, SIGNAL(clicked()), this, SLOT(slotEditAudioApplication())); connect(m_configEnv.kp_player, SIGNAL(clicked()), this, SLOT(slotEditVideoApplication())); + loadEncodingProfiles(); checkProfile(); slotUpdateDisplay(); @@ -166,6 +220,51 @@ KdenliveSettingsDialog::KdenliveSettingsDialog(QWidget * parent) : KdenliveSettings::setDvgrab_path(dvgrabpath); } + // decklink profile + m_configCapture.decklink_showprofileinfo->setIcon(KIcon("help-about")); + m_configCapture.decklink_manageprofile->setIcon(KIcon("configure")); + m_configCapture.decklink_parameters->setVisible(false); + m_configCapture.decklink_parameters->setMaximumHeight(QFontMetrics(font()).lineSpacing() * 4); + m_configCapture.decklink_parameters->setPlainText(KdenliveSettings::decklink_parameters()); + connect(m_configCapture.decklink_manageprofile, SIGNAL(clicked(bool)), this, SLOT(slotManageEncodingProfile())); + connect(m_configCapture.kcfg_decklink_profile, SIGNAL(currentIndexChanged(int)), this, SLOT(slotUpdateDecklinkProfile())); + connect(m_configCapture.decklink_showprofileinfo, SIGNAL(clicked(bool)), m_configCapture.decklink_parameters, SLOT(setVisible(bool))); + + // v4l profile + m_configCapture.v4l_showprofileinfo->setIcon(KIcon("help-about")); + m_configCapture.v4l_manageprofile->setIcon(KIcon("configure")); + m_configCapture.v4l_parameters->setVisible(false); + m_configCapture.v4l_parameters->setMaximumHeight(QFontMetrics(font()).lineSpacing() * 4); + m_configCapture.v4l_parameters->setPlainText(KdenliveSettings::v4l_parameters()); + connect(m_configCapture.v4l_manageprofile, SIGNAL(clicked(bool)), this, SLOT(slotManageEncodingProfile())); + connect(m_configCapture.kcfg_v4l_profile, SIGNAL(currentIndexChanged(int)), this, SLOT(slotUpdateV4lProfile())); + connect(m_configCapture.v4l_showprofileinfo, SIGNAL(clicked(bool)), m_configCapture.v4l_parameters, SLOT(setVisible(bool))); + + // proxy profile stuff + m_configProject.proxy_showprofileinfo->setIcon(KIcon("help-about")); + m_configProject.proxy_manageprofile->setIcon(KIcon("configure")); + m_configProject.proxyparams->setVisible(false); + m_configProject.proxyparams->setMaximumHeight(QFontMetrics(font()).lineSpacing() * 4); + m_configProject.proxyparams->setPlainText(KdenliveSettings::proxyparams()); + connect(m_configProject.proxy_manageprofile, SIGNAL(clicked(bool)), this, SLOT(slotManageEncodingProfile())); + connect(m_configProject.proxy_showprofileinfo, SIGNAL(clicked(bool)), m_configProject.proxyparams, SLOT(setVisible(bool))); + connect(m_configProject.kcfg_proxy_profile, SIGNAL(currentIndexChanged(int)), this, SLOT(slotUpdateProxyProfile())); + + + slotUpdateProxyProfile(-1); + 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")); + } + 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()) { @@ -199,6 +298,12 @@ KdenliveSettingsDialog::KdenliveSettingsDialog(QWidget * parent) : 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); @@ -289,6 +394,7 @@ 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())); } } file.close(); @@ -300,12 +406,22 @@ void KdenliveSettingsDialog::initDevices() m_configSdl.kcfg_audio_device->setCurrentIndex(ix); KdenliveSettings::setAudio_device(ix); } + if (!KdenliveSettings::rmd_alsadevicename().isEmpty()) { // Select correct alsa device int ix = m_configCapture.kcfg_rmd_alsa_device->findData(KdenliveSettings::rmd_alsadevicename()); m_configCapture.kcfg_rmd_alsa_device->setCurrentIndex(ix); KdenliveSettings::setRmd_alsa_device(ix); } + + if (!KdenliveSettings::v4l_alsadevicename().isEmpty()) { + // Select correct alsa device + int ix = m_configCapture.kcfg_v4l_alsadevice->findData(KdenliveSettings::v4l_alsadevicename()); + m_configCapture.kcfg_v4l_alsadevice->setCurrentIndex(ix); + KdenliveSettings::setV4l_alsadevice(ix); + } + + loadCurrentV4lProfileInfo(); } @@ -316,12 +432,13 @@ void KdenliveSettingsDialog::slotReadAudioDevices() kDebug() << result; QStringList lines = result.split('\n'); foreach(const QString & data, lines) { - kDebug() << "// READING LINE: " << data; - if (data.simplified().startsWith("card")) { + //kDebug() << "// READING LINE: " << data; + 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); } } } @@ -389,7 +506,7 @@ void KdenliveSettingsDialog::slotEditImageApplication() m_configEnv.kcfg_defaultimageapp->setText(service->exec()); } -#ifndef NO_JOGSHUTTLE +#ifdef USE_JOGSHUTTLE void KdenliveSettingsDialog::slotCheckShuttle(int state) { m_configShuttle.config_group->setEnabled(state); @@ -418,28 +535,62 @@ void KdenliveSettingsDialog::slotUpdateShuttleDevice(int ix) //KdenliveSettings::setShuttledevice(device); m_configShuttle.kcfg_shuttledevice->setText(device); } -#endif /* NO_JOGSHUTTLE */ -void KdenliveSettingsDialog::rebuildVideo4Commands() +#endif /* USE_JOGSHUTTLE */ + +void KdenliveSettingsDialog::updateWidgets() { - QString captureCommand; - if (!m_configCapture.kcfg_video4adevice->text().isEmpty()) captureCommand = "-f " + m_configCapture.kcfg_video4aformat->text() + " -i " + m_configCapture.kcfg_video4adevice->text() + " -acodec " + m_configCapture.kcfg_video4acodec->text(); + // Revert widgets to last saved state (for example when user pressed "Cancel") + // kDebug() << "// // // KCONFIG Revert called"; +#ifdef USE_JOGSHUTTLE + // revert jog shuttle device + if (m_configShuttle.shuttledevicelist->count() > 0) { + for (int i = 0; i < m_configShuttle.shuttledevicelist->count(); i++) { + if (m_configShuttle.shuttledevicelist->itemData(i) == KdenliveSettings::shuttledevice()) { + m_configShuttle.shuttledevicelist->setCurrentIndex(i); + break; + } + } + } - captureCommand += " -f " + m_configCapture.kcfg_video4vformat->text() + " -s " + m_configCapture.kcfg_video4size->text() + " -r " + QString::number(m_configCapture.kcfg_video4rate->value()) + " -i " + m_configCapture.kcfg_video4vdevice->text() + " -vcodec " + m_configCapture.kcfg_video4vcodec->text(); - m_configCapture.kcfg_video4capture->setText(captureCommand); + // Revert jog shuttle buttons + QList action_names = m_mappable_actions.keys(); + qSort(action_names); + QStringList actions_map = JogShuttleConfig::actionMap(KdenliveSettings::shuttlebuttons()); + QMap action_pos; + foreach (const QString& action_id, actions_map) { + // This loop find out at what index is the string that would map to the action_id. + for (int i = 0; i < action_names.size(); i++) { + if (m_mappable_actions[action_names[i]] == action_id) { + action_pos[action_id] = i; + break; + } + } + } + int i = 0; + foreach (KComboBox* button, m_shuttle_buttons) { + ++i; + if (i < actions_map.size()) + button->setCurrentIndex(action_pos[actions_map[i]]); + } +#endif /* USE_JOGSHUTTLE */ } - void KdenliveSettingsDialog::updateSettings() { - //kDebug() << "// // // KCONFIG UPDATE called"; - + // Save changes to settings (for example when user pressed "Apply" or "Ok") + // kDebug() << "// // // KCONFIG UPDATE called"; m_defaultProfile = m_configProject.kcfg_profiles_list->currentText(); KdenliveSettings::setDefault_profile(m_defaultPath); bool resetProfile = false; bool updateCapturePath = false; + /*if (m_configShuttle.shuttledevicelist->count() > 0) { + QString device = m_configShuttle.shuttledevicelist->itemData(m_configShuttle.shuttledevicelist->currentIndex()).toString(); + if (device != KdenliveSettings::shuttledevice()) KdenliveSettings::setShuttledevice(device); + }*/ + if (m_configEnv.kcfg_capturetoprojectfolder->isChecked() != KdenliveSettings::capturetoprojectfolder()) { KdenliveSettings::setCapturetoprojectfolder(m_configEnv.kcfg_capturetoprojectfolder->isChecked()); updateCapturePath = true; @@ -460,6 +611,29 @@ void KdenliveSettingsDialog::updateSettings() updateCapturePath = true; } + if ((uint) m_configCapture.kcfg_v4l_format->currentIndex() != KdenliveSettings::v4l_format()) { + saveCurrentV4lProfile(); + KdenliveSettings::setV4l_format(0); + } + + // 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)); + } + 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)); + } + 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 (updateCapturePath) emit updateCaptureFolder(); QString value = m_configCapture.kcfg_rmd_alsa_device->itemData(m_configCapture.kcfg_rmd_alsa_device->currentIndex()).toString(); @@ -467,6 +641,11 @@ void KdenliveSettingsDialog::updateSettings() KdenliveSettings::setRmd_alsadevicename(value); } + value = m_configCapture.kcfg_v4l_alsadevice->itemData(m_configCapture.kcfg_v4l_alsadevice->currentIndex()).toString(); + if (value != KdenliveSettings::v4l_alsadevicename()) { + KdenliveSettings::setV4l_alsadevicename(value); + } + value = m_configCapture.kcfg_rmd_audio_freq->itemText(m_configCapture.kcfg_rmd_audio_freq->currentIndex()); kDebug() << "// AUDIO FREQ VALUE: " << value << ", CURRENT: " << KdenliveSettings::rmd_freq() << ", IX: " << m_configCapture.kcfg_rmd_audio_freq->currentIndex(); if (value != KdenliveSettings::rmd_freq()) { @@ -474,6 +653,11 @@ void KdenliveSettingsDialog::updateSettings() KdenliveSettings::setRmd_freq(value); } + if (m_configSdl.kcfg_external_display->isChecked() != KdenliveSettings::external_display()) { + KdenliveSettings::setExternal_display(m_configSdl.kcfg_external_display->isChecked()); + resetProfile = true; + } + value = m_configSdl.kcfg_audio_driver->itemData(m_configSdl.kcfg_audio_driver->currentIndex()).toString(); if (value != KdenliveSettings::audiodrivername()) { KdenliveSettings::setAudiodrivername(value); @@ -508,25 +692,29 @@ void KdenliveSettingsDialog::updateSettings() resetProfile = true; } - bool updatePreview = false; - if (m_configSdl.kcfg_dropbframes->isChecked() != KdenliveSettings::dropbframes()) { - KdenliveSettings::setDropbframes(m_configSdl.kcfg_dropbframes->isChecked()); - updatePreview = true; - } - if (m_modified) { // The transcoding profiles were modified, save. m_modified = false; saveTranscodeProfiles(); } -#if KDE_IS_VERSION(4,3,0) - KConfigDialog::settingsChangedSlot(); +#ifdef USE_JOGSHUTTLE + m_shuttleModified = false; + + QStringList actions; + actions << "monitor_pause"; // the Job rest position action. + foreach (KComboBox* button, m_shuttle_buttons) { + actions << m_mappable_actions[button->currentText()]; + } + QString maps = JogShuttleConfig::actionMap(actions); + //fprintf(stderr, "Shuttle config: %s\n", JogShuttleConfig::actionMap(actions).toAscii().constData()); + if (KdenliveSettings::shuttlebuttons() != maps) + KdenliveSettings::setShuttlebuttons(maps); #endif + KConfigDialog::settingsChangedSlot(); //KConfigDialog::updateSettings(); if (resetProfile) emit doResetProfile(); - if (updatePreview) emit updatePreviewSettings(); } void KdenliveSettingsDialog::slotUpdateDisplay() @@ -599,22 +787,233 @@ void KdenliveSettingsDialog::slotDeleteTranscode() slotDialogModified(); } +void KdenliveSettingsDialog::slotShuttleModified() +{ +#ifdef USE_JOGSHUTTLE + QStringList actions; + actions << "monitor_pause"; // the Job rest position action. + foreach (KComboBox* button, m_shuttle_buttons) { + actions << m_mappable_actions[button->currentText()]; + } + QString maps = JogShuttleConfig::actionMap(actions); + m_shuttleModified = KdenliveSettings::shuttlebuttons() != maps; +#endif + KConfigDialog::updateButtons(); +} + void KdenliveSettingsDialog::slotDialogModified() { m_modified = true; -#if KDE_IS_VERSION(4,3,0) KConfigDialog::updateButtons(); -#endif } //virtual bool KdenliveSettingsDialog::hasChanged() { - if (m_modified) return true; + if (m_modified || m_shuttleModified) return true; return KConfigDialog::hasChanged(); } +void KdenliveSettingsDialog::slotUpdatev4lDevice() +{ + QString device = m_configCapture.kcfg_detectedv4ldevices->itemData(m_configCapture.kcfg_detectedv4ldevices->currentIndex()).toString(); + if (!device.isEmpty()) m_configCapture.kcfg_video4vdevice->setText(device); + QString info = m_configCapture.kcfg_detectedv4ldevices->itemData(m_configCapture.kcfg_detectedv4ldevices->currentIndex(), Qt::UserRole + 1).toString(); + + m_configCapture.kcfg_v4l_format->blockSignals(true); + m_configCapture.kcfg_v4l_format->clear(); + QString vl4ProfilePath = KStandardDirs::locateLocal("appdata", "profiles/video4linux"); + if (QFile::exists(vl4ProfilePath)) { + m_configCapture.kcfg_v4l_format->addItem(i18n("Current settings")); + } + + 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); + 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); + 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->blockSignals(false); + slotUpdatev4lCaptureProfile(); +} + +void KdenliveSettingsDialog::slotUpdatev4lCaptureProfile() +{ + QStringList info = m_configCapture.kcfg_v4l_format->itemData(m_configCapture.kcfg_v4l_format->currentIndex(), Qt::UserRole).toStringList(); + if (info.isEmpty()) { + // No auto info, display the current ones + loadCurrentV4lProfileInfo(); + return; + } + m_configCapture.p_size->setText(info.at(1) + 'x' + info.at(2)); + m_configCapture.p_fps->setText(info.at(3) + '/' + info.at(4)); + m_configCapture.p_aspect->setText("1/1"); + m_configCapture.p_display->setText(info.at(1) + '/' + info.at(2)); + m_configCapture.p_colorspace->setText(ProfilesDialog::getColorspaceDescription(601)); + m_configCapture.p_progressive->setText(i18n("Progressive")); + + QString vl4ProfilePath = KStandardDirs::locateLocal("appdata", "profiles/video4linux"); + if (!QFile::exists(vl4ProfilePath)) saveCurrentV4lProfile(); +} + +void KdenliveSettingsDialog::loadCurrentV4lProfileInfo() +{ + QString vl4ProfilePath = KStandardDirs::locateLocal("appdata", "profiles/video4linux"); + MltVideoProfile prof; + if (!QFile::exists(vl4ProfilePath)) { + // No default formats found, build one + prof.width = 320; + prof.height = 200; + prof.frame_rate_num = 15; + prof.frame_rate_den = 1; + prof.display_aspect_num = 4; + prof.display_aspect_den = 3; + prof.sample_aspect_num = 1; + prof.sample_aspect_den = 1; + prof.progressive = 1; + prof.colorspace = 601; + ProfilesDialog::saveProfile(prof, vl4ProfilePath); + } + else prof = ProfilesDialog::getVideoProfile(vl4ProfilePath); + m_configCapture.p_size->setText(QString::number(prof.width) + 'x' + QString::number(prof.height)); + m_configCapture.p_fps->setText(QString::number(prof.frame_rate_num) + '/' + QString::number(prof.frame_rate_den)); + m_configCapture.p_aspect->setText(QString::number(prof.sample_aspect_num) + '/' + QString::number(prof.sample_aspect_den)); + m_configCapture.p_display->setText(QString::number(prof.display_aspect_num) + '/' + QString::number(prof.display_aspect_den)); + m_configCapture.p_colorspace->setText(ProfilesDialog::getColorspaceDescription(prof.colorspace)); + if (prof.progressive) m_configCapture.p_progressive->setText(i18n("Progressive")); +} + +void KdenliveSettingsDialog::saveCurrentV4lProfile() +{ + MltVideoProfile profile; + profile.description = "Video4Linux capture"; + profile.colorspace = ProfilesDialog::getColorspaceFromDescription(m_configCapture.p_colorspace->text()); + profile.width = m_configCapture.p_size->text().section('x', 0, 0).toInt(); + profile.height = m_configCapture.p_size->text().section('x', 1, 1).toInt(); + profile.sample_aspect_num = m_configCapture.p_aspect->text().section('/', 0, 0).toInt(); + profile.sample_aspect_den = m_configCapture.p_aspect->text().section('/', 1, 1).toInt(); + profile.display_aspect_num = m_configCapture.p_display->text().section('/', 0, 0).toInt(); + profile.display_aspect_den = m_configCapture.p_display->text().section('/', 1, 1).toInt(); + profile.frame_rate_num = m_configCapture.p_fps->text().section('/', 0, 0).toInt(); + profile.frame_rate_den = m_configCapture.p_fps->text().section('/', 1, 1).toInt(); + profile.progressive = m_configCapture.p_progressive->text() == i18n("Progressive"); + QString vl4ProfilePath = KStandardDirs::locateLocal("appdata", "profiles/video4linux"); + ProfilesDialog::saveProfile(profile, vl4ProfilePath); +} + +void KdenliveSettingsDialog::slotManageEncodingProfile() +{ + int type = 0; + if (currentPage() == m_page4) { + if (m_configCapture.tabWidget->currentIndex() == 1) type = 1; + else if (m_configCapture.tabWidget->currentIndex() == 3) type = 2; + } + EncodingProfilesDialog *d = new EncodingProfilesDialog(type); + d->exec(); + delete d; + loadEncodingProfiles(); +} + +void KdenliveSettingsDialog::loadEncodingProfiles() +{ + KConfig conf("encodingprofiles.rc", KConfig::FullConfig, "appdata"); + + // Load v4l profiles + m_configCapture.kcfg_v4l_profile->blockSignals(true); + QString currentItem = m_configCapture.kcfg_v4l_profile->currentText(); + m_configCapture.kcfg_v4l_profile->clear(); + KConfigGroup group(&conf, "video4linux"); + QMap< QString, QString > values = group.entryMap(); + QMapIterator i(values); + while (i.hasNext()) { + i.next(); + if (!i.key().isEmpty()) m_configCapture.kcfg_v4l_profile->addItem(i.key(), i.value()); + } + m_configCapture.kcfg_v4l_profile->blockSignals(false); + if (!currentItem.isEmpty()) m_configCapture.kcfg_v4l_profile->setCurrentIndex(m_configCapture.kcfg_v4l_profile->findText(currentItem)); + + // Load Decklink profiles + m_configCapture.kcfg_decklink_profile->blockSignals(true); + currentItem = m_configCapture.kcfg_decklink_profile->currentText(); + m_configCapture.kcfg_decklink_profile->clear(); + KConfigGroup group2(&conf, "decklink"); + values = group2.entryMap(); + QMapIterator j(values); + while (j.hasNext()) { + j.next(); + if (!j.key().isEmpty()) m_configCapture.kcfg_decklink_profile->addItem(j.key(), j.value()); + } + m_configCapture.kcfg_decklink_profile->blockSignals(false); + if (!currentItem.isEmpty()) m_configCapture.kcfg_decklink_profile->setCurrentIndex(m_configCapture.kcfg_decklink_profile->findText(currentItem)); + + // Load Proxy profiles + m_configProject.kcfg_proxy_profile->blockSignals(true); + currentItem = m_configProject.kcfg_proxy_profile->currentText(); + m_configProject.kcfg_proxy_profile->clear(); + KConfigGroup group3(&conf, "proxy"); + values = group3.entryMap(); + QMapIterator k(values); + while (k.hasNext()) { + k.next(); + if (!k.key().isEmpty()) m_configProject.kcfg_proxy_profile->addItem(k.key(), k.value()); + } + if (!currentItem.isEmpty()) m_configProject.kcfg_proxy_profile->setCurrentIndex(m_configProject.kcfg_proxy_profile->findText(currentItem)); + m_configProject.kcfg_proxy_profile->blockSignals(false); + slotUpdateProxyProfile(); + +} + +void KdenliveSettingsDialog::slotUpdateDecklinkProfile(int ix) +{ + if (ix == -1) ix = KdenliveSettings::decklink_profile(); + 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)); + // +} + +void KdenliveSettingsDialog::slotUpdateV4lProfile(int ix) +{ + if (ix == -1) ix = KdenliveSettings::v4l_profile(); + 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)); + // +} + +void KdenliveSettingsDialog::slotUpdateProxyProfile(int ix) +{ + if (ix == -1) ix = KdenliveSettings::v4l_profile(); + 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)); + // +} + +void KdenliveSettingsDialog::slotEditVideo4LinuxProfile() +{ + QString vl4ProfilePath = KStandardDirs::locateLocal("appdata", "profiles/video4linux"); + ProfilesDialog *w = new ProfilesDialog(vl4ProfilePath); + if (w->exec() == QDialog::Accepted) { + // save and update profile + loadCurrentV4lProfileInfo(); + } + delete w; +} #include "kdenlivesettingsdialog.moc"