From: Jean-Baptiste Mardelle Date: Sat, 20 Jun 2009 21:10:09 +0000 (+0000) Subject: Rewrote & cleanup(not finished) the handling of renderings jobs creation in order... X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=2f3defec6eb5abb70bf15753c7c6f2a8c4f2a7a2;p=kdenlive Rewrote & cleanup(not finished) the handling of renderings jobs creation in order to properly fix those 2 issues: *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 --- diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 52dc63f6..71b0f2f7 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -86,6 +86,7 @@ #include #include #include +#include #include @@ -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" diff --git a/src/mainwindow.h b/src/mainwindow.h index 7a7c2ed5..c43c6e7e 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -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); diff --git a/src/renderwidget.cpp b/src/renderwidget.cpp index 21bf8542..3ab5dda9 100644 --- a/src/renderwidget.cpp +++ b/src/renderwidget.cpp @@ -29,6 +29,7 @@ #include #include #include +#include // #include #include @@ -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 %1 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 RenderWidget::waitingJobsData() +{ + + QMap 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)); +} + + + diff --git a/src/renderwidget.h b/src/renderwidget.h index 0ae3f162..32e910cc 100644 --- a/src/renderwidget.h +++ b/src/renderwidget.h @@ -147,11 +147,16 @@ public: void setDocumentPath(const QString path); void reloadProfiles(); void setRenderProfile(const QString &dest, const QString &name); + int waitingJobsCount() const; + QMap 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); };