]> git.sesse.net Git - kdenlive/commitdiff
Rewrote & cleanup(not finished) the handling of renderings jobs creation in order...
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 20 Jun 2009 21:10:09 +0000 (21:10 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 20 Jun 2009 21:10:09 +0000 (21:10 +0000)
*Problem with rendering zone:
http://kdenlive.org/mantis/view.php?id=947
*Queued jobs deleted on application close:
http://kdenlive.org/mantis/view.php?id=939

svn path=/trunk/kdenlive/; revision=3613

src/mainwindow.cpp
src/mainwindow.h
src/renderwidget.cpp
src/renderwidget.h

index 52dc63f6b3e1aa23e62d71cecb99f586bd41a34a..71b0f2f72b2e3f8e7e3fa6f76da04bc4bf331e7e 100644 (file)
@@ -86,6 +86,7 @@
 #include <QTimer>
 #include <QAction>
 #include <QKeyEvent>
+#include <QInputDialog>
 
 #include <stdlib.h>
 
@@ -390,6 +391,24 @@ void MainWindow::queryQuit()
 //virtual
 bool MainWindow::queryClose()
 {
+    if (m_renderWidget) {
+        int waitingJobs = m_renderWidget->waitingJobsCount();
+        if (waitingJobs > 0) {
+            switch (KMessageBox::warningYesNoCancel(this, i18n("You have %1 rendering jobs waiting in the queue.\nWhat do you want to do with these jobs?", waitingJobs), QString(), KGuiItem(i18n("Start them now")), KGuiItem(i18n("Delete them")))) {
+            case KMessageBox::Yes :
+                // create script with waiting jobs and start it
+                //startWaitingRenderJobs();
+                KMessageBox::sorry(this, "not implementd yet");
+                return false;
+                break;
+            case KMessageBox::No :
+                // Don't do anything, jobs will be deleted
+                break;
+            default:
+                return false;
+            }
+        }
+    }
     saveOptions();
     if (m_monitorManager) m_monitorManager->stopActiveMonitor();
     if (m_activeDocument && m_activeDocument->isModified()) {
@@ -1593,6 +1612,7 @@ void MainWindow::slotRenderProject()
         m_renderWidget = new RenderWidget(projectfolder, this);
         connect(m_renderWidget, SIGNAL(doRender(const QStringList&, const QStringList&)), this, SLOT(slotDoRender(const QStringList&, const QStringList&)));
         connect(m_renderWidget, SIGNAL(selectedRenderProfile(const QString &, const QString &)), this, SLOT(slotSetDocumentRenderProfile(const QString &, const QString &)));
+        connect(m_renderWidget, SIGNAL(prepareRenderingData(bool, bool, const QString&)), this, SLOT(slotPrepareRendering(bool, bool, const QString&)));
         connect(m_renderWidget, SIGNAL(abortProcess(const QString &)), this, SIGNAL(abortRenderJob(const QString &)));
         connect(m_renderWidget, SIGNAL(openDvdWizard(const QString &, const QString &)), this, SLOT(slotDvdWizard(const QString &, const QString &)));
         if (m_activeDocument) {
@@ -1608,18 +1628,19 @@ void MainWindow::slotRenderProject()
     m_renderWidget->showNormal();
 }
 
-void MainWindow::slotDoRender(const QStringList args, const QStringList overlay_args)
+void MainWindow::slotDoRender(const QStringList render_args, const QStringList overlay_args)
 {
-    QString dest = args.at(0);
-    QString render = args.at(1);
-    QStringList avformat_args = args.at(2).split(' ');
-    bool zoneOnly = args.at(3).toInt();
-    bool playAfter = args.at(4).toInt();
-    double guideStart = args.at(5).toDouble();
-    double guideEnd = args.at(6).toDouble();
-    bool resizeProfile = args.at(7).toInt();
-    QString scriptExport = args.at(8);
-    bool createChapterFile = args.at(9).toInt();
+    //TODO: remove this function if no problem is detected with the new renderwidget rendering
+    QString dest = render_args.at(0);
+    QString render = render_args.at(1);
+    QStringList avformat_args = render_args.at(2).split(' ');
+    bool zoneOnly = render_args.at(3).toInt();
+    bool playAfter = render_args.at(4).toInt();
+    double guideStart = render_args.at(5).toDouble();
+    double guideEnd = render_args.at(6).toDouble();
+    bool resizeProfile = render_args.at(7).toInt();
+    QString scriptExport = render_args.at(8);
+    bool createChapterFile = render_args.at(9).toInt();
 
     if (dest.isEmpty()) return;
     int in = 0;
@@ -1710,51 +1731,6 @@ void MainWindow::slotDoRender(const QStringList args, const QStringList overlay_
             file.close();
             QFile::setPermissions(scriptExport, file.permissions() | QFile::ExeUser);
         }
-
-        if (createChapterFile) {
-            QDomDocument doc;
-            QDomElement chapters = doc.createElement("chapters");
-            chapters.setAttribute("fps", m_activeDocument->fps());
-            doc.appendChild(chapters);
-
-            QDomElement guidesxml = m_activeDocument->guidesXml();
-            if (!zoneOnly) out = (int) GenTime(m_activeDocument->projectDuration()).frames(m_activeDocument->fps());
-
-            QDomNodeList nodes = guidesxml.elementsByTagName("guide");
-            for (int i = 0; i < nodes.count(); i++) {
-                QDomElement e = nodes.item(i).toElement();
-                if (!e.isNull()) {
-                    QString comment = e.attribute("comment");
-                    int time = (int) GenTime(e.attribute("time").toDouble()).frames(m_activeDocument->fps());
-                    if (time >= in && time < out) {
-                        if (zoneOnly) time = time - in;
-                        QDomElement chapter = doc.createElement("chapter");
-                        chapters.appendChild(chapter);
-                        chapter.setAttribute("title", comment);
-                        chapter.setAttribute("time", time);
-                    }
-                }
-            }
-            if (chapters.childNodes().count() > 0) {
-                if (m_activeTimeline->projectView()->hasGuide(out, 0) == -1) {
-                    // Always insert a guide in pos 0
-                    QDomElement chapter = doc.createElement("chapter");
-                    chapters.insertBefore(chapter, QDomNode());
-                    chapter.setAttribute("title", i18n("Start"));
-                    chapter.setAttribute("time", "0");
-                }
-                // save chapters file
-                QFile file(dest + ".dvdchapter");
-                if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
-                    kWarning() << "//////  ERROR writing DVD CHAPTER file: " << dest + ".dvdchapter";
-                } else {
-                    file.write(doc.toString().toUtf8());
-                    if (file.error() != QFile::NoError)
-                        kWarning() << "//////  ERROR writing DVD CHAPTER file: " << dest + ".dvdchapter";
-                    file.close();
-                }
-            }
-        }
     }
 }
 
@@ -2812,4 +2788,90 @@ void MainWindow::slotSetDocumentRenderProfile(const QString &dest, const QString
     m_activeDocument->setModified(true);
 }
 
+void MainWindow::startWaitingRenderJobs()
+{
+
+}
+
+void MainWindow::slotPrepareRendering(bool scriptExport, bool zoneOnly, const QString &chapterFile)
+{
+    if (m_activeDocument == NULL || m_renderWidget == NULL) return;
+    QString scriptPath;
+    QString playlistPath;
+    if (scriptExport) {
+        bool ok;
+        QString scriptsFolder = m_activeDocument->projectFolder().path() + "/scripts/";
+        QString path = m_renderWidget->getFreeScriptName();
+        scriptPath = QInputDialog::getText(this, i18n("Create Render Script"), i18n("Script name (will be saved in: %1)", scriptsFolder), QLineEdit::Normal, KUrl(path).fileName(), &ok);
+        if (!ok || scriptPath.isEmpty()) return;
+        scriptPath.prepend(scriptsFolder);
+        QFile f(scriptPath);
+        if (f.exists()) {
+            if (KMessageBox::warningYesNo(this, i18n("Script file already exists. Do you want to overwrite it?")) != KMessageBox::Yes)
+                return;
+        }
+        playlistPath = scriptPath + ".mlt";
+        m_projectMonitor->saveSceneList(playlistPath);
+    } else {
+        KTemporaryFile temp;
+        temp.setAutoRemove(false);
+        temp.setSuffix(".mlt");
+        temp.open();
+        playlistPath = temp.fileName();
+        m_projectMonitor->saveSceneList(playlistPath);
+    }
+
+    if (!chapterFile.isEmpty()) {
+        int in = 0;
+        int out;
+        if (!zoneOnly) out = (int) GenTime(m_activeDocument->projectDuration()).frames(m_activeDocument->fps());
+        else {
+            in = m_activeTimeline->inPoint();
+            out = m_activeTimeline->outPoint();
+        }
+        QDomDocument doc;
+        QDomElement chapters = doc.createElement("chapters");
+        chapters.setAttribute("fps", m_activeDocument->fps());
+        doc.appendChild(chapters);
+
+        QDomElement guidesxml = m_activeDocument->guidesXml();
+        QDomNodeList nodes = guidesxml.elementsByTagName("guide");
+        for (int i = 0; i < nodes.count(); i++) {
+            QDomElement e = nodes.item(i).toElement();
+            if (!e.isNull()) {
+                QString comment = e.attribute("comment");
+                int time = (int) GenTime(e.attribute("time").toDouble()).frames(m_activeDocument->fps());
+                if (time >= in && time < out) {
+                    if (zoneOnly) time = time - in;
+                    QDomElement chapter = doc.createElement("chapter");
+                    chapters.appendChild(chapter);
+                    chapter.setAttribute("title", comment);
+                    chapter.setAttribute("time", time);
+                }
+            }
+        }
+        if (chapters.childNodes().count() > 0) {
+            if (m_activeTimeline->projectView()->hasGuide(out, 0) == -1) {
+                // Always insert a guide in pos 0
+                QDomElement chapter = doc.createElement("chapter");
+                chapters.insertBefore(chapter, QDomNode());
+                chapter.setAttribute("title", i18n("Start"));
+                chapter.setAttribute("time", "0");
+            }
+            // save chapters file
+            QFile file(chapterFile);
+            if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
+                kWarning() << "//////  ERROR writing DVD CHAPTER file: " << chapterFile;
+            } else {
+                file.write(doc.toString().toUtf8());
+                if (file.error() != QFile::NoError)
+                    kWarning() << "//////  ERROR writing DVD CHAPTER file: " << chapterFile;
+                file.close();
+            }
+        }
+    }
+
+    m_renderWidget->slotExport(scriptExport, m_activeTimeline->inPoint(), m_activeTimeline->outPoint(), playlistPath, scriptPath);
+}
+
 #include "mainwindow.moc"
