From ec25c39494f757acc4f51fc343c2e3c7a690cf03 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Wed, 11 Mar 2009 20:41:33 +0000 Subject: [PATCH] Small improvements to dvd wizard (show vob size, better error handling) svn path=/trunk/kdenlive/; revision=3138 --- src/dvdwizard.cpp | 119 +++++++++++++++++++++++++----- src/dvdwizard.h | 4 + src/dvdwizardmenu.cpp | 6 +- src/dvdwizardvob.cpp | 23 ++++++ src/dvdwizardvob.h | 14 +++- src/widgets/dvdwizardstatus_ui.ui | 43 ++++++++++- src/widgets/dvdwizardvob_ui.ui | 21 ++++-- 7 files changed, 197 insertions(+), 33 deletions(-) diff --git a/src/dvdwizard.cpp b/src/dvdwizard.cpp index ad608371..fb01adfc 100644 --- a/src/dvdwizard.cpp +++ b/src/dvdwizard.cpp @@ -35,7 +35,7 @@ #include -DvdWizard::DvdWizard(const QString &url, const QString &profile, QWidget *parent): QWizard(parent), m_profile(profile) { +DvdWizard::DvdWizard(const QString &url, const QString &profile, QWidget *parent): QWizard(parent), m_profile(profile), m_dvdauthor(NULL), m_mkiso(NULL) { //setPixmap(QWizard::WatermarkPixmap, QPixmap(KStandardDirs::locate("appdata", "banner.png"))); setAttribute(Qt::WA_DeleteOnClose); m_pageVob = new DvdWizardVob(this); @@ -61,6 +61,7 @@ DvdWizard::DvdWizard(const QString &url, const QString &profile, QWidget *parent QWizardPage *page4 = new QWizardPage; page4->setTitle(i18n("Creating DVD Image")); m_status.setupUi(page4); + m_status.error_box->setHidden(true); addPage(page4); connect(this, SIGNAL(currentIdChanged(int)), this, SLOT(slotPageChanged(int))); @@ -70,6 +71,14 @@ DvdWizard::DvdWizard(const QString &url, const QString &profile, QWidget *parent DvdWizard::~DvdWizard() { // m_menuFile.remove(); + if (m_dvdauthor) { + m_dvdauthor->close(); + delete m_dvdauthor; + } + if (m_mkiso) { + m_mkiso->close(); + delete m_mkiso; + } } @@ -85,7 +94,7 @@ void DvdWizard::slotPageChanged(int page) { m_status.job_progress->item(i)->setIcon(KIcon()); QString warnMessage; if (KIO::NetAccess::exists(KUrl(m_iso.tmp_folder->url().path() + "/DVD"), KIO::NetAccess::SourceSide, this)) - warnMessage.append(i18n("Folder %1 already exists. Overwrite ?
", m_iso.tmp_folder->url().path() + "/DVD")); + warnMessage.append(i18n("Folder %1 already exists. Overwrite ?" + '\n', m_iso.tmp_folder->url().path() + "/DVD")); if (KIO::NetAccess::exists(KUrl(m_iso.iso_image->url().path()), KIO::NetAccess::SourceSide, this)) warnMessage.append(i18n("Image file %1 already exists. Overwrite ?", m_iso.iso_image->url().path())); @@ -179,12 +188,17 @@ void DvdWizard::generateDvd() { if (renderbg.waitForFinished()) { if (renderbg.exitStatus() == QProcess::CrashExit) { kDebug() << "/// RENDERING MENU vob crashed"; + QByteArray result = renderbg.readAllStandardError(); vobitem->setIcon(KIcon("dialog-close")); + m_status.error_log->setText(result); + m_status.error_box->setHidden(false); return; } } else { kDebug() << "/// RENDERING MENU vob timed out"; vobitem->setIcon(KIcon("dialog-close")); + m_status.error_log->setText(i18n("Rendering job timed out")); + m_status.error_box->setHidden(false); return; } vobitem->setIcon(KIcon("dialog-ok")); @@ -261,13 +275,18 @@ void DvdWizard::generateDvd() { if (spumux.waitForFinished()) { kDebug() << QString(spumux.readAll()).simplified(); if (spumux.exitStatus() == QProcess::CrashExit) { - kDebug() << "/// RENDERING SPUMUX MENU crashed"; + QByteArray result = spumux.readAllStandardError(); spuitem->setIcon(KIcon("dialog-close")); + m_status.error_log->setText(result); + m_status.error_box->setHidden(false); + kDebug() << "/// RENDERING SPUMUX MENU crashed"; return; } } else { kDebug() << "/// RENDERING SPUMUX MENU timed out"; spuitem->setIcon(KIcon("dialog-close")); + m_status.error_log->setText(i18n("Menu job timed out")); + m_status.error_box->setHidden(false); return; } @@ -378,55 +397,117 @@ void DvdWizard::generateDvd() { out << dvddoc.toString(); } data2.close(); - + /*kDebug() << "------------------"; + kDebug() << dvddoc.toString(); + kDebug() << "------------------";*/ QStringList args; args << "-x" << m_authorFile.fileName(); kDebug() << "// DVDAUTH ARGS: " << args; - QProcess *dvdauth = new QProcess(this); - connect(dvdauth, SIGNAL(finished(int , QProcess::ExitStatus)), this, SLOT(slotRenderFinished(int, QProcess::ExitStatus))); - dvdauth->setProcessChannelMode(QProcess::MergedChannels); - dvdauth->start("dvdauthor", args); + if (m_dvdauthor) { + m_dvdauthor->close(); + delete m_dvdauthor; + m_dvdauthor = NULL; + } + m_creationLog.clear(); + m_dvdauthor = new QProcess(this); + connect(m_dvdauthor, SIGNAL(finished(int , QProcess::ExitStatus)), this, SLOT(slotRenderFinished(int, QProcess::ExitStatus))); + m_dvdauthor->setProcessChannelMode(QProcess::MergedChannels); + m_dvdauthor->start("dvdauthor", args); } -void DvdWizard::slotRenderFinished(int /*exitCode*/, QProcess::ExitStatus status) { +void DvdWizard::slotRenderFinished(int exitCode, QProcess::ExitStatus status) { QListWidgetItem *authitem = m_status.job_progress->item(3); if (status == QProcess::CrashExit) { + QByteArray result = m_dvdauthor->readAllStandardError(); + m_status.error_log->setText(result); + m_status.error_box->setHidden(false); + kDebug() << "DVDAuthor process crashed"; + authitem->setIcon(KIcon("dialog-close")); + m_dvdauthor->close(); + delete m_dvdauthor; + m_dvdauthor = NULL; + cleanup(); + return; + } + m_creationLog.append(m_dvdauthor->readAllStandardError()); + m_dvdauthor->close(); + delete m_dvdauthor; + m_dvdauthor = NULL; + + // Check if DVD structure has the necessary infos + if (!QFile::exists(m_iso.tmp_folder->url().path() + "/DVD/VIDEO_TS/VIDEO_TS.IFO")) { + m_status.error_log->setText(m_creationLog + '\n' + i18n("Dvd structure broken")); + m_status.error_box->setHidden(false); kDebug() << "DVDAuthor process crashed"; authitem->setIcon(KIcon("dialog-close")); + cleanup(); return; } authitem->setIcon(KIcon("dialog-ok")); qApp->processEvents(); QStringList args; args << "-dvd-video" << "-v" << "-o" << m_iso.iso_image->url().path() << m_iso.tmp_folder->url().path() + "/DVD"; - QProcess *mkiso = new QProcess(this); - connect(mkiso, SIGNAL(finished(int , QProcess::ExitStatus)), this, SLOT(slotIsoFinished(int, QProcess::ExitStatus))); - mkiso->setProcessChannelMode(QProcess::MergedChannels); + + if (m_mkiso) { + m_mkiso->close(); + delete m_mkiso; + m_mkiso = NULL; + } + m_mkiso = new QProcess(this); + connect(m_mkiso, SIGNAL(finished(int , QProcess::ExitStatus)), this, SLOT(slotIsoFinished(int, QProcess::ExitStatus))); + m_mkiso->setProcessChannelMode(QProcess::MergedChannels); QListWidgetItem *isoitem = m_status.job_progress->item(4); isoitem->setIcon(KIcon("system-run")); - mkiso->start("mkisofs", args); + m_mkiso->start("mkisofs", args); } void DvdWizard::slotIsoFinished(int /*exitCode*/, QProcess::ExitStatus status) { QListWidgetItem *isoitem = m_status.job_progress->item(4); if (status == QProcess::CrashExit) { - m_authorFile.remove(); - m_menuFile.remove(); - KIO::NetAccess::del(KUrl(m_iso.tmp_folder->url().path() + "/DVD"), this); + QByteArray result = m_mkiso->readAllStandardError(); + m_status.error_log->setText(result); + m_status.error_box->setHidden(false); + m_mkiso->close(); + delete m_mkiso; + m_mkiso = NULL; + cleanup(); kDebug() << "Iso process crashed"; isoitem->setIcon(KIcon("dialog-close")); return; } + + m_creationLog.append(m_mkiso->readAllStandardError()); + delete m_mkiso; + m_mkiso = NULL; + + // Check if DVD iso is ok + QFile iso(m_iso.iso_image->url().path()); + if (!iso.exists() || iso.size() == 0) { + if (iso.exists()) { + KIO::NetAccess::del(m_iso.iso_image->url(), this); + } + m_status.error_log->setText(m_creationLog + '\n' + i18n("Dvd iso is broken")); + m_status.error_box->setHidden(false); + isoitem->setIcon(KIcon("dialog-close")); + cleanup(); + return; + } + isoitem->setIcon(KIcon("dialog-ok")); kDebug() << "ISO IMAGE " << m_iso.iso_image->url().path() << " Successfully created"; - m_authorFile.remove(); - m_menuFile.remove(); - KIO::NetAccess::del(KUrl(m_iso.tmp_folder->url().path() + "/DVD"), this); + cleanup(); + kDebug() << m_creationLog; KMessageBox::information(this, i18n("DVD iso image %1 successfully created.", m_iso.iso_image->url().path())); } +void DvdWizard::cleanup() { + m_authorFile.remove(); + m_menuFile.remove(); + KIO::NetAccess::del(KUrl(m_iso.tmp_folder->url().path() + "/DVD"), this); +} + diff --git a/src/dvdwizard.h b/src/dvdwizard.h index c019cabc..7a006904 100644 --- a/src/dvdwizard.h +++ b/src/dvdwizard.h @@ -50,6 +50,10 @@ private: QString m_profile; KTemporaryFile m_menuFile; KTemporaryFile m_authorFile; + QProcess *m_dvdauthor; + QProcess *m_mkiso; + QString m_creationLog; + void cleanup(); private slots: void slotPageChanged(int page); diff --git a/src/dvdwizardmenu.cpp b/src/dvdwizardmenu.cpp index ee2e9c40..e068b017 100644 --- a/src/dvdwizardmenu.cpp +++ b/src/dvdwizardmenu.cpp @@ -345,21 +345,21 @@ void DvdWizardMenu::createButtonImages(const QString &img1, const QString &img2, m_scene->removeItem(m_background); m_scene->render(&p, QRectF(0, 0, m_width, m_height)); p.end(); - img.setNumColors(4); QImage saved; if (m_view.menu_profile->currentIndex() < 2) saved = img.scaled(720, 576); else saved = img.scaled(720, 480); + saved.setNumColors(4); saved.save(img1); updateColor(m_view.selected_color->color()); p.begin(&img); m_scene->render(&p, QRectF(0, 0, m_width, m_height)); p.end(); - img.setNumColors(4); if (m_view.menu_profile->currentIndex() < 2) saved = img.scaled(720, 576); else saved = img.scaled(720, 480); + saved.setNumColors(4); saved.save(img2); @@ -367,10 +367,10 @@ void DvdWizardMenu::createButtonImages(const QString &img1, const QString &img2, p.begin(&img); m_scene->render(&p, QRectF(0, 0, m_width, m_height)); p.end(); - img.setNumColors(4); if (m_view.menu_profile->currentIndex() < 2) saved = img.scaled(720, 576); else saved = img.scaled(720, 480); + saved.setNumColors(4); saved.save(img3); updateColor(); diff --git a/src/dvdwizardvob.cpp b/src/dvdwizardvob.cpp index 3c82cef2..ad681706 100644 --- a/src/dvdwizardvob.cpp +++ b/src/dvdwizardvob.cpp @@ -22,7 +22,9 @@ #include #include #include +#include +#include DvdWizardVob::DvdWizardVob(QWidget *parent): QWizardPage(parent) { m_view.setupUi(this); @@ -35,11 +37,21 @@ DvdWizardVob::DvdWizardVob(QWidget *parent): QWizardPage(parent) { if (KStandardDirs::findExe("mkisofs").isEmpty()) m_errorMessage.append(i18n("Program %1 is required for the DVD wizard.", i18n("mkisofs"))); if (m_errorMessage.isEmpty()) m_view.error_message->setVisible(false); else m_view.error_message->setText(m_errorMessage); + +#if KDE_IS_VERSION(4,2,0) + m_capacityBar = new KCapacityBar(KCapacityBar::DrawTextInline, this); + QHBoxLayout *layout = new QHBoxLayout; + layout->addWidget(m_capacityBar); + m_view.size_box->setLayout(layout); +#else + m_view.size_box->setHidden(true); +#endif } DvdWizardVob::~DvdWizardVob() { QList allUrls = m_view.vob_list->findChildren(); qDeleteAll(allUrls); + delete m_capacityBar; } // virtual @@ -96,5 +108,16 @@ void DvdWizardVob::slotCheckVobList(const QString &text) { m_view.vob_list->layout()->addWidget(vob); connect(vob, SIGNAL(textChanged(const QString &)), this, SLOT(slotCheckVobList(const QString &))); } + qint64 maxSize = (qint64) 47000 * 100000; + qint64 totalSize = 0; + for (int i = 0; i < allUrls.count(); i++) { + QFile f(allUrls.at(i)->url().path()); + totalSize += f.size(); + } + +#if KDE_IS_VERSION(4,2,0) + m_capacityBar->setValue(100 * totalSize / maxSize); + m_capacityBar->setText(KIO::convertSize(totalSize)); +#endif } diff --git a/src/dvdwizardvob.h b/src/dvdwizardvob.h index 34970a47..448829be 100644 --- a/src/dvdwizardvob.h +++ b/src/dvdwizardvob.h @@ -21,10 +21,16 @@ #ifndef DVDWIZARDVOB_H #define DVDWIZARDVOB_H -#include - #include "ui_dvdwizardvob_ui.h" +#include + +#if KDE_IS_VERSION(4,2,0) +#include +#endif + +#include + class DvdWizardVob : public QWizardPage { Q_OBJECT @@ -40,6 +46,10 @@ private: Ui::DvdWizardVob_UI m_view; QString m_errorMessage; +#if KDE_IS_VERSION(4,2,0) + KCapacityBar *m_capacityBar; +#endif + private slots: void slotCheckVobList(const QString &text); }; diff --git a/src/widgets/dvdwizardstatus_ui.ui b/src/widgets/dvdwizardstatus_ui.ui index 0b88c169..30a2f835 100644 --- a/src/widgets/dvdwizardstatus_ui.ui +++ b/src/widgets/dvdwizardstatus_ui.ui @@ -5,8 +5,8 @@ 0 0 - 295 - 191 + 399 + 303 @@ -45,8 +45,47 @@ + + + + + 0 + 0 + + + + + + + + + + Error Log + + + + + + + true + + + + + + + job_progress + error_box + error_log + + + KTextEdit + QTextEdit +
ktextedit.h
+
+
diff --git a/src/widgets/dvdwizardvob_ui.ui b/src/widgets/dvdwizardvob_ui.ui index cd94bb6f..074bf908 100644 --- a/src/widgets/dvdwizardvob_ui.ui +++ b/src/widgets/dvdwizardvob_ui.ui @@ -5,8 +5,8 @@ 0 0 - 350 - 142 + 334 + 226
@@ -20,7 +20,7 @@ - + @@ -30,10 +30,10 @@ - + - + 0 0 @@ -48,7 +48,7 @@ - + Qt::Vertical @@ -61,7 +61,7 @@ - + @@ -74,6 +74,13 @@ + + + + + + + -- 2.39.2