X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fdvdwizardvob.cpp;h=39e7d373109d20608f6f3b0a4873f7a360c8573c;hb=ecda842bf2b632f75198d6cf0fac1fcb5ef862ad;hp=9356f0182638f05dd6d8845b6e7b732984af02b1;hpb=c42a026234a44a2d766e57bc64a6ac7bbd094000;p=kdenlive diff --git a/src/dvdwizardvob.cpp b/src/dvdwizardvob.cpp index 9356f018..39e7d373 100644 --- a/src/dvdwizardvob.cpp +++ b/src/dvdwizardvob.cpp @@ -18,27 +18,56 @@ ***************************************************************************/ #include "dvdwizardvob.h" +#include "kthumb.h" +#include "timecode.h" + +#include #include #include #include #include +#include #include +#include +#include +#include -DvdWizardVob::DvdWizardVob(QWidget *parent): QWizardPage(parent) +DvdWizardVob::DvdWizardVob(const QString &profile, QWidget *parent) : + QWizardPage(parent) { m_view.setupUi(this); m_view.intro_vob->setEnabled(false); - m_view.vob_1->setFilter("video/mpeg"); m_view.intro_vob->setFilter("video/mpeg"); + m_view.button_add->setIcon(KIcon("document-new")); + m_view.button_delete->setIcon(KIcon("edit-delete")); + m_view.button_up->setIcon(KIcon("go-up")); + m_view.button_down->setIcon(KIcon("go-down")); connect(m_view.use_intro, SIGNAL(toggled(bool)), m_view.intro_vob, SLOT(setEnabled(bool))); - connect(m_view.vob_1, SIGNAL(textChanged(const QString &)), this, SLOT(slotCheckVobList(const QString &))); - 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"))); + connect(m_view.button_add, SIGNAL(clicked()), this, SLOT(slotAddVobFile())); + connect(m_view.button_delete, SIGNAL(clicked()), this, SLOT(slotDeleteVobFile())); + connect(m_view.button_up, SIGNAL(clicked()), this, SLOT(slotItemUp())); + connect(m_view.button_down, SIGNAL(clicked()), this, SLOT(slotItemDown())); + 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() && 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); + m_view.dvd_profile->addItems(QStringList() << i18n("PAL 4:3") << i18n("PAL 16:9") << i18n("NTSC 4:3") << i18n("NTSC 16:9")); + 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); + + connect(m_view.dvd_profile, SIGNAL(activated(int)), this, SLOT(changeFormat())); + m_view.vobs_list->header()->setStretchLastSection(false); + m_view.vobs_list->header()->setResizeMode(0, QHeaderView::Stretch); + m_view.vobs_list->header()->setResizeMode(1, QHeaderView::Custom); + m_view.vobs_list->header()->setResizeMode(2, QHeaderView::Custom); + #if KDE_IS_VERSION(4,2,0) m_capacityBar = new KCapacityBar(KCapacityBar::DrawTextInline, this); QHBoxLayout *layout = new QHBoxLayout; @@ -47,86 +76,277 @@ DvdWizardVob::DvdWizardVob(QWidget *parent): QWizardPage(parent) #else m_view.size_box->setHidden(true); #endif + slotCheckVobList(); } DvdWizardVob::~DvdWizardVob() { - QList allUrls = m_view.vob_list->findChildren(); - qDeleteAll(allUrls); #if KDE_IS_VERSION(4,2,0) delete m_capacityBar; #endif } -// virtual +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; + 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; + } + + Mlt::Profile profile(profilename.toUtf8().data()); + 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); + + Mlt::Producer *producer = new Mlt::Producer(profile, url.path().toUtf8().data()); + + if (producer->is_blank() == false) { + 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(); +} + +void DvdWizardVob::changeFormat() +{ + int max = m_view.vobs_list->topLevelItemCount(); + QString profilename; + 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; + } + + Mlt::Profile profile(profilename.toUtf8().data()); + QPixmap pix(180, 135); + + for (int i = 0; i < max; i++) { + QTreeWidgetItem *item = m_view.vobs_list->topLevelItem(i); + Mlt::Producer *producer = new Mlt::Producer(profile, item->text(0).toUtf8().data()); + + if (producer->is_blank() == false) { + //pix = KThumb::getFrame(producer, 0, 135 * profile.dar(), 135); + //item->setIcon(0, pix); + item->setText(1, Timecode::getStringTimecode(producer->get_playtime(), profile.fps())); + } + delete producer; + int submax = item->childCount(); + for (int j = 0; j < submax; j++) { + QTreeWidgetItem *subitem = item->child(j); + subitem->setText(1, Timecode::getStringTimecode(subitem->data(1, Qt::UserRole).toInt(), profile.fps())); + } + } + slotCheckVobList(); +} + +void DvdWizardVob::slotDeleteVobFile() +{ + QTreeWidgetItem *item = m_view.vobs_list->currentItem(); + if (item == NULL) return; + delete item; + slotCheckVobList(); +} + + +// virtual bool DvdWizardVob::isComplete() const { if (!m_view.error_message->text().isEmpty()) return false; - if (m_view.vob_1->url().path().isEmpty()) return false; - if (QFile::exists(m_view.vob_1->url().path())) return true; - return false; + if (m_view.vobs_list->topLevelItemCount() == 0) return false; + return true; } void DvdWizardVob::setUrl(const QString &url) { - m_view.vob_1->setPath(url); + slotAddVobFile(KUrl(url)); } QStringList DvdWizardVob::selectedUrls() const { QStringList result; - QList allUrls = m_view.vob_list->findChildren(); - for (int i = 0; i < allUrls.count(); i++) { - if (!allUrls.at(i)->url().path().isEmpty()) { - result.append(allUrls.at(i)->url().path()); - } + 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->text(0)); + } + return result; +} + + +QStringList DvdWizardVob::durations() 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(QString::number(item->data(1, Qt::UserRole).toInt())); + } + 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; + QTreeWidgetItem *item = m_view.vobs_list->topLevelItem(ix); + if (item) { + result = item->data(1, Qt::UserRole).toInt(); + } + return result; +} + + QString DvdWizardVob::introMovie() const { if (!m_view.use_intro->isChecked()) return QString(); return m_view.intro_vob->url().path(); } -void DvdWizardVob::slotCheckVobList(const QString &text) +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(); - QList allUrls = m_view.vob_list->findChildren(); - int count = allUrls.count(); - kDebug() << "// FOUND " << count << " URLS"; - if (count == 1) { - if (text.isEmpty()) return; - // insert second urlrequester - KUrlRequester *vob = new KUrlRequester(this); - vob->setFilter("video/mpeg"); - m_view.vob_list->layout()->addWidget(vob); - connect(vob, SIGNAL(textChanged(const QString &)), this, SLOT(slotCheckVobList(const QString &))); - } else if (text.isEmpty()) { - if (allUrls.at(count - 1)->url().path().isEmpty() && allUrls.at(count - 2)->url().path().isEmpty()) { - // The last 2 urlrequesters are empty, remove last one - KUrlRequester *vob = allUrls.takeLast(); - delete vob; - } - } else { - if (allUrls.at(count - 1)->url().path().isEmpty()) return; - KUrlRequester *vob = new KUrlRequester(this); - vob->setFilter("video/mpeg"); - m_view.vob_list->layout()->addWidget(vob); - connect(vob, SIGNAL(textChanged(const QString &)), this, SLOT(slotCheckVobList(const QString &))); - } - qint64 maxSize = (qint64) 47000 * 100000; + int max = m_view.vobs_list->topLevelItemCount(); + QTreeWidgetItem *item = m_view.vobs_list->currentItem(); + bool hasItem = true; + if (item == NULL) hasItem = false; + m_view.button_delete->setEnabled(hasItem); + if (hasItem && m_view.vobs_list->indexOfTopLevelItem(item) == 0) m_view.button_up->setEnabled(false); + else m_view.button_up->setEnabled(hasItem); + if (hasItem && m_view.vobs_list->indexOfTopLevelItem(item) == max - 1) m_view.button_down->setEnabled(false); + else m_view.button_down->setEnabled(hasItem); + +#if KDE_IS_VERSION(4,2,0) qint64 totalSize = 0; - for (int i = 0; i < allUrls.count(); i++) { - QFile f(allUrls.at(i)->url().path()); - totalSize += f.size(); + for (int i = 0; i < max; i++) { + item = m_view.vobs_list->topLevelItem(i); + if (item) totalSize += (qint64) item->data(0, Qt::UserRole).toInt(); } -#if KDE_IS_VERSION(4,2,0) + qint64 maxSize = (qint64) 47000 * 100000; m_capacityBar->setValue(100 * totalSize / maxSize); m_capacityBar->setText(KIO::convertSize(totalSize)); #endif } +void DvdWizardVob::slotItemUp() +{ + QTreeWidgetItem *item = m_view.vobs_list->currentItem(); + if (item == NULL) return; + int index = m_view.vobs_list->indexOfTopLevelItem(item); + if (index == 0) return; + m_view.vobs_list->insertTopLevelItem(index - 1, m_view.vobs_list->takeTopLevelItem(index)); +} + +void DvdWizardVob::slotItemDown() +{ + int max = m_view.vobs_list->topLevelItemCount(); + QTreeWidgetItem *item = m_view.vobs_list->currentItem(); + if (item == NULL) return; + int index = m_view.vobs_list->indexOfTopLevelItem(item); + if (index == max - 1) return; + m_view.vobs_list->insertTopLevelItem(index + 1, m_view.vobs_list->takeTopLevelItem(index)); +} + +bool DvdWizardVob::isPal() const +{ + return m_view.dvd_profile->currentIndex() < 2; +} + +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(); +}