index 7a7c2ed54af382afda00450e247893decf08cadd..c43c6e7ef1f21e6b90813de7d95ff2bf6eeb6667 100644 (file)
@@ -193,6 +193,7 @@ private:
     QStringList m_pluginFileNames;
     QByteArray m_timelineState;
     void loadTranscoders();
+    void startWaitingRenderJobs();
 
 public slots:
     void openFile(const KUrl &url);
@@ -226,7 +227,7 @@ private slots:
     void slotSwitchMarkersComments();
     void slotSwitchSnap();
     void slotRenderProject();
-    void slotDoRender(const QStringList args, const QStringList overlay_args);
+    void slotDoRender(const QStringList render_args, const QStringList overlay_args);
     void slotFullScreen();
     void slotUpdateDocumentState(bool modified);
     void slotZoomIn();
@@ -302,6 +303,7 @@ private slots:
     void slotTranscode(KUrl::List urls = KUrl::List());
     void slotTranscodeClip();
     void slotSetDocumentRenderProfile(const QString &dest, const QString &name);
+    void slotPrepareRendering(bool scriptExport, bool zoneOnly, const QString &chapterFile);
 
 signals:
     Q_SCRIPTABLE void abortRenderJob(const QString &url);
index 21bf85423698051291d74afa2e2785810c915ff8..3ab5dda94a64907011bea601e7477e6deee4bcb4 100644 (file)
@@ -29,6 +29,7 @@
 #include <KRun>
 #include <KIO/NetAccess>
 #include <KColorScheme>
