X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fkdenlivesettingsdialog.cpp;h=d2ba47fad5ffa08453891c2f14c92be4fee7f1b1;hb=e38a9c69552502be9d432d4e0699bff9a1557c68;hp=630b788cfdf3bdc2b9ae7c57b0c1407a873534a1;hpb=9b7dff09fb1926c736a4f33107245d05a056cc4a;p=kdenlive diff --git a/src/kdenlivesettingsdialog.cpp b/src/kdenlivesettingsdialog.cpp index 630b788c..d2ba47fa 100644 --- a/src/kdenlivesettingsdialog.cpp +++ b/src/kdenlivesettingsdialog.cpp @@ -19,6 +19,8 @@ #include "kdenlivesettingsdialog.h" #include "profilesdialog.h" +#include "v4l/v4lcapture.h" +#include "blackmagic/devices.h" #include "kdenlivesettings.h" #include @@ -27,31 +29,44 @@ #include #include #include +#include #include #include +#include #include #include #include #include #ifndef NO_JOGSHUTTLE +#include "jogaction.h" +#include "jogshuttleconfig.h" #include #endif /* NO_JOGSHUTTLE */ -KdenliveSettingsDialog::KdenliveSettingsDialog(QWidget * parent): KConfigDialog(parent, "settings", KdenliveSettings::self()) { +KdenliveSettingsDialog::KdenliveSettingsDialog(const QMap& mappable_actions, QWidget * parent) : + KConfigDialog(parent, "settings", KdenliveSettings::self()), + m_modified(false), + m_shuttleModified(false), + m_mappable_actions(mappable_actions) +{ QWidget *p1 = new QWidget; m_configMisc.setupUi(p1); - page1 = addPage(p1, i18n("Misc"), "configure"); + m_page1 = addPage(p1, i18n("Misc"), "configure"); // Hide multi tab option until Kdenlive really supports it m_configMisc.kcfg_activatetabs->setVisible(false); + QWidget *p8 = new QWidget; + m_configProject.setupUi(p8); + m_page8 = addPage(p8, i18n("Project Defaults"), "document-new"); + QWidget *p3 = new QWidget; - m_configDisplay.setupUi(p3); - page3 = addPage(p3, i18n("Display"), "display"); + m_configTimeline.setupUi(p3); + m_page3 = addPage(p3, i18n("Timeline"), "video-display"); QWidget *p2 = new QWidget; m_configEnv.setupUi(p2); @@ -64,43 +79,105 @@ KdenliveSettingsDialog::KdenliveSettingsDialog(QWidget * parent): KConfigDialog( m_configEnv.projecturl->lineEdit()->setObjectName("kcfg_defaultprojectfolder"); m_configEnv.capturefolderurl->setMode(KFile::Directory); m_configEnv.capturefolderurl->lineEdit()->setObjectName("kcfg_capturefolder"); - page2 = addPage(p2, i18n("Environment"), "terminal"); + m_configEnv.capturefolderurl->setEnabled(!KdenliveSettings::capturetoprojectfolder()); + connect(m_configEnv.kcfg_capturetoprojectfolder, SIGNAL(clicked()), this, SLOT(slotEnableCaptureFolder())); + m_page2 = addPage(p2, i18n("Environment"), "application-x-executable-script"); - m_captureFolder = KdenliveSettings::capturefolder(); QWidget *p4 = new QWidget; m_configCapture.setupUi(p4); - page4 = addPage(p4, i18n("Capture"), "audio-card"); + +#if !defined(Q_WS_MAC) && !defined(Q_OS_FREEBSD) + V4lCaptureHandler v4l(NULL); + // 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 = v4l.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); + } + } + } + connect(m_configCapture.kcfg_detectedv4ldevices, SIGNAL(currentIndexChanged(int)), this, SLOT(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.")); +#endif QWidget *p5 = new QWidget; m_configShuttle.setupUi(p5); -#ifndef NO_JOGSHUTTLE +#ifdef NO_JOGSHUTTLE + m_configShuttle.kcfg_enableshuttle->hide(); + m_configShuttle.kcfg_enableshuttle->setDisabled(true); +#else 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 - m_configShuttle.kcfg_enableshuttle->hide(); - m_configShuttle.kcfg_enableshuttle->setDisabled(true); + + // 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]]); + } #endif /* NO_JOGSHUTTLE */ - page5 = addPage(p5, i18n("JogShuttle"), "input-mouse"); + m_page5 = addPage(p5, i18n("JogShuttle"), "input-mouse"); QWidget *p6 = new QWidget; m_configSdl.setupUi(p6); - page6 = addPage(p6, i18n("Playback"), "audio-card"); - 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); +#if not defined(Q_WS_MAC) && not defined(USE_OPEN_GL) + m_configSdl.kcfg_openglmonitors->setHidden(true); +#endif + + m_page6 = addPage(p6, i18n("Playback"), "media-playback-start"); + QWidget *p7 = new QWidget; + m_configTranscode.setupUi(p7); + 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_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())); @@ -118,11 +195,13 @@ KdenliveSettingsDialog::KdenliveSettingsDialog(QWidget * parent): KConfigDialog( slotUpdateDisplay(); + connect(m_configSdl.kcfg_audio_driver, SIGNAL(currentIndexChanged(int)), this, SLOT(slotCheckAlsaDriver())); initDevices(); - connect(m_configMisc.kcfg_profiles_list, SIGNAL(currentIndexChanged(int)), this, SLOT(slotUpdateDisplay())); + connect(m_configProject.kcfg_profiles_list, SIGNAL(currentIndexChanged(int)), this, SLOT(slotUpdateDisplay())); connect(m_configCapture.kcfg_rmd_capture_type, SIGNAL(currentIndexChanged(int)), this, SLOT(slotUpdateRmdRegionStatus())); slotUpdateRmdRegionStatus(); + loadTranscodeProfiles(); //HACK: check dvgrab version, because only dvgrab >= 3.3 supports @@ -134,6 +213,13 @@ KdenliveSettingsDialog::KdenliveSettingsDialog(QWidget * parent): KConfigDialog( } + BMInterface::getBlackMagicDeviceList(m_configCapture.kcfg_hdmi_capturedevice, m_configCapture.kcfg_hdmi_capturemode); + connect(m_configCapture.kcfg_hdmi_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()) { QProcess *versionCheck = new QProcess; @@ -146,7 +232,7 @@ KdenliveSettingsDialog::KdenliveSettingsDialog(QWidget * parent): KConfigDialog( kDebug() << "// FOUND DVGRAB VERSION: " << dvgrabVersion; } - if (versionCheck) delete versionCheck; + delete versionCheck; if (dvgrabVersion < 3.3) { KdenliveSettings::setFirewiretimestamp(false); m_configCapture.kcfg_firewiretimestamp->setEnabled(false); @@ -158,29 +244,45 @@ KdenliveSettingsDialog::KdenliveSettingsDialog(QWidget * parent): KConfigDialog( QString rmdpath = KStandardDirs::findExe("recordmydesktop"); KdenliveSettings::setRmd_path(rmdpath); } - if (KdenliveSettings::rmd_path().isEmpty()) m_configCapture.rmd_info->setText(i18n("Recordmydesktop utility not found, please install it for screen grabs")); - else m_configCapture.rmd_info->setText(i18n("Recordmydesktop found at: %1", KdenliveSettings::rmd_path())); + if (KdenliveSettings::rmd_path().isEmpty()) + m_configCapture.rmd_info->setText(i18n("Recordmydesktop utility not found, please install it for screen grabs")); + else + m_configCapture.rmd_info->setText(i18n("Recordmydesktop found at: %1", KdenliveSettings::rmd_path())); } KdenliveSettingsDialog::~KdenliveSettingsDialog() {} -void KdenliveSettingsDialog::slotUpdateRmdRegionStatus() { +void KdenliveSettingsDialog::slotUpdateHDMIModes() +{ + QStringList modes = m_configCapture.kcfg_hdmi_capturedevice->itemData(m_configCapture.kcfg_hdmi_capturedevice->currentIndex()).toStringList(); + m_configCapture.kcfg_hdmi_capturemode->clear(); + m_configCapture.kcfg_hdmi_capturemode->insertItems(0, modes); +} + +void KdenliveSettingsDialog::slotUpdateRmdRegionStatus() +{ m_configCapture.region_group->setHidden(m_configCapture.kcfg_rmd_capture_type->currentIndex() != 1); } -void KdenliveSettingsDialog::checkProfile() { - m_configMisc.kcfg_profiles_list->clear(); +void KdenliveSettingsDialog::slotEnableCaptureFolder() +{ + m_configEnv.capturefolderurl->setEnabled(!m_configEnv.kcfg_capturetoprojectfolder->isChecked()); +} + +void KdenliveSettingsDialog::checkProfile() +{ + m_configProject.kcfg_profiles_list->clear(); QMap profilesInfo = ProfilesDialog::getProfilesInfo(); QMapIterator i(profilesInfo); while (i.hasNext()) { i.next(); - m_configMisc.kcfg_profiles_list->addItem(i.key(), i.value()); + m_configProject.kcfg_profiles_list->addItem(i.key(), i.value()); } if (!KdenliveSettings::default_profile().isEmpty()) { - for (int i = 0; i < m_configMisc.kcfg_profiles_list->count(); i++) { - if (m_configMisc.kcfg_profiles_list->itemData(i).toString() == KdenliveSettings::default_profile()) { - m_configMisc.kcfg_profiles_list->setCurrentIndex(i); + for (int i = 0; i < m_configProject.kcfg_profiles_list->count(); i++) { + if (m_configProject.kcfg_profiles_list->itemData(i).toString() == KdenliveSettings::default_profile()) { + m_configProject.kcfg_profiles_list->setCurrentIndex(i); KdenliveSettings::setProfiles_list(i); break; } @@ -188,18 +290,21 @@ void KdenliveSettingsDialog::checkProfile() { } } -void KdenliveSettingsDialog::initDevices() { +void KdenliveSettingsDialog::initDevices() +{ // Fill audio drivers m_configSdl.kcfg_audio_driver->addItem(i18n("Automatic"), QString()); +#ifndef Q_WS_MAC m_configSdl.kcfg_audio_driver->addItem(i18n("OSS"), "dsp"); m_configSdl.kcfg_audio_driver->addItem(i18n("ALSA"), "alsa"); m_configSdl.kcfg_audio_driver->addItem(i18n("PulseAudio"), "pulse"); m_configSdl.kcfg_audio_driver->addItem(i18n("OSS with DMA access"), "dma"); m_configSdl.kcfg_audio_driver->addItem(i18n("Esound daemon"), "esd"); m_configSdl.kcfg_audio_driver->addItem(i18n("ARTS daemon"), "artsc"); +#endif if (!KdenliveSettings::audiodrivername().isEmpty()) - for (int i = 1;i < m_configSdl.kcfg_audio_driver->count(); i++) { + for (int i = 1; i < m_configSdl.kcfg_audio_driver->count(); i++) { if (m_configSdl.kcfg_audio_driver->itemData(i).toString() == KdenliveSettings::audiodrivername()) { m_configSdl.kcfg_audio_driver->setCurrentIndex(i); KdenliveSettings::setAudio_driver((uint) i); @@ -208,6 +313,7 @@ void KdenliveSettingsDialog::initDevices() { // Fill video drivers m_configSdl.kcfg_video_driver->addItem(i18n("Automatic"), QString()); +#ifndef Q_WS_MAC m_configSdl.kcfg_video_driver->addItem(i18n("XVideo"), "x11"); m_configSdl.kcfg_video_driver->addItem(i18n("X11"), "x11_noaccel"); m_configSdl.kcfg_video_driver->addItem(i18n("XFree86 DGA 2.0"), "dga"); @@ -217,6 +323,7 @@ void KdenliveSettingsDialog::initDevices() { m_configSdl.kcfg_video_driver->addItem(i18n("SVGAlib"), "svgalib"); m_configSdl.kcfg_video_driver->addItem(i18n("General graphics interface"), "ggi"); m_configSdl.kcfg_video_driver->addItem(i18n("Ascii art library"), "aalib"); +#endif // Fill the list of audio playback devices m_configSdl.kcfg_audio_device->addItem(i18n("Default"), QString()); @@ -262,12 +369,13 @@ void KdenliveSettingsDialog::initDevices() { } -void KdenliveSettingsDialog::slotReadAudioDevices() { +void KdenliveSettingsDialog::slotReadAudioDevices() +{ QString result = QString(m_readProcess.readAllStandardOutput()); kDebug() << "// / / / / / READING APLAY: "; kDebug() << result; QStringList lines = result.split('\n'); - foreach(const QString &data, lines) { + foreach(const QString & data, lines) { kDebug() << "// READING LINE: " << data; if (data.simplified().startsWith("card")) { QString card = data.section(':', 0, 0).section(' ', -1); @@ -278,29 +386,38 @@ void KdenliveSettingsDialog::slotReadAudioDevices() { } } -void KdenliveSettingsDialog::showPage(int page, int option) { +void KdenliveSettingsDialog::showPage(int page, int option) +{ switch (page) { case 1: - setCurrentPage(page1); + setCurrentPage(m_page1); break; case 2: - setCurrentPage(page2); + setCurrentPage(m_page2); break; case 3: - setCurrentPage(page3); + setCurrentPage(m_page3); break; case 4: - setCurrentPage(page4); + setCurrentPage(m_page4); m_configCapture.tabWidget->setCurrentIndex(option); break; case 5: - setCurrentPage(page5); + setCurrentPage(m_page5); break; - + case 6: + setCurrentPage(m_page6); + break; + case 7: + setCurrentPage(m_page7); + break; + default: + setCurrentPage(m_page1); } } -void KdenliveSettingsDialog::slotEditVideoApplication() { +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) @@ -310,7 +427,8 @@ void KdenliveSettingsDialog::slotEditVideoApplication() { m_configEnv.kcfg_defaultplayerapp->setText(service->exec()); } -void KdenliveSettingsDialog::slotEditAudioApplication() { +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) @@ -320,7 +438,8 @@ void KdenliveSettingsDialog::slotEditAudioApplication() { m_configEnv.kcfg_defaultaudioapp->setText(service->exec()); } -void KdenliveSettingsDialog::slotEditImageApplication() { +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) @@ -331,7 +450,8 @@ void KdenliveSettingsDialog::slotEditImageApplication() { } #ifndef NO_JOGSHUTTLE -void KdenliveSettingsDialog::slotCheckShuttle(int state) { +void KdenliveSettingsDialog::slotCheckShuttle(int state) +{ m_configShuttle.config_group->setEnabled(state); if (m_configShuttle.shuttledevicelist->count() == 0) { // parse devices @@ -352,41 +472,99 @@ void KdenliveSettingsDialog::slotCheckShuttle(int state) { } } -void KdenliveSettingsDialog::slotUpdateShuttleDevice(int ix) { +void KdenliveSettingsDialog::slotUpdateShuttleDevice(int ix) +{ QString device = m_configShuttle.shuttledevicelist->itemData(ix).toString(); //KdenliveSettings::setShuttledevice(device); m_configShuttle.kcfg_shuttledevice->setText(device); } + #endif /* NO_JOGSHUTTLE */ -void KdenliveSettingsDialog::rebuildVideo4Commands() { +void KdenliveSettingsDialog::rebuildVideo4Commands() +{ QString captureCommand; - if (!m_configCapture.kcfg_video4adevice->text().isEmpty()) captureCommand = "-f " + m_configCapture.kcfg_video4aformat->text() + " -i " + m_configCapture.kcfg_video4adevice->text(); + 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(); - 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(); + 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); } +void KdenliveSettingsDialog::updateWidgets() +{ + // Revert widgets to last saved state (for example when user pressed "Cancel") + // kDebug() << "// // // KCONFIG Revert called"; +#ifndef NO_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; + } + } + } + // 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 +} -void KdenliveSettingsDialog::updateSettings() { - kDebug() << "// // // KCONFIG UPDATE called"; - m_defaultProfile = m_configMisc.kcfg_profiles_list->currentText(); +void KdenliveSettingsDialog::updateSettings() +{ + // 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; - QString value = m_configSdl.kcfg_audio_device->itemData(m_configSdl.kcfg_audio_device->currentIndex()).toString(); - if (value != KdenliveSettings::audiodevicename()) { - KdenliveSettings::setAudiodevicename(value); - resetProfile = true; + 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; + } + + if (m_configEnv.capturefolderurl->url().path() != KdenliveSettings::capturefolder()) { + KdenliveSettings::setCapturefolder(m_configEnv.capturefolderurl->url().path()); + updateCapturePath = true; } - if (m_configEnv.capturefolderurl->text() != KdenliveSettings::capturefolder()) { - kDebug() << "/// CAPT FOLDER UPDATED"; - KdenliveSettings::setCapturefolder(m_configEnv.capturefolderurl->text()); - emit updateCaptureFolder(); + if (m_configCapture.kcfg_dvgrabfilename->text() != KdenliveSettings::dvgrabfilename()) { + KdenliveSettings::setDvgrabfilename(m_configCapture.kcfg_dvgrabfilename->text()); + updateCapturePath = true; } - value = m_configCapture.kcfg_rmd_alsa_device->itemData(m_configCapture.kcfg_rmd_alsa_device->currentIndex()).toString(); + if ((uint) m_configCapture.kcfg_firewireformat->currentIndex() != KdenliveSettings::firewireformat()) { + KdenliveSettings::setFirewireformat(m_configCapture.kcfg_firewireformat->currentIndex()); + updateCapturePath = true; + } + + if (updateCapturePath) emit updateCaptureFolder(); + + QString value = m_configCapture.kcfg_rmd_alsa_device->itemData(m_configCapture.kcfg_rmd_alsa_device->currentIndex()).toString(); if (value != KdenliveSettings::rmd_alsadevicename()) { KdenliveSettings::setRmd_alsadevicename(value); } @@ -398,42 +576,182 @@ 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); resetProfile = true; } + if (value == "alsa") { + // Audio device setting is only valid for alsa driver + value = m_configSdl.kcfg_audio_device->itemData(m_configSdl.kcfg_audio_device->currentIndex()).toString(); + if (value != KdenliveSettings::audiodevicename()) { + KdenliveSettings::setAudiodevicename(value); + resetProfile = true; + } + } else if (KdenliveSettings::audiodevicename().isEmpty() == false) { + KdenliveSettings::setAudiodevicename(QString::null); + resetProfile = true; + } + value = m_configSdl.kcfg_video_driver->itemData(m_configSdl.kcfg_video_driver->currentIndex()).toString(); if (value != KdenliveSettings::videodrivername()) { KdenliveSettings::setVideodrivername(value); resetProfile = true; } - bool updatePreview = false; - if (m_configSdl.kcfg_dropbframes->isChecked() != KdenliveSettings::dropbframes()) { - KdenliveSettings::setDropbframes(m_configSdl.kcfg_dropbframes->isChecked()); - updatePreview = true; + if (m_configSdl.kcfg_window_background->color() != KdenliveSettings::window_background()) { + KdenliveSettings::setWindow_background(m_configSdl.kcfg_window_background->color()); + resetProfile = true; + } + + if (m_configSdl.kcfg_volume->value() != KdenliveSettings::volume()) { + KdenliveSettings::setVolume(m_configSdl.kcfg_volume->value()); + resetProfile = true; + } + + if (m_modified) { + // The transcoding profiles were modified, save. + m_modified = false; + saveTranscodeProfiles(); } - KConfigDialog::updateSettings(); +#ifndef NO_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 + +#if KDE_IS_VERSION(4,3,0) + KConfigDialog::settingsChangedSlot(); +#endif + + //KConfigDialog::updateSettings(); if (resetProfile) emit doResetProfile(); - if (updatePreview) emit updatePreviewSettings(); } -void KdenliveSettingsDialog::slotUpdateDisplay() { - QString currentProfile = m_configMisc.kcfg_profiles_list->itemData(m_configMisc.kcfg_profiles_list->currentIndex()).toString(); +void KdenliveSettingsDialog::slotUpdateDisplay() +{ + QString currentProfile = m_configProject.kcfg_profiles_list->itemData(m_configProject.kcfg_profiles_list->currentIndex()).toString(); QMap< QString, QString > values = ProfilesDialog::getSettingsFromFile(currentProfile); - m_configMisc.p_size->setText(values.value("width") + 'x' + values.value("height")); - m_configMisc.p_fps->setText(values.value("frame_rate_num") + '/' + values.value("frame_rate_den")); - m_configMisc.p_aspect->setText(values.value("sample_aspect_num") + '/' + values.value("sample_aspect_den")); - m_configMisc.p_display->setText(values.value("display_aspect_num") + '/' + values.value("display_aspect_den")); - if (values.value("progressive").toInt() == 0) m_configMisc.p_progressive->setText(i18n("Interlaced")); - else m_configMisc.p_progressive->setText(i18n("Progressive")); - m_defaultProfile = m_configMisc.kcfg_profiles_list->itemText(m_configMisc.kcfg_profiles_list->currentIndex()); + m_configProject.p_size->setText(values.value("width") + 'x' + values.value("height")); + m_configProject.p_fps->setText(values.value("frame_rate_num") + '/' + values.value("frame_rate_den")); + m_configProject.p_aspect->setText(values.value("sample_aspect_num") + '/' + values.value("sample_aspect_den")); + m_configProject.p_display->setText(values.value("display_aspect_num") + '/' + values.value("display_aspect_den")); + if (values.value("progressive").toInt() == 0) + m_configProject.p_progressive->setText(i18n("Interlaced")); + else + m_configProject.p_progressive->setText(i18n("Progressive")); + m_defaultProfile = m_configProject.kcfg_profiles_list->itemText(m_configProject.kcfg_profiles_list->currentIndex()); m_defaultPath = currentProfile; } +void KdenliveSettingsDialog::slotCheckAlsaDriver() +{ + QString value = m_configSdl.kcfg_audio_driver->itemData(m_configSdl.kcfg_audio_driver->currentIndex()).toString(); + m_configSdl.kcfg_audio_device->setEnabled(value == "alsa"); +} + +void KdenliveSettingsDialog::loadTranscodeProfiles() +{ + KSharedConfigPtr config = KSharedConfig::openConfig("kdenlivetranscodingrc"); + KConfigGroup transConfig(config, "Transcoding"); + // read the entries + m_configTranscode.profiles_list->blockSignals(true); + QMap< QString, QString > profiles = transConfig.entryMap(); + QMapIterator 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); + } + m_configTranscode.profiles_list->blockSignals(false); +} + +void KdenliveSettingsDialog::saveTranscodeProfiles() +{ + KSharedConfigPtr config = KSharedConfig::openConfig("kdenlivetranscodingrc"); + //KSharedConfigPtr config = KGlobal::config(); + KConfigGroup transConfig(config, "Transcoding"); + // read the entries + transConfig.deleteGroup(); + int max = m_configTranscode.profiles_list->topLevelItemCount(); + for (int i = 0; i < max; i++) { + QTreeWidgetItem *item = m_configTranscode.profiles_list->topLevelItem(i); + transConfig.writeEntry(item->text(0), item->text(1)); + } + 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); + m_configTranscode.profiles_list->setCurrentItem(item); + m_configTranscode.profiles_list->editItem(item); + slotDialogModified(); +} + +void KdenliveSettingsDialog::slotDeleteTranscode() +{ + QTreeWidgetItem *item = m_configTranscode.profiles_list->currentItem(); + if (item == NULL) return; + delete item; + slotDialogModified(); +} + +void KdenliveSettingsDialog::slotShuttleModified() +{ +#ifndef NO_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 +#if KDE_IS_VERSION(4,3,0) + KConfigDialog::updateButtons(); +#endif +} + +void KdenliveSettingsDialog::slotDialogModified() +{ + m_modified = true; +#if KDE_IS_VERSION(4,3,0) + KConfigDialog::updateButtons(); +#endif +} + +//virtual +bool KdenliveSettingsDialog::hasChanged() +{ + 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 size = m_configCapture.kcfg_detectedv4ldevices->itemData(m_configCapture.kcfg_detectedv4ldevices->currentIndex(), Qt::UserRole + 1).toString(); + if (!size.isEmpty()) m_configCapture.kcfg_video4size->setText(size); + rebuildVideo4Commands(); +} #include "kdenlivesettingsdialog.moc"