X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fwizard.cpp;h=430afa2a8dd0be31fa31d1c6f045c3ff6a34b0c7;hb=ccbec8693e89d915500598854c9205c49a7be346;hp=da36d0b516a96fbddf96a070b9d0e915421cee5a;hpb=db7cce03362cb505c93ead2086e1f5653059bc65;p=kdenlive diff --git a/src/wizard.cpp b/src/wizard.cpp index da36d0b5..430afa2a 100644 --- a/src/wizard.cpp +++ b/src/wizard.cpp @@ -20,32 +20,46 @@ #include "wizard.h" #include "kdenlivesettings.h" #include "profilesdialog.h" +#include "kdenlive-config.h" #include #include #include #include +#include +#include +#include #include #include #include #include -const double recommendedMltVersion = 36; +const double recommendedMltVersion = 50; +static const char kdenlive_version[] = VERSION; -Wizard::Wizard(bool upgrade, QWidget *parent): QWizard(parent) { +Wizard::Wizard(bool upgrade, QWidget *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); @@ -65,32 +79,41 @@ Wizard::Wizard(bool upgrade, QWidget *parent): QWizard(parent) { m_badIcon = KIcon("dialog-close"); // build profiles lists - m_profilesInfo = ProfilesDialog::getProfilesInfo(); - QMap::const_iterator i = m_profilesInfo.constBegin(); - while (i != m_profilesInfo.constEnd()) { + QMap profilesInfo = ProfilesDialog::getProfilesInfo(); + QMap::const_iterator i = profilesInfo.constBegin(); + while (i != profilesInfo.constEnd()) { QMap< QString, QString > profileData = ProfilesDialog::getSettingsFromFile(i.value()); - if (profileData.value("width") == "720") m_dvProfiles.append(i.key()); - else if (profileData.value("width").toInt() >= 1080) m_hdvProfiles.append(i.key()); - else m_otherProfiles.append(i.key()); + if (profileData.value("width") == "720") m_dvProfiles.insert(i.key(), i.value()); + else if (profileData.value("width").toInt() >= 1080) m_hdvProfiles.insert(i.key(), i.value()); + else m_otherProfiles.insert(i.key(), i.value()); ++i; } + m_standard.button_all->setChecked(true); connect(m_standard.button_all, SIGNAL(toggled(bool)), this, SLOT(slotCheckStandard())); connect(m_standard.button_hdv, SIGNAL(toggled(bool)), this, SLOT(slotCheckStandard())); connect(m_standard.button_dv, SIGNAL(toggled(bool)), this, SLOT(slotCheckStandard())); - m_standard.button_all->setChecked(true); + slotCheckStandard(); connect(m_standard.profiles_list, SIGNAL(itemSelectionChanged()), this, SLOT(slotCheckSelectedItem())); // select default profile - 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)); + 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()) { + m_standard.profiles_list->setCurrentRow(i); + m_standard.profiles_list->scrollToItem(m_standard.profiles_list->currentItem()); + break; + } + } + } + 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(QDir::homePath() + "/kdenlive"); + 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()); @@ -112,10 +135,8 @@ Wizard::Wizard(bool upgrade, QWidget *parent): QWizard(parent) { } -void Wizard::checkMltComponents() { - m_mltCheck.programList->setColumnCount(2); - m_mltCheck.programList->setRootIsDecorated(false); - m_mltCheck.programList->setHeaderHidden(true); +void Wizard::checkMltComponents() +{ QSize itemSize(20, fontMetrics().height() * 2.5); m_mltCheck.programList->setColumnWidth(0, 30); m_mltCheck.programList->setIconSize(QSize(24, 24)); @@ -123,17 +144,17 @@ void Wizard::checkMltComponents() { QTreeWidgetItem *mltitem = new QTreeWidgetItem(m_mltCheck.programList); - QTreeWidgetItem *inigoitem = new QTreeWidgetItem(m_mltCheck.programList, QStringList() << QString() << i18n("Inigo") + " (" + KdenliveSettings::rendererpath() + ')'); - inigoitem->setData(1, Qt::UserRole, i18n("Required for rendering (part of MLT package)")); - inigoitem->setSizeHint(0, itemSize); - inigoitem->setIcon(0, m_okIcon); + QTreeWidgetItem *meltitem = new QTreeWidgetItem(m_mltCheck.programList, QStringList() << QString() << i18n("Melt") + " (" + KdenliveSettings::rendererpath() + ')'); + meltitem->setData(1, Qt::UserRole, i18n("Required for rendering (part of MLT package)")); + meltitem->setSizeHint(0, itemSize); + meltitem->setIcon(0, m_okIcon); // Check MLT's installed producers QProcess checkProcess; checkProcess.start(KdenliveSettings::rendererpath(), QStringList() << "-query" << "producer"); if (!checkProcess.waitForStarted()) { - inigoitem->setIcon(0, m_badIcon); - inigoitem->setData(1, Qt::UserRole, i18n("Error starting MLT's command line player (inigo)")); + meltitem->setIcon(0, m_badIcon); + meltitem->setData(1, Qt::UserRole, i18n("Error starting MLT's command line player (melt)")); button(QWizard::NextButton)->setEnabled(false); } else { checkProcess.waitForFinished(); @@ -149,12 +170,11 @@ 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"); if (!exepath.isEmpty()) { - checkProcess.start(exepath, QStringList() << "--variable=version" << "mlt-framework"); + checkProcess.start(exepath, QStringList() << "--variable=version" << "mlt++"); if (!checkProcess.waitForStarted()) { kDebug() << "// Error querying MLT's version"; } else { @@ -162,7 +182,6 @@ void Wizard::checkMltComponents() { mltVersion = checkProcess.readAllStandardOutput(); version = 100 * mltVersion.section('.', 0, 0).toInt() + 10 * 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) { @@ -176,21 +195,22 @@ void Wizard::checkMltComponents() { mltVersion = mltVersion.section(' ', -1).simplified(); version = 100 * mltVersion.section('.', 0, 0).toInt() + 10 * mltVersion.section('.', 1, 1).toInt() + mltVersion.section('.', 2, 2).toInt(); kDebug() << "// FOUND MLT version: " << version; - if (version > 34) 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 < 40) { + 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"); @@ -279,13 +299,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); +void Wizard::slotCheckPrograms() +{ QSize itemSize(20, fontMetrics().height() * 2.5); m_check.programList->setColumnWidth(0, 30); m_check.programList->setIconSize(QSize(24, 24)); @@ -298,33 +328,58 @@ 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->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); + 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("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); + + // 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) { +void Wizard::installExtraMimes(QString baseName, QStringList globs) +{ QString mimefile = baseName; mimefile.replace('/', '-'); KMimeType::Ptr mime = KMimeType::mimeType(baseName); @@ -372,7 +427,8 @@ void Wizard::installExtraMimes(QString baseName, QStringList globs) { } } -void Wizard::runUpdateMimeDatabase() { +void Wizard::runUpdateMimeDatabase() +{ const QString localPackageDir = KStandardDirs::locateLocal("xdgdata-mime", QString()); //Q_ASSERT(!localPackageDir.isEmpty()); KProcess proc; @@ -384,7 +440,8 @@ void Wizard::runUpdateMimeDatabase() { } } -void Wizard::slotCheckThumbs() { +void Wizard::slotCheckThumbs() +{ QString pixname = "timeline_vthumbs.png"; if (!m_extra.audiothumbs->isChecked() && !m_extra.videothumbs->isChecked()) { pixname = "timeline_nothumbs.png"; @@ -397,26 +454,43 @@ void Wizard::slotCheckThumbs() { m_extra.timeline_preview->setPixmap(QPixmap(KStandardDirs::locate("appdata", pixname))); } -void Wizard::slotCheckStandard() { +void Wizard::slotCheckStandard() +{ m_standard.profiles_list->clear(); QStringList profiles; - if (m_standard.button_dv->isChecked()) { + if (!m_standard.button_hdv->isChecked()) { // DV standard - m_standard.profiles_list->addItems(m_dvProfiles); - } else if (m_standard.button_hdv->isChecked()) { + QMapIterator i(m_dvProfiles); + while (i.hasNext()) { + i.next(); + QListWidgetItem *item = new QListWidgetItem(i.key(), m_standard.profiles_list); + item->setData(Qt::UserRole, i.value()); + } + } + if (!m_standard.button_dv->isChecked()) { // HDV standard - m_standard.profiles_list->addItems(m_hdvProfiles); - } else { - m_standard.profiles_list->addItems(m_dvProfiles); - m_standard.profiles_list->addItems(m_hdvProfiles); - m_standard.profiles_list->addItems(m_otherProfiles); + QMapIterator i(m_hdvProfiles); + while (i.hasNext()) { + i.next(); + QListWidgetItem *item = new QListWidgetItem(i.key(), m_standard.profiles_list); + item->setData(Qt::UserRole, i.value()); + } + } + if (m_standard.button_all->isChecked()) { + QMapIterator i(m_otherProfiles); + while (i.hasNext()) { + i.next(); + QListWidgetItem *item = new QListWidgetItem(i.key(), m_standard.profiles_list); + item->setData(Qt::UserRole, i.value()); + } //m_standard.profiles_list->sortItems(); } for (int i = 0; i < m_standard.profiles_list->count(); i++) { QListWidgetItem *item = m_standard.profiles_list->item(i); - MltVideoProfile prof = ProfilesDialog::getVideoProfile(m_profilesInfo.value(item->text())); - const QString infoString = ("" + i18n("Frame size:") + " %1x%2
" + i18n("Frame rate:") + " %3/%4
" + i18n("Pixel aspect ratio:") + "%5/%6
" + i18n("Display aspect ratio:") + " %7/%8").arg(QString::number(prof.width), QString::number(prof.height), QString::number(prof.frame_rate_num), QString::number(prof.frame_rate_den), QString::number(prof.sample_aspect_num), QString::number(prof.sample_aspect_den), QString::number(prof.display_aspect_num), QString::number(prof.display_aspect_den)); + + QMap< QString, QString > values = ProfilesDialog::getSettingsFromFile(item->data(Qt::UserRole).toString()); + const QString infoString = ("" + i18n("Frame size:") + " %1x%2
" + i18n("Frame rate:") + " %3/%4
" + i18n("Pixel aspect ratio:") + "%5/%6
" + i18n("Display aspect ratio:") + " %7/%8").arg(values.value("width"), values.value("height"), values.value("frame_rate_num"), values.value("frame_rate_den"), values.value("sample_aspect_num"), values.value("sample_aspect_den"), values.value("display_aspect_num"), values.value("display_aspect_den")); item->setToolTip(infoString); } @@ -424,16 +498,18 @@ void Wizard::slotCheckStandard() { m_standard.profiles_list->setCurrentRow(0); } -void Wizard::slotCheckSelectedItem() { +void Wizard::slotCheckSelectedItem() +{ // Make sure we always have an item highlighted m_standard.profiles_list->setCurrentRow(m_standard.profiles_list->currentRow()); } -void Wizard::adjustSettings() { +void Wizard::adjustSettings() +{ if (m_extra.installmimes->isChecked()) { QStringList globs; - globs << "*.mts" << "*.m2t" << "*.mod" << "*.ts"; + globs << "*.mts" << "*.m2t" << "*.mod" << "*.ts" << "*.m2ts"; installExtraMimes("video/mpeg", globs); globs.clear(); globs << "*.dv"; @@ -444,25 +520,27 @@ void Wizard::adjustSettings() { KdenliveSettings::setVideothumbnails(m_extra.videothumbs->isChecked()); KdenliveSettings::setCrashrecovery(m_extra.autosave->isChecked()); if (m_standard.profiles_list->currentItem()) { - QString selectedProfile = m_profilesInfo.value(m_standard.profiles_list->currentItem()->text()); + QString selectedProfile = m_standard.profiles_list->currentItem()->data(Qt::UserRole).toString(); if (selectedProfile.isEmpty()) selectedProfile = "dv_pal"; 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); } -void Wizard::slotCheckMlt() { +void Wizard::slotCheckMlt() +{ QString errorMessage; if (KdenliveSettings::rendererpath().isEmpty()) { - errorMessage.append(i18n("your MLT installation cannot be found. Install MLT and restart Kdenlive.\n")); + errorMessage.append(i18n("Your MLT installation cannot be found. Install MLT and restart Kdenlive.\n")); } /*QProcess checkProcess; checkProcess.start(KdenliveSettings::rendererpath(), QStringList() << "-query" << "producer"); if (!checkProcess.waitForStarted()) - errorMessage.append(i18n("Error starting MLT's command line player (inigo)") + ".\n"); + errorMessage.append(i18n("Error starting MLT's command line player (melt)") + ".\n"); checkProcess.waitForFinished(); @@ -472,7 +550,7 @@ void Wizard::slotCheckMlt() { QProcess checkProcess2; checkProcess2.start(KdenliveSettings::rendererpath(), QStringList() << "-query" << "consumer"); if (!checkProcess2.waitForStarted()) - errorMessage.append(i18n("Error starting MLT's command line player (inigo).") + '\n'); + errorMessage.append(i18n("Error starting MLT's command line player (melt).") + '\n'); checkProcess2.waitForFinished(); @@ -480,7 +558,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); @@ -496,8 +574,14 @@ void Wizard::slotCheckMlt() { slotCheckPrograms(); } -bool Wizard::isOk() const { +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"