+#include <KNotification>
 // #include <knewstuff2/engine.h>
 
 #include <QDomDocument>
@@ -85,7 +86,7 @@ RenderWidget::RenderWidget(const QString &projectfolder, QWidget * parent) :
 
     QMenu *renderMenu = new QMenu(i18n("Start Rendering"), this);
     QAction *renderAction = renderMenu->addAction(KIcon("video-x-generic"), i18n("Render to File"));
-    connect(renderAction, SIGNAL(triggered()), this, SLOT(slotExport()));
+    connect(renderAction, SIGNAL(triggered()), this, SLOT(slotPrepareExport()));
     QAction *scriptAction = renderMenu->addAction(KIcon("application-x-shellscript"), i18n("Generate Script"));
     connect(scriptAction, SIGNAL(triggered()), this, SLOT(slotGenerateScript()));
 
@@ -107,6 +108,7 @@ RenderWidget::RenderWidget(const QString &projectfolder, QWidget * parent) :
     connect(m_view.delete_script, SIGNAL(clicked()), this, SLOT(slotDeleteScript()));
     connect(m_view.scripts_list, SIGNAL(itemSelectionChanged()), this, SLOT(slotCheckScript()));
     connect(m_view.running_jobs, SIGNAL(itemSelectionChanged()), this, SLOT(slotCheckJob()));
