X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fwizard.cpp;h=ed2ce32cdb797a299ae6fac53435117f06f4a00f;hb=a5cf56c02b034c973cfaf0bc25c56b69a4d5b32b;hp=f8942a795f82e398585334100071d2a562bcf999;hpb=7636e6360fa2696812fd6799e1dda9ea72f7b808;p=kdenlive diff --git a/src/wizard.cpp b/src/wizard.cpp index f8942a79..ed2ce32c 100644 --- a/src/wizard.cpp +++ b/src/wizard.cpp @@ -20,34 +20,47 @@ #include "wizard.h" #include "kdenlivesettings.h" #include "profilesdialog.h" +#include "v4l/v4lcapture.h" +#include "kdenlive-config.h" #include #include #include #include +#include +#include +#include #include #include #include #include -const double recommendedMltVersion = 40; +const double recommendedMltVersion = 510; +static const char kdenlive_version[] = VERSION; Wizard::Wizard(bool upgrade, QWidget *parent) : - QWizard(parent) + QWizard(parent) { + setWindowTitle(i18n("Config Wizard")); setPixmap(QWizard::WatermarkPixmap, QPixmap(KStandardDirs::locate("appdata", "banner.png"))); QWizardPage *page1 = new QWizardPage; page1->setTitle(i18n("Welcome")); QLabel *label; if (upgrade) - label = new QLabel(i18n("Your Kdenlive version was upgraded. Please take some time to review the basic settings")); + label = new QLabel(i18n("Your Kdenlive version was upgraded to version %1. Please take some time to review the basic settings", QString(kdenlive_version).section(' ', 0, 0))); else label = new QLabel(i18n("This is the first time you run Kdenlive. This wizard will let you adjust some basic settings, you will be ready to edit your first movie in a few seconds...")); label->setWordWrap(true); m_startLayout = new QVBoxLayout; m_startLayout->addWidget(label); + QPushButton *but = new QPushButton(KIcon("help-about"), i18n("Discover the features of this Kdenlive release"), this); + connect(but, SIGNAL(clicked()), this, SLOT(slotShowWebInfos())); + m_startLayout->addStretch(); + m_startLayout->addWidget(but); + + page1->setLayout(m_startLayout); addPage(page1); @@ -84,7 +97,7 @@ Wizard::Wizard(bool upgrade, QWidget *parent) : slotCheckStandard(); connect(m_standard.profiles_list, SIGNAL(itemSelectionChanged()), this, SLOT(slotCheckSelectedItem())); - + // select default profile if (!KdenliveSettings::default_profile().isEmpty()) { for (int i = 0; i < m_standard.profiles_list->count(); i++) { if (m_standard.profiles_list->item(i)->data(Qt::UserRole).toString() == KdenliveSettings::default_profile()) { @@ -95,19 +108,13 @@ Wizard::Wizard(bool upgrade, QWidget *parent) : } } - // select default profile - fprintf(stderr, "LOOKING FOR: %s", ProfilesDialog::getProfileDescription(KdenliveSettings::default_profile()).toUtf8().data()); - QList profiles = m_standard.profiles_list->findItems(ProfilesDialog::getProfileDescription(KdenliveSettings::default_profile()), Qt::MatchExactly); - if (profiles.count() > 0) m_standard.profiles_list->setCurrentItem(profiles.at(0)); - - fprintf(stderr, "LOOKING FOR: %s // %d", ProfilesDialog::getProfileDescription(KdenliveSettings::default_profile()).toUtf8().data(), profiles.count()); addPage(page2); QWizardPage *page3 = new QWizardPage; page3->setTitle(i18n("Additional Settings")); m_extra.setupUi(page3); m_extra.projectfolder->setMode(KFile::Directory); - m_extra.projectfolder->setPath(KdenliveSettings::defaultprojectfolder()); + m_extra.projectfolder->setUrl(KUrl(KdenliveSettings::defaultprojectfolder())); m_extra.videothumbs->setChecked(KdenliveSettings::videothumbnails()); m_extra.audiothumbs->setChecked(KdenliveSettings::audiothumbnails()); m_extra.autosave->setChecked(KdenliveSettings::crashrecovery()); @@ -116,6 +123,16 @@ Wizard::Wizard(bool upgrade, QWidget *parent) : slotCheckThumbs(); addPage(page3); +#ifndef Q_WS_MAC + QWizardPage *page6 = new QWizardPage; + page6->setTitle(i18n("Webcam")); + m_capture.setupUi(page6); + connect(m_capture.button_reload, SIGNAL(clicked()), this, SLOT(slotDetectWebcam())); + connect(m_capture.device_list, SIGNAL(itemSelectionChanged()), this, SLOT(slotUpdateCaptureParameters())); + m_capture.button_reload->setIcon(KIcon("view-refresh")); + + addPage(page6); +#endif QWizardPage *page5 = new QWizardPage; page5->setTitle(i18n("Checking system")); @@ -124,16 +141,58 @@ Wizard::Wizard(bool upgrade, QWidget *parent) : listViewDelegate = new WizardDelegate(m_check.programList); m_check.programList->setItemDelegate(listViewDelegate); - + slotDetectWebcam(); QTimer::singleShot(500, this, SLOT(slotCheckMlt())); } +void Wizard::slotDetectWebcam() +{ +#if !defined(Q_WS_MAC) && !defined(Q_OS_FREEBSD) + m_capture.device_list->clear(); + + // Video 4 Linux device detection + V4lCaptureHandler v4l(NULL); + for (int i = 0; i < 10; i++) { + QString path = "/dev/video" + QString::number(i); + if (QFile::exists(path)) { + QStringList deviceInfo = v4l.getDeviceName(path.toUtf8().constData()); + if (!deviceInfo.isEmpty()) { + QTreeWidgetItem *item = new QTreeWidgetItem(m_capture.device_list, QStringList() << deviceInfo.at(0) << "(" + deviceInfo.at(1) + ") " + deviceInfo.at(2)); + item->setData(0, Qt::UserRole, path); + item->setData(0, Qt::UserRole + 1, deviceInfo.at(1)); + } + } + } + if (m_capture.device_list->topLevelItemCount() > 0) { + m_capture.v4l_status->setText(i18n("Select your default video4linux device")); + // select default device + bool found = false; + for (int i = 0; i < m_capture.device_list->topLevelItemCount(); i++) { + QTreeWidgetItem * item = m_capture.device_list->topLevelItem(i); + if (item && item->data(0, Qt::UserRole).toString() == KdenliveSettings::video4vdevice()) { + m_capture.device_list->setCurrentItem(item); + found = true; + break; + } + } + if (!found) m_capture.device_list->setCurrentItem(m_capture.device_list->topLevelItem(0)); + } else m_capture.v4l_status->setText(i18n("No device found, plug your webcam and refresh.")); +#endif +} + +void Wizard::slotUpdateCaptureParameters() +{ + QTreeWidgetItem * item = m_capture.device_list->currentItem(); + if (!item) return; + QString device = item->data(0, Qt::UserRole).toString(); + if (!device.isEmpty()) KdenliveSettings::setVideo4vdevice(device); + + QString size = item->data(0, Qt::UserRole + 1).toString(); + if (!size.isEmpty()) KdenliveSettings::setVideo4size(size); +} void Wizard::checkMltComponents() { - m_mltCheck.programList->setColumnCount(2); - m_mltCheck.programList->setRootIsDecorated(false); - m_mltCheck.programList->setHeaderHidden(true); QSize itemSize(20, fontMetrics().height() * 2.5); m_mltCheck.programList->setColumnWidth(0, 30); m_mltCheck.programList->setIconSize(QSize(24, 24)); @@ -167,7 +226,6 @@ void Wizard::checkMltComponents() } else { avformatItem->setIcon(0, m_okIcon); // Make sure we have MLT > 0.3.4 - bool recentMlt = false; int version = 0; QString mltVersion; QString exepath = KStandardDirs::findExe("pkg-config"); @@ -178,9 +236,8 @@ void Wizard::checkMltComponents() } else { checkProcess.waitForFinished(); mltVersion = checkProcess.readAllStandardOutput(); - version = 100 * mltVersion.section('.', 0, 0).toInt() + 10 * mltVersion.section('.', 1, 1).toInt() + mltVersion.section('.', 2, 2).toInt(); + version = 1000 * mltVersion.section('.', 0, 0).toInt() + 100 * mltVersion.section('.', 1, 1).toInt() + mltVersion.section('.', 2, 2).toInt(); kDebug() << "// FOUND MLT's pkgconfig version: " << version; - if (version > 34) recentMlt = true; } } if (version == 0) { @@ -192,23 +249,24 @@ void Wizard::checkMltComponents() mltVersion = checkProcess.readAllStandardError(); mltVersion = mltVersion.section('\n', 0, 0).simplified(); mltVersion = mltVersion.section(' ', -1).simplified(); - version = 100 * mltVersion.section('.', 0, 0).toInt() + 10 * mltVersion.section('.', 1, 1).toInt() + mltVersion.section('.', 2, 2).toInt(); + version = 1000 * mltVersion.section('.', 0, 0).toInt() + 100 * mltVersion.section('.', 1, 1).toInt() + mltVersion.section('.', 2, 2).toInt(); kDebug() << "// FOUND MLT version: " << version; - if (version >= 40) recentMlt = true; } } mltitem->setText(1, i18n("MLT version: %1", mltVersion.simplified())); mltitem->setSizeHint(0, itemSize); - if (version < recommendedMltVersion) { - mltitem->setData(1, Qt::UserRole, i18n("Please upgrade to the latest MLT version")); + if (version < 506) { + mltitem->setData(1, Qt::UserRole, i18n("Your MLT version is unsupported!!!")); mltitem->setIcon(0, m_badIcon); } else { - mltitem->setData(1, Qt::UserRole, i18n("MLT version is correct")); - mltitem->setIcon(0, m_okIcon); - } - - if (recentMlt) { + if (version < recommendedMltVersion) { + mltitem->setData(1, Qt::UserRole, i18n("Please upgrade to the latest MLT version")); + mltitem->setIcon(0, m_badIcon); + } else { + mltitem->setData(1, Qt::UserRole, i18n("MLT version is correct")); + mltitem->setIcon(0, m_okIcon); + } // Check installed audio codecs QProcess checkProcess2; checkProcess2.start(KdenliveSettings::rendererpath(), QStringList() << "noise:" << "-consumer" << "avformat" << "acodec=list"); @@ -297,14 +355,23 @@ void Wizard::checkMltComponents() } else { imageItem->setIcon(0, m_okIcon); } + + // Check MLT title module + QTreeWidgetItem *titleItem = new QTreeWidgetItem(m_mltCheck.programList, QStringList() << QString() << i18n("Title module")); + titleItem->setData(1, Qt::UserRole, i18n("Required to work with titles")); + titleItem->setSizeHint(0, itemSize); + if (!result.contains("- kdenlivetitle")) { + KdenliveSettings::setHastitleproducer(false); + titleItem->setIcon(0, m_badIcon); + } else { + titleItem->setIcon(0, m_okIcon); + KdenliveSettings::setHastitleproducer(true); + } } } void Wizard::slotCheckPrograms() { - m_check.programList->setColumnCount(2); - m_check.programList->setRootIsDecorated(false); - m_check.programList->setHeaderHidden(true); QSize itemSize(20, fontMetrics().height() * 2.5); m_check.programList->setColumnWidth(0, 30); m_check.programList->setIconSize(QSize(24, 24)); @@ -317,30 +384,60 @@ void Wizard::slotCheckPrograms() else if (KStandardDirs::findExe("ffplay").isEmpty()) item->setIcon(0, m_badIcon); else item->setIcon(0, m_okIcon); - item = new QTreeWidgetItem(m_check.programList, QStringList() << QString() << i18n("Recordmydesktop")); +#ifndef Q_WS_MAC + item = new QTreeWidgetItem(m_check.programList, QStringList() << QString() << i18n("recordmydesktop")); item->setData(1, Qt::UserRole, i18n("Required for screen capture")); item->setSizeHint(0, itemSize); if (KStandardDirs::findExe("recordmydesktop").isEmpty()) item->setIcon(0, m_badIcon); else item->setIcon(0, m_okIcon); - item = new QTreeWidgetItem(m_check.programList, QStringList() << QString() << i18n("Dvgrab")); + item = new QTreeWidgetItem(m_check.programList, QStringList() << QString() << i18n("dvgrab")); item->setData(1, Qt::UserRole, i18n("Required for firewire capture")); item->setSizeHint(0, itemSize); if (KStandardDirs::findExe("dvgrab").isEmpty()) item->setIcon(0, m_badIcon); else item->setIcon(0, m_okIcon); +#endif - item = new QTreeWidgetItem(m_check.programList, QStringList() << QString() << i18n("Dvdauthor")); + item = new QTreeWidgetItem(m_check.programList, QStringList() << QString() << i18n("dvdauthor")); item->setData(1, Qt::UserRole, i18n("Required for creation of DVD")); item->setSizeHint(0, itemSize); if (KStandardDirs::findExe("dvdauthor").isEmpty()) item->setIcon(0, m_badIcon); else item->setIcon(0, m_okIcon); - item = new QTreeWidgetItem(m_check.programList, QStringList() << QString() << i18n("Mkisofs")); + + item = new QTreeWidgetItem(m_check.programList, QStringList() << QString() << i18n("genisoimage or mkisofs")); item->setData(1, Qt::UserRole, i18n("Required for creation of DVD ISO images")); item->setSizeHint(0, itemSize); - if (KStandardDirs::findExe("mkisofs").isEmpty()) item->setIcon(0, m_badIcon); - else item->setIcon(0, m_okIcon); - + if (KStandardDirs::findExe("genisoimage").isEmpty()) { + // no GenIso, check for mkisofs + if (!KStandardDirs::findExe("mkisofs").isEmpty()) { + item->setIcon(0, m_okIcon); + } else item->setIcon(0, m_badIcon); + } else item->setIcon(0, m_okIcon); + + item = new QTreeWidgetItem(m_check.programList, QStringList() << QString() << i18n("xine")); + item->setData(1, Qt::UserRole, i18n("Required to preview your DVD")); + item->setSizeHint(0, itemSize); + if (KStandardDirs::findExe("xine").isEmpty()) item->setIcon(0, m_badIcon); + else item->setIcon(0, m_okIcon); + + // set up some default applications + QString program; + if (KdenliveSettings::defaultimageapp().isEmpty()) { + program = KStandardDirs::findExe("gimp"); + if (program.isEmpty()) program = KStandardDirs::findExe("krita"); + if (!program.isEmpty()) KdenliveSettings::setDefaultimageapp(program); + } + if (KdenliveSettings::defaultaudioapp().isEmpty()) { + program = KStandardDirs::findExe("audacity"); + if (program.isEmpty()) program = KStandardDirs::findExe("traverso"); + if (!program.isEmpty()) KdenliveSettings::setDefaultaudioapp(program); + } + if (KdenliveSettings::defaultplayerapp().isEmpty()) { + KService::Ptr offer = KMimeTypeTrader::self()->preferredService("video/mpeg"); + if (offer) + KdenliveSettings::setDefaultplayerapp(KRun::binaryName(offer->exec(), true)); + } } void Wizard::installExtraMimes(QString baseName, QStringList globs) @@ -353,7 +450,7 @@ void Wizard::installExtraMimes(QString baseName, QStringList globs) } else { QStringList extensions = mime->patterns(); QString comment = mime->comment(); - foreach(const QString &glob, globs) { + foreach(const QString & glob, globs) { if (!extensions.contains(glob)) extensions << glob; } kDebug() << "EXTS: " << extensions; @@ -380,7 +477,7 @@ void Wizard::installExtraMimes(QString baseName, QStringList globs) writer.writeEndElement(); // comment } - foreach(const QString& pattern, extensions) { + foreach(const QString & pattern, extensions) { writer.writeStartElement(nsUri, "glob"); writer.writeAttribute("pattern", pattern); writer.writeEndElement(); // glob @@ -490,8 +587,9 @@ void Wizard::adjustSettings() KdenliveSettings::setDefault_profile(selectedProfile); } QString path = m_extra.projectfolder->url().path(); - if (KStandardDirs::makeDir(path) == false) kDebug() << "/// ERROR CREATING PROJECT FOLDER: " << path; - KdenliveSettings::setDefaultprojectfolder(path); + if (KStandardDirs::makeDir(path) == false) { + kDebug() << "/// ERROR CREATING PROJECT FOLDER: " << path; + } else KdenliveSettings::setDefaultprojectfolder(path); } @@ -522,7 +620,7 @@ void Wizard::slotCheckMlt() if (!result.contains("sdl") || !result.contains("sdl_preview")) errorMessage.append(i18n("MLT's SDL module not found. Please check your MLT install. Kdenlive will not work until this issue is fixed.") + '\n'); if (!errorMessage.isEmpty()) { - errorMessage.prepend(QString("%1
").arg(i18n("Fatal Error"))); + errorMessage.prepend(QString("%1
").arg(i18n("Fatal Error"))); QLabel *pix = new QLabel(); pix->setPixmap(KIcon("dialog-error").pixmap(30)); QLabel *label = new QLabel(errorMessage); @@ -543,4 +641,9 @@ bool Wizard::isOk() const return m_systemCheckIsOk; } +void Wizard::slotShowWebInfos() +{ + KRun::runUrl(KUrl("http://kdenlive.org/discover/" + QString(kdenlive_version).section(' ', 0, 0)), "text/html", this); +} + #include "wizard.moc"