]> git.sesse.net Git - kdenlive/commitdiff
Small improvements to dvd wizard (show vob size, better error handling)
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 11 Mar 2009 20:41:33 +0000 (20:41 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 11 Mar 2009 20:41:33 +0000 (20:41 +0000)
svn path=/trunk/kdenlive/; revision=3138

src/dvdwizard.cpp
src/dvdwizard.h
src/dvdwizardmenu.cpp
src/dvdwizardvob.cpp
src/dvdwizardvob.h
src/widgets/dvdwizardstatus_ui.ui
src/widgets/dvdwizardvob_ui.ui

index ad608371bd2438c6d65b4a79404633fa6832b73e..fb01adfcfb95fc732fadd42416f9862b2e8729f2 100644 (file)
@@ -35,7 +35,7 @@
 #include <QDomDocument>
 
 
-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 ?<br />", 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);
+}
+
index c019cabcef2e607ff21f6aa1a745b40397859dec..7a006904cf48e1ed5b2d64aec50f08494d1ce344 100644 (file)
@@ -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);
index ee2e9c40123d8c189a13f941a2c16caefcc25323..e068b01775365a9a4dc20de23027b90226640844 100644 (file)
@@ -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();
index 3c82cef247405e870f578d4b8b35df58cff44f9d..ad681706844130e0da0ef2f073b4cf2fd5581624 100644 (file)
@@ -22,7 +22,9 @@
 #include <KUrlRequester>
 #include <KDebug>
 #include <KStandardDirs>
+#include <KFileItem>
 
+#include <QHBoxLayout>
 
 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("<strong>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<KUrlRequester *> allUrls = m_view.vob_list->findChildren<KUrlRequester *>();
     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
 }
 
index 34970a472e972aaa3f3414b9782d55a5f66a483e..448829be3431f6237fbf8f43e3cd2566a78a43e2 100644 (file)
 #ifndef DVDWIZARDVOB_H
 #define DVDWIZARDVOB_H
 
-#include <QWizardPage>
-
 #include "ui_dvdwizardvob_ui.h"
 
+#include <kdeversion.h>
+
+#if KDE_IS_VERSION(4,2,0)
+#include <kcapacitybar.h>
+#endif
+
+#include <QWizardPage>
+
 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);
 };
index 0b88c16957866dcc2b0dcad8b56dd46a68e66dde..30a2f8358ef15742dfcd7b35e47b8173ba70ff24 100644 (file)
@@ -5,8 +5,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>295</width>
-    <height>191</height>
+    <width>399</width>
+    <height>303</height>
    </rect>
   </property>
   <property name="windowTitle" >
      </item>
     </widget>
    </item>
+   <item row="1" column="0" >
+    <widget class="QGroupBox" name="error_box" >
+     <property name="sizePolicy" >
+      <sizepolicy vsizetype="Preferred" hsizetype="Preferred" >
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="title" >
+      <string/>
+     </property>
+     <layout class="QGridLayout" name="gridLayout_4" >
+      <item row="1" column="0" >
+       <widget class="QLabel" name="label_7" >
+        <property name="text" >
+         <string>Error Log</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="0" >
+       <widget class="KTextEdit" name="error_log" >
+        <property name="readOnly" >
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
   </layout>
+  <zorder>job_progress</zorder>
+  <zorder>error_box</zorder>
+  <zorder>error_log</zorder>
  </widget>
+ <customwidgets>
+  <customwidget>
+   <class>KTextEdit</class>
+   <extends>QTextEdit</extends>
+   <header>ktextedit.h</header>
+  </customwidget>
+ </customwidgets>
  <resources/>
  <connections/>
 </ui>
index cd94bb6f9049051e8bc64eb52b81cf220f74682f..074bf9089e402cf4d929b8f19f12c860f47cc8c0 100644 (file)
@@ -5,8 +5,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>350</width>
-    <height>142</height>
+    <width>334</width>
+    <height>226</height>
    </rect>
   </property>
   <property name="windowTitle" >
@@ -20,7 +20,7 @@
      </property>
     </widget>
    </item>
-   <item row="0" column="1" >
+   <item row="0" column="1" colspan="2" >
     <widget class="KUrlRequester" name="intro_vob" >
      <property name="sizePolicy" >
       <sizepolicy vsizetype="Preferred" hsizetype="Expanding" >
      </property>
     </widget>
    </item>
-   <item row="1" column="0" colspan="2" >
+   <item row="1" column="0" colspan="3" >
     <widget class="QGroupBox" name="vob_list" >
      <property name="sizePolicy" >
-      <sizepolicy vsizetype="MinimumExpanding" hsizetype="Preferred" >
+      <sizepolicy vsizetype="Maximum" hsizetype="Preferred" >
        <horstretch>0</horstretch>
        <verstretch>0</verstretch>
       </sizepolicy>
@@ -48,7 +48,7 @@
      </layout>
     </widget>
    </item>
-   <item row="2" column="0" colspan="2" >
+   <item row="2" column="0" >
     <spacer name="verticalSpacer" >
      <property name="orientation" >
       <enum>Qt::Vertical</enum>
@@ -61,7 +61,7 @@
      </property>
     </spacer>
    </item>
-   <item row="3" column="0" colspan="2" >
+   <item row="4" column="0" colspan="3" >
     <widget class="QLabel" name="error_message" >
      <property name="sizePolicy" >
       <sizepolicy vsizetype="Preferred" hsizetype="Preferred" >
      </property>
     </widget>
    </item>
+   <item row="3" column="0" colspan="3" >
+    <widget class="QGroupBox" name="size_box" >
+     <property name="title" >
+      <string/>
+     </property>
+    </widget>
+   </item>
   </layout>
  </widget>
  <customwidgets>