+    connect(m_view.running_jobs, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(slotPlayRendering(QTreeWidgetItem *, int)));
 
     connect(m_view.buttonInfo, SIGNAL(clicked()), this, SLOT(showInfoPanel()));
 
@@ -573,7 +575,21 @@ void RenderWidget::focusFirstVisibleItem()
     updateButtons();
 }
 
-void RenderWidget::slotExport(bool scriptExport)
+void RenderWidget::slotPrepareExport(bool scriptExport)
+{
+    if (!QFile::exists(KdenliveSettings::rendererpath())) {
+        KMessageBox::sorry(this, i18n("Cannot find the melt program required for rendering (part of Mlt)"));
+        return;
+    }
+    if (m_view.play_after->isChecked() && KdenliveSettings::defaultplayerapp().isEmpty())
+        KMessageBox::sorry(this, i18n("Cannot play video after rendering because the default video player application is not set.\nPlease define it in Kdenlive settings dialog."));
+    QString chapterFile;
+    if (m_view.create_chapter->isChecked()) chapterFile = m_view.out_file->url().path() + ".dvdchapter";
+    emit prepareRenderingData(scriptExport, m_view.render_zone->isChecked(), chapterFile);
+}
+
+
+void RenderWidget::slotExport(bool scriptExport, int zoneIn, int zoneOut, const QString &playlistPath, const QString &scriptPath)
 {
     QListWidgetItem *item = m_view.size_list->currentItem();
     if (!item) return;
@@ -596,7 +612,6 @@ void RenderWidget::slotExport(bool scriptExport)
             return;
     }
 
-
     QStringList overlayargs;
     if (m_view.tc_overlay->isChecked()) {
         QString filterFile = KStandardDirs::locate("appdata", "metadata.properties");
@@ -604,12 +619,28 @@ void RenderWidget::slotExport(bool scriptExport)
         overlayargs << "-attach" << "data_feed:attr_check" << "-attach";
         overlayargs << "data_show:" + filterFile << "_loader=1" << "dynamic=1";
     }
