X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fdvdwizardvob.cpp;h=e49c3c3f8c036de516daec79406ad7ab29b89bab;hb=91ed5df62de9959bccd0ea1e797ba3fa33602695;hp=f75ac9c968e9ec87e6aa5d25ad9366d56a1536fd;hpb=113979561ccb47cc3d3c9ede5d8956ffdab7d0c0;p=kdenlive diff --git a/src/dvdwizardvob.cpp b/src/dvdwizardvob.cpp index f75ac9c9..e49c3c3f 100644 --- a/src/dvdwizardvob.cpp +++ b/src/dvdwizardvob.cpp @@ -32,6 +32,7 @@ #include #include #include +#include DvdWizardVob::DvdWizardVob(const QString &profile, QWidget *parent) : QWizardPage(parent) @@ -51,8 +52,8 @@ DvdWizardVob::DvdWizardVob(const QString &profile, QWidget *parent) : connect(m_view.vobs_list, SIGNAL(itemSelectionChanged()), this, SLOT(slotCheckVobList())); m_view.vobs_list->setIconSize(QSize(60, 45)); - if (KStandardDirs::findExe("dvdauthor").isEmpty()) m_errorMessage.append(i18n("Program %1 is required for the DVD wizard.", i18n("dvdauthor"))); - if (KStandardDirs::findExe("mkisofs").isEmpty()) m_errorMessage.append(i18n("Program %1 is required for the DVD wizard.", i18n("mkisofs"))); + if (KStandardDirs::findExe("dvdauthor").isEmpty()) m_errorMessage.append(i18n("Program %1 is required for the DVD wizard.", i18n("dvdauthor"))); + if (KStandardDirs::findExe("mkisofs").isEmpty() && KStandardDirs::findExe("genisoimage").isEmpty()) m_errorMessage.append(i18n("Program %1 or %2 is required for the DVD wizard.", i18n("mkisofs"), i18n("genisoimage"))); if (m_errorMessage.isEmpty()) m_view.error_message->setVisible(false); else m_view.error_message->setText(m_errorMessage); @@ -86,35 +87,70 @@ DvdWizardVob::~DvdWizardVob() } -void DvdWizardVob::slotAddVobFile(KUrl url) +void DvdWizardVob::slotAddVobFile(KUrl url, const QString &chapters) { if (url.isEmpty()) url = KFileDialog::getOpenUrl(KUrl("kfiledialog:///projectfolder"), "video/mpeg", this, i18n("Add new video file")); if (url.isEmpty()) return; QFile f(url.path()); qint64 fileSize = f.size(); QString profilename; - if (m_view.dvd_profile->currentIndex() == 0) profilename = "dv_pal"; - else profilename = "dv_ntsc"; - Mlt::Profile profile((char*) profilename.data()); + switch (m_view.dvd_profile->currentIndex()) { + case 1: + profilename = "dv_pal_wide"; + break; + case 2: + profilename = "dv_ntsc"; + break; + case 3: + profilename = "dv_ntsc_wide"; + break; + default: + profilename = "dv_pal"; + break; + } + + char *tmp = (char*) qstrdup(profilename.toUtf8().data()); + Mlt::Profile profile(tmp); + delete[] tmp; QTreeWidgetItem *item = new QTreeWidgetItem(m_view.vobs_list, QStringList() << url.path() << QString() << KIO::convertSize(fileSize)); item->setData(0, Qt::UserRole, fileSize); item->setIcon(0, KIcon("video-x-generic")); QPixmap pix(60, 45); - char *tmp = (char *) qstrdup(url.path().toUtf8().data()); + tmp = (char *) qstrdup(url.path().toUtf8().data()); Mlt::Producer *producer = new Mlt::Producer(profile, tmp); delete[] tmp; if (producer->is_blank() == false) { - pix = KThumb::getFrame(producer, 0, 60, 45); - item->setIcon(0, pix); + int width = 45.0 * profile.dar(); + if (width % 2 == 1) width++; + item->setIcon(0, QPixmap::fromImage(KThumb::getFrame(producer, 0, width, 45))); int playTime = producer->get_playtime(); item->setText(1, Timecode::getStringTimecode(playTime, profile.fps())); item->setData(1, Qt::UserRole, playTime); } delete producer; + if (chapters.isEmpty() == false) + item->setData(1, Qt::UserRole + 1, chapters); + else if (QFile::exists(url.path() + ".dvdchapter")) { + // insert chapters as children + QFile file(url.path() + ".dvdchapter"); + if (file.open(QIODevice::ReadOnly)) { + QDomDocument doc; + doc.setContent(&file); + file.close(); + QDomNodeList chapters = doc.elementsByTagName("chapter"); + QStringList chaptersList; + for (int j = 0; j < chapters.count(); j++) { + chaptersList.append(QString::number(chapters.at(j).toElement().attribute("time").toInt())); + } + item->setData(1, Qt::UserRole + 1, chaptersList.join(";")); + } + } else // Explicitly add a chapter at 00:00:00:00 + item->setData(1, Qt::UserRole + 1, "0"); + slotCheckVobList(); } @@ -122,19 +158,34 @@ void DvdWizardVob::changeFormat() { int max = m_view.vobs_list->topLevelItemCount(); QString profilename; - if (m_view.dvd_profile->currentIndex() == 0) profilename = "dv_pal"; - else profilename = "dv_ntsc"; - Mlt::Profile profile((char*) profilename.data()); + switch (m_view.dvd_profile->currentIndex()) { + case 1: + profilename = "dv_pal_wide"; + break; + case 2: + profilename = "dv_ntsc"; + break; + case 3: + profilename = "dv_ntsc_wide"; + break; + default: + profilename = "dv_pal"; + break; + } + + char *tmp = (char*) qstrdup(profilename.toUtf8().data()); + Mlt::Profile profile(tmp); + delete[] tmp; QPixmap pix(180, 135); for (int i = 0; i < max; i++) { QTreeWidgetItem *item = m_view.vobs_list->topLevelItem(i); - char *tmp = (char *) qstrdup(item->text(0).toUtf8().data()); + tmp = (char *) qstrdup(item->text(0).toUtf8().data()); Mlt::Producer *producer = new Mlt::Producer(profile, tmp); delete[] tmp; if (producer->is_blank() == false) { - //pix = KThumb::getFrame(producer, 0, 180, 135); + //pix = KThumb::getFrame(producer, 0, 135 * profile.dar(), 135); //item->setIcon(0, pix); item->setText(1, Timecode::getStringTimecode(producer->get_playtime(), profile.fps())); } @@ -195,6 +246,27 @@ QStringList DvdWizardVob::durations() const return result; } +QStringList DvdWizardVob::chapters() const +{ + QStringList result; + QString path; + int max = m_view.vobs_list->topLevelItemCount(); + for (int i = 0; i < max; i++) { + QTreeWidgetItem *item = m_view.vobs_list->topLevelItem(i); + if (item) result.append(item->data(1, Qt::UserRole + 1).toString()); + } + return result; +} + +void DvdWizardVob::updateChapters(QMap chaptersdata) +{ + int max = m_view.vobs_list->topLevelItemCount(); + for (int i = 0; i < max; i++) { + QTreeWidgetItem *item = m_view.vobs_list->topLevelItem(i); + item->setData(1, Qt::UserRole + 1, chaptersdata.value(item->text(0))); + } +} + int DvdWizardVob::duration(int ix) const { int result = -1; @@ -212,6 +284,13 @@ QString DvdWizardVob::introMovie() const return m_view.intro_vob->url().path(); } +void DvdWizardVob::setIntroMovie(const QString path) +{ + m_view.intro_vob->setUrl(KUrl(path)); + m_view.use_intro->setChecked(path.isEmpty() == false); +} + + void DvdWizardVob::slotCheckVobList() { emit completeChanged(); @@ -267,5 +346,15 @@ bool DvdWizardVob::isWide() const return (m_view.dvd_profile->currentIndex() == 1 || m_view.dvd_profile->currentIndex() == 3); } +void DvdWizardVob::setProfile(const QString profile) +{ + if (profile == "dv_pal") m_view.dvd_profile->setCurrentIndex(0); + else if (profile == "dv_pal_wide") m_view.dvd_profile->setCurrentIndex(1); + else if (profile == "dv_ntsc") m_view.dvd_profile->setCurrentIndex(2); + else if (profile == "dv_ntsc_wide") m_view.dvd_profile->setCurrentIndex(3); +} - +void DvdWizardVob::clear() +{ + m_view.vobs_list->clear(); +}