-    double startPos = -1;
-    double endPos = -1;
-    if (m_view.render_guide->isChecked()) {
-        startPos = m_view.guide_start->itemData(m_view.guide_start->currentIndex()).toDouble();
-        endPos = m_view.guide_end->itemData(m_view.guide_end->currentIndex()).toDouble();
+
+    QStringList render_process_args;
+
+    if (!scriptExport) render_process_args << "-erase";
+    if (KdenliveSettings::usekuiserver()) render_process_args << "-kuiserver";
+
+    double guideStart = 0;
+    double guideEnd = 0;
+
+    if (m_view.render_zone->isChecked()) render_process_args << "in=" + QString::number(zoneIn) << "out=" + QString::number(zoneOut);
+    else if (m_view.render_guide->isChecked()) {
+        double fps = (double) m_profile.frame_rate_num / m_profile.frame_rate_den;
+        guideStart = m_view.guide_start->itemData(m_view.guide_start->currentIndex()).toDouble();
+        guideEnd = m_view.guide_end->itemData(m_view.guide_end->currentIndex()).toDouble();
+        render_process_args << "in=" + QString::number(GenTime(guideStart).frames(fps)) << "out=" + QString::number(GenTime(guideEnd).frames(fps));
     }
+
+    render_process_args << overlayargs;
+    render_process_args << KdenliveSettings::rendererpath() << m_profile.path << item->data(RenderRole).toString();
+    if (m_view.play_after->isChecked()) render_process_args << KdenliveSettings::KdenliveSettings::defaultplayerapp();
+    else render_process_args << "-";
+
     QString renderArgs = m_view.advanced_params->toPlainText().simplified();
 
     // Adjust frame scale
@@ -650,37 +681,55 @@ void RenderWidget::slotExport(bool scriptExport)
         renderArgs.append(subsize);
     }
     bool resizeProfile = (subsize != currentSize);
+    QStringList paramsList = renderArgs.split(" ");
+    for (int i = 0; i < paramsList.count(); i++) {
+        if (paramsList.at(i).startsWith("profile=")) {
+            if (paramsList.at(i).section('=', 1) != m_profile.path) resizeProfile = true;
+            break;
+        }
+    }
+
+    if (resizeProfile) render_process_args << "consumer:" + playlistPath;
+    else render_process_args << playlistPath;
+    render_process_args << dest;
+    render_process_args << renderArgs;
 
     QString group = m_view.size_list->currentItem()->data(MetaGroupRole).toString();
 
     QStringList renderParameters;
     renderParameters << dest << item->data(RenderRole).toString() << renderArgs.simplified();
-    renderParameters << QString::number(m_view.render_zone->isChecked()) << QString::number(m_view.play_after->isChecked());
-    renderParameters << QString::number(startPos) << QString::number(endPos) << QString::number(resizeProfile);
+    renderParameters << QString::number(zoneIn) << QString::number(zoneOut) << QString::number(m_view.play_after->isChecked());
+    renderParameters << QString::number(guideStart) << QString::number(guideEnd) << QString::number(resizeProfile);
 
     QString scriptName;
     if (scriptExport) {
-        bool ok;
-        int ix = 0;
-        QString scriptsFolder = m_projectFolder + "/scripts/";
-        KStandardDirs::makeDir(scriptsFolder);
-        QString path = scriptsFolder + i18n("script") + QString::number(ix).rightJustified(3, '0', false) + ".sh";
-        while (QFile::exists(path)) {
-            ix++;
-            path = scriptsFolder + i18n("script") + QString::number(ix).rightJustified(3, '0', false) + ".sh";
-        }
-        scriptName = QInputDialog::getText(this, i18n("Create Render Script"), i18n("Script name (will be saved in: %1)", scriptsFolder), QLineEdit::Normal, KUrl(path).fileName(), &ok);
-        if (!ok || scriptName.isEmpty()) return;
-        scriptName.prepend(scriptsFolder);
-        QFile f(scriptName);
-        if (f.exists()) {
-            if (KMessageBox::warningYesNo(this, i18n("Script file already exists. Do you want to overwrite it?")) != KMessageBox::Yes)
-                return;
-        }
-        renderParameters << scriptName;
+
+        /*renderParameters << scriptName;
         if (group == "dvd") renderParameters << QString::number(m_view.create_chapter->isChecked());
         else renderParameters << QString::number(false);
-        emit doRender(renderParameters, overlayargs);
+        emit doRender(renderParameters, overlayargs);*/
+
+        // Generate script file
+        QFile file(scriptPath);
+        if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
+            KMessageBox::error(this, i18n("Cannot write to file %1", scriptPath));
+            return;
+        }
+        QString renderer = QCoreApplication::applicationDirPath() + QString("/kdenlive_render");
+        if (!QFile::exists(renderer)) renderer = "kdenlive_render";
+        QTextStream outStream(&file);
+        outStream << "#! /bin/sh" << "\n" << "\n";
+        outStream << "SOURCE=" << "\"" + playlistPath + "\"" << "\n";
+        outStream << "TARGET=" << "\"" + dest + "\"" << "\n";
+        outStream << renderer << " " << render_process_args.join(" ") << "\n" << "\n";
+        if (file.error() != QFile::NoError) {
+            KMessageBox::error(this, i18n("Cannot write to file %1", scriptPath));
+            file.close();
+            return;
+        }
+        file.close();
+        QFile::setPermissions(scriptPath, file.permissions() | QFile::ExeUser);
+
         QTimer::singleShot(400, this, SLOT(parseScriptFiles()));
         m_view.tabWidget->setCurrentIndex(2);
         return;
@@ -703,13 +752,12 @@ void RenderWidget::slotExport(bool scriptExport)
         renderItem->setData(1, Qt::UserRole + 4, QString());
     } else {
         renderItem = new QTreeWidgetItem(m_view.running_jobs, QStringList() << QString() << dest << QString());
-        renderItem->setData(1, Qt::UserRole + 2, WAITINGJOB);
-        renderItem->setIcon(0, KIcon("media-playback-pause"));
-        renderItem->setData(1, Qt::UserRole, i18n("Waiting..."));
     }
+    renderItem->setData(1, Qt::UserRole + 2, WAITINGJOB);
+    renderItem->setIcon(0, KIcon("media-playback-pause"));
+    renderItem->setData(1, Qt::UserRole, i18n("Waiting..."));
     renderItem->setSizeHint(1, QSize(m_view.running_jobs->columnWidth(1), fontMetrics().height() * 2));
     renderItem->setData(1, Qt::UserRole + 1, QTime::currentTime());
-    renderItem->setData(1, Qt::UserRole + 2, overlayargs);
 
     // Set rendering type
     if (group == "dvd") {
@@ -733,9 +781,7 @@ void RenderWidget::slotExport(bool scriptExport)
             renderItem->setData(0, Qt::UserRole + 1, url);
         }
     }
-
-
-    renderItem->setData(1, Qt::UserRole + 3, renderParameters);
+    renderItem->setData(1, Qt::UserRole + 3, render_process_args);
     checkRenderStatus();
 }
 
@@ -747,7 +793,11 @@ void RenderWidget::checkRenderStatus()
         else if (item->data(1, Qt::UserRole + 2).toInt() == WAITINGJOB) {
             item->setData(1, Qt::UserRole + 1, QTime::currentTime());
             if (item->data(1, Qt::UserRole + 4).isNull()) {
-                emit doRender(item->data(1, Qt::UserRole + 3).toStringList(), item->data(1, Qt::UserRole + 2).toStringList());
+                QString renderer = QCoreApplication::applicationDirPath() + QString("/kdenlive_render");
+                if (!QFile::exists(renderer)) renderer = "kdenlive_render";
+                QProcess::startDetached(renderer, item->data(1, Qt::UserRole + 3).toStringList());
+                KNotification::event("RenderStarted", i18n("Rendering <i>%1</i> started", item->text(1)), QPixmap(), this);
+                //emit doRender(item->data(1, Qt::UserRole + 3).toStringList(), item->data(1, Qt::UserRole + 2).toStringList());
             } else {
                 // Script item
                 QProcess::startDetached(item->data(1, Qt::UserRole + 3).toString());
@@ -758,6 +808,17 @@ void RenderWidget::checkRenderStatus()
     }
 }
 
+int RenderWidget::waitingJobsCount() const
+{
+    int count = 0;
+    QTreeWidgetItem *item = m_view.running_jobs->topLevelItem(0);
+    while (item) {
+        if (item->data(1, Qt::UserRole + 2).toInt() == WAITINGJOB) count++;
+        item = m_view.running_jobs->itemBelow(item);
+    }
+    return count;
+}
+
 void RenderWidget::setProfile(MltVideoProfile profile)
 {
     m_profile = profile;
@@ -1418,7 +1479,7 @@ void RenderWidget::slotDeleteScript()
 
 void RenderWidget::slotGenerateScript()
 {
-    slotExport(true);
+    slotPrepareExport(true);
 }
 
 void RenderWidget::slotHideLog()
@@ -1456,3 +1517,43 @@ void RenderWidget::setRenderProfile(const QString &dest, const QString &name)
 
 }
 
+QMap <QStringList, QStringList> RenderWidget::waitingJobsData()
+{
+
+    QMap <QStringList, QStringList> renderData;
+    /*  QTreeWidgetItem *item = m_view.running_jobs->topLevelItem(0);
+      while (item) {
+          if (item->data(1, Qt::UserRole + 2).toInt() == WAITINGJOB) {
+       if (item->data(1, Qt::UserRole + 4).isNull()) {
+    // We only start straight jobs, script jobs are already saved somewhere...
+    const QStringList params = item->data(1, Qt::UserRole + 3).toStringList();
+    const QStringList ov_params = item->data(1, Qt::UserRole + 2).toStringList();
+    renderData.insert(params, ov_params);
+       }
+    }
+          item = m_view.running_jobs->itemBelow(item);
+      }*/
+    return renderData;
+}
+
+QString RenderWidget::getFreeScriptName()
+{
+    int ix = 0;
+    QString scriptsFolder = m_projectFolder + "/scripts/";
+    KStandardDirs::makeDir(scriptsFolder);
+    QString path = scriptsFolder + i18n("script") + QString::number(ix).rightJustified(3, '0', false) + ".sh";
+    while (QFile::exists(path)) {
+        ix++;
+        path = scriptsFolder + i18n("script") + QString::number(ix).rightJustified(3, '0', false) + ".sh";
+    }
+    return path;
+}
+
+void RenderWidget::slotPlayRendering(QTreeWidgetItem *item, int)
+{
+    if (KdenliveSettings::defaultplayerapp().isEmpty() || item->data(1, Qt::UserRole + 2).toInt() != FINISHEDJOB) return;
+    QProcess::startDetached(KdenliveSettings::defaultplayerapp(), QStringList() << item->text(1));
+}
+
+
+
index 0ae3f1624cb2bdfa3e9c3accc331e76318bdfb45..32e910cc6634778ae0f7b8dfd692d4cefb2adfa4 100644 (file)
@@ -147,11 +147,16 @@ public:
     void setDocumentPath(const QString path);
     void reloadProfiles();
     void setRenderProfile(const QString &dest, const QString &name);
+    int waitingJobsCount() const;
+    QMap <QStringList, QStringList> waitingJobsData();
+    QString getFreeScriptName();
+
+public slots:
+    void slotExport(bool scriptExport, int zoneIn, int zoneOut, const QString &playlistPath, const QString &scriptPath);
 
 private slots:
     void slotUpdateButtons(KUrl url);
     void slotUpdateButtons();
-    void slotExport(bool scriptExport = false);
     void refreshView();
     void refreshParams();
     void slotSaveProfile();
@@ -171,6 +176,8 @@ private slots:
     void slotEditItem(QListWidgetItem *item);
     void slotCLeanUpJobs();
     void slotHideLog();
+    void slotPrepareExport(bool scriptExport = false);
+    void slotPlayRendering(QTreeWidgetItem *item, int);
 
 private:
     Ui::RenderWidget_UI m_view;
@@ -187,6 +194,7 @@ signals:
     void abortProcess(const QString &url);
     void openDvdWizard(const QString &url, const QString &profile);
     void selectedRenderProfile(const QString &category, const QString &name);
+    void prepareRenderingData(bool scriptExport, bool zoneOnly, const QString &chapterFile);
 };