#include "renderwidget.h"
#include "kdenlivesettings.h"
#include "ui_saveprofile_ui.h"
+#include "timecode.h"
#include <KStandardDirs>
#include <KDebug>
#include <KIO/NetAccess>
#include <KColorScheme>
#include <KNotification>
+#include <KStartupInfo>
// #include <knewstuff2/engine.h>
#include <QDomDocument>
#include <QListWidgetItem>
#include <QHeaderView>
#include <QMenu>
-#include <QProcess>
#include <QInputDialog>
+#include <QProcess>
+#include <QDBusConnectionInterface>
+#include <QDBusInterface>
const int GroupRole = Qt::UserRole;
const int ExtensionRole = GroupRole + 1;
RenderWidget::RenderWidget(const QString &projectfolder, QWidget * parent) :
QDialog(parent),
- m_projectFolder(projectfolder)
+ m_projectFolder(projectfolder),
+ m_blockProcessing(false)
{
m_view.setupUi(this);
setWindowTitle(i18n("Rendering"));
connect(m_view.buttonEdit, SIGNAL(clicked()), this, SLOT(slotEditProfile()));
connect(m_view.buttonDelete, SIGNAL(clicked()), this, SLOT(slotDeleteProfile()));
connect(m_view.abort_job, SIGNAL(clicked()), this, SLOT(slotAbortCurrentJob()));
+ connect(m_view.start_job, SIGNAL(clicked()), this, SLOT(slotStartCurrentJob()));
connect(m_view.clean_up, SIGNAL(clicked()), this, SLOT(slotCLeanUpJobs()));
connect(m_view.hide_log, SIGNAL(clicked()), this, SLOT(slotHideLog()));
m_view.out_file->setMode(KFile::File);
m_view.running_jobs->setHeaderLabels(QStringList() << QString() << i18n("File") << i18n("Progress"));
- m_view.running_jobs->setItemDelegate(new RenderViewDelegate(this));
+ m_jobsDelegate = new RenderViewDelegate(this);
+ m_view.running_jobs->setItemDelegate(m_jobsDelegate);
QHeaderView *header = m_view.running_jobs->header();
QFontMetrics fm = fontMetrics();
- //header->resizeSection(0, fm.width("typical-name-for-a-torrent.torrent"));
header->setResizeMode(0, QHeaderView::Fixed);
header->resizeSection(0, 30);
header->setResizeMode(1, QHeaderView::Interactive);
- header->resizeSection(1, fm.width("typical-name-for-a-file.torrent"));
header->setResizeMode(2, QHeaderView::Fixed);
- header->resizeSection(1, width() * 2 / 3);
+ header->resizeSection(1, width() * 2 / 3 - 15);
header->setResizeMode(2, QHeaderView::Interactive);
//header->setResizeMode(1, QHeaderView::Fixed);
- m_view.scripts_list->setHeaderLabels(QStringList() << i18n("Script Files"));
- m_view.scripts_list->setItemDelegate(new RenderScriptDelegate(this));
+ m_view.scripts_list->setHeaderLabels(QStringList() << QString() << i18n("Script Files"));
+ m_scriptsDelegate = new RenderViewDelegate(this);
+ m_view.scripts_list->setItemDelegate(m_scriptsDelegate);
+ header = m_view.scripts_list->header();
+ header->setResizeMode(0, QHeaderView::Fixed);
+ header->resizeSection(0, 30);
+
+ // Find path for Kdenlive renderer
+ m_renderer = QCoreApplication::applicationDirPath() + QString("/kdenlive_render");
+ if (!QFile::exists(m_renderer)) {
+ m_renderer = KStandardDirs::findExe("kdenlive_render");
+ if (m_renderer.isEmpty()) m_renderer = KStandardDirs::locate("exe", "kdenlive_render");
+ if (m_renderer.isEmpty()) m_renderer = "kdenlive_render";
+ }
+
+ QDBusConnectionInterface* interface = QDBusConnection::sessionBus().interface();
+ if (!interface || !interface->isServiceRegistered("org.kde.ksmserver")) {
+ m_view.shutdown->setEnabled(false);
+ }
focusFirstVisibleItem();
}
+RenderWidget::~RenderWidget()
+{
+ m_view.running_jobs->blockSignals(true);
+ m_view.scripts_list->blockSignals(true);
+ m_view.running_jobs->clear();
+ m_view.scripts_list->clear();
+ delete m_jobsDelegate;
+ delete m_scriptsDelegate;
+}
+
void RenderWidget::slotEditItem(QListWidgetItem *item)
{
QString edit = item->data(EditableRole).toString();
void RenderWidget::setDocumentPath(const QString path)
{
+ if (m_view.out_file->url().directory() == KUrl(m_projectFolder).directory()) {
+ const QString fileName = m_view.out_file->url().fileName();
+ m_view.out_file->setUrl(KUrl(path + fileName));
+ }
m_projectFolder = path;
- const QString fileName = m_view.out_file->url().fileName();
- m_view.out_file->setUrl(KUrl(m_projectFolder + '/' + fileName));
parseScriptFiles();
+
}
void RenderWidget::slotUpdateGuideBox()
m_view.render_guide->setEnabled(false);
m_view.create_chapter->setEnabled(false);
}
+ double fps = (double) m_profile.frame_rate_num / m_profile.frame_rate_den;
for (int i = 0; i < nodes.count(); i++) {
QDomElement e = nodes.item(i).toElement();
if (!e.isNull()) {
- m_view.guide_start->addItem(e.attribute("comment"), e.attribute("time").toDouble());
- m_view.guide_end->addItem(e.attribute("comment"), e.attribute("time").toDouble());
+ GenTime pos = GenTime(e.attribute("time").toDouble());
+ const QString guidePos = Timecode::getStringTimecode(pos.frames(fps), fps);
+ m_view.guide_start->addItem(e.attribute("comment") + '/' + guidePos, e.attribute("time").toDouble());
+ m_view.guide_end->addItem(e.attribute("comment") + '/' + guidePos, e.attribute("time").toDouble());
}
}
if (nodes.count() > 0)
}
if (url != 0) {
QListWidgetItem *item = m_view.size_list->currentItem();
+ if (!item) {
+ m_view.buttonStart->setEnabled(false);
+ return;
+ }
QString extension = item->data(ExtensionRole).toString();
url = filenameWithExtension(url, extension);
m_view.out_file->setUrl(url);
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";
+
+ // mantisbt 1051
+ KStandardDirs::makeDir(m_view.out_file->url().directory());
+
emit prepareRenderingData(scriptExport, m_view.render_zone->isChecked(), chapterFile);
}
// Check whether target file has an extension.
// If not, ask whether extension should be added or not.
QString extension = item->data(ExtensionRole).toString();
- if (!dest.endsWith(extension)) {
+ if (!dest.endsWith(extension, Qt::CaseInsensitive)) {
if (KMessageBox::questionYesNo(this, i18n("File has no extension. Add extension (%1)?", extension)) == KMessageBox::Yes) {
dest.append("." + extension);
}
render_process_args << "in=" + QString::number(GenTime(guideStart).frames(fps)) << "out=" + QString::number(GenTime(guideEnd).frames(fps));
}
- render_process_args << overlayargs;
+ if (!overlayargs.isEmpty()) render_process_args << "preargs=" + overlayargs.join(" ");
+
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 << "-";
renderArgs.append(subsize);
}
bool resizeProfile = (subsize != currentSize);
- QStringList paramsList = renderArgs.split(" ");
+ QStringList paramsList = renderArgs.split(" ", QString::SkipEmptyParts);
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;
if (resizeProfile) render_process_args << "consumer:" + playlistPath;
else render_process_args << playlistPath;
render_process_args << dest;
- render_process_args << renderArgs;
+ render_process_args << paramsList;
QString group = m_view.size_list->currentItem()->data(MetaGroupRole).toString();
QString scriptName;
if (scriptExport) {
-
- /*renderParameters << scriptName;
- if (group == "dvd") renderParameters << QString::number(m_view.create_chapter->isChecked());
- else renderParameters << QString::number(false);
- 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";
+ outStream << "RENDERER=" << "\"" + m_renderer + "\"" << "\n";
+ outStream << "MELT=" << "\"" + render_process_args.takeFirst() + "\"" << "\n";
+ outStream << "PARAMETERS=" << "\"" + render_process_args.join(" ") + "\"" << "\n";
+ outStream << "$RENDERER $MELT $PARAMETERS" << "\n" << "\n";
if (file.error() != QFile::NoError) {
KMessageBox::error(this, i18n("Cannot write to file %1", scriptPath));
file.close();
m_view.tabWidget->setCurrentIndex(1);
// Save rendering profile to document
- emit selectedRenderProfile(m_view.size_list->currentItem()->data(MetaGroupRole).toString(), m_view.size_list->currentItem()->text());
+ emit selectedRenderProfile(m_view.size_list->currentItem()->data(MetaGroupRole).toString(), m_view.size_list->currentItem()->text(), dest);
// insert item in running jobs list
QTreeWidgetItem *renderItem;
// Set rendering type
if (group == "dvd") {
- renderParameters << QString::number(m_view.create_chapter->isChecked());
if (m_view.open_dvd->isChecked()) {
renderItem->setData(0, Qt::UserRole, group);
if (renderArgs.contains("profile=")) {
- // rendering profile contains an MLT profile, so pass it to the running jog item, useful for dvd
+ // rendering profile contains an MLT profile, so pass it to the running jog item, useful for dvd
QString prof = renderArgs.section("profile=", 1, 1);
prof = prof.section(' ', 0, 0);
kDebug() << "// render profile: " << prof;
}
}
} else {
- renderParameters << QString::number(false);
if (group == "websites" && m_view.open_browser->isChecked()) {
renderItem->setData(0, Qt::UserRole, group);
- // pass the url
+ // pass the url
QString url = m_view.size_list->currentItem()->data(ExtraRole).toString();
renderItem->setData(0, Qt::UserRole + 1, url);
}
void RenderWidget::checkRenderStatus()
{
+ // check if we have a job waiting to render
+ if (m_blockProcessing) return;
QTreeWidgetItem *item = m_view.running_jobs->topLevelItem(0);
while (item) {
- if (item->data(1, Qt::UserRole + 2).toInt() == RUNNINGJOB) break;
- else if (item->data(1, Qt::UserRole + 2).toInt() == WAITINGJOB) {
+ if (item->data(1, Qt::UserRole + 2).toInt() == RUNNINGJOB) return;
+ item = m_view.running_jobs->itemBelow(item);
+ }
+ item = m_view.running_jobs->topLevelItem(0);
+ bool waitingJob = false;
+ while (item) {
+ 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()) {
- 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());
- }
+ waitingJob = true;
+ startRendering(item);
break;
}
item = m_view.running_jobs->itemBelow(item);
}
+ if (waitingJob == false && m_view.shutdown->isChecked()) emit shutdown();
+}
+
+void RenderWidget::startRendering(QTreeWidgetItem *item)
+{
+ if (item->data(1, Qt::UserRole + 4).isNull()) {
+ // Normal render process
+ if (QProcess::startDetached(m_renderer, item->data(1, Qt::UserRole + 3).toStringList()) == false) {
+ item->setData(1, Qt::UserRole + 2, FINISHEDJOB);
+ item->setData(1, Qt::UserRole, i18n("Rendering crashed"));
+ item->setIcon(0, KIcon("dialog-close"));
+ item->setData(2, Qt::UserRole, 100);
+ } else KNotification::event("RenderStarted", i18n("Rendering <i>%1</i> started", item->text(1)), QPixmap(), this);
+ } else {
+ // Script item
+ if (QProcess::startDetached(item->data(1, Qt::UserRole + 3).toString()) == false) {
+ item->setData(1, Qt::UserRole + 2, FINISHEDJOB);
+ item->setData(1, Qt::UserRole, i18n("Rendering crashed"));
+ item->setIcon(0, KIcon("dialog-close"));
+ item->setData(2, Qt::UserRole, 100);
+ }
+ }
}
int RenderWidget::waitingJobsCount() const
if (!sizeItem->isHidden()) {
// Make sure the selected profile uses an installed avformat codec / format
std = sizeItem->data(ParamsRole).toString();
-
if (!formatsList.isEmpty()) {
QString format;
if (std.startsWith("f=")) format = std.section("f=", 1, 1);
KUrl RenderWidget::filenameWithExtension(KUrl url, QString extension)
{
- QString path;
- if (!url.isEmpty()) {
- path = url.path();
- int pos = path.lastIndexOf('.') + 1;
- if (pos == 0) path.append('.' + extension);
- else path = path.left(pos) + extension;
+ if (url.isEmpty()) url = KUrl(m_projectFolder);
+ QString directory = url.directory(KUrl::AppendTrailingSlash | KUrl::ObeyTrailingSlash);
+ QString filename = url.fileName(KUrl::ObeyTrailingSlash);
+ QString ext;
- } else {
- path = m_projectFolder + "/untitled." + extension;
+ if (extension.at(0) == '.') ext = extension;
+ else ext = '.' + extension;
+
+ if (filename.isEmpty()) filename = i18n("untitled");
+
+ int pos = filename.lastIndexOf('.');
+ if (pos == 0) filename.append(ext);
+ else {
+ if (!filename.endsWith(ext, Qt::CaseInsensitive)) {
+ filename = filename.left(pos) + ext;
+ }
}
- return KUrl(path);
+
+ return KUrl(directory + filename);
}
// can also override profiles installed by KNewStuff
fileList.removeAll("customprofiles.xml");
foreach(const QString &filename, fileList)
- parseFile(exportFolder + '/' + filename, true);
- if (QFile::exists(exportFolder + "/customprofiles.xml")) parseFile(exportFolder + "/customprofiles.xml", true);
+ parseFile(exportFolder + filename, true);
+ if (QFile::exists(exportFolder + "customprofiles.xml")) parseFile(exportFolder + "customprofiles.xml", true);
if (!meta.isEmpty()) {
m_view.destination_list->blockSignals(true);
QListWidgetItem *item;
QDomNodeList groups = doc.elementsByTagName("group");
+ const QStringList acodecsList = KdenliveSettings::audiocodecs();
+ bool replaceVorbisCodec = false;
+ if (!acodecsList.contains("vorbis") && acodecsList.contains("libvorbis")) replaceVorbisCodec = true;
+ bool replaceLibfaacCodec = false;
+ if (!acodecsList.contains("aac") && acodecsList.contains("libfaac")) replaceLibfaacCodec = true;
+
+
if (editable || groups.count() == 0) {
QDomElement profiles = doc.documentElement();
if (editable && profiles.attribute("version", 0).toInt() < 1) {
QString profileName = profile.attribute("name");
QString standard = profile.attribute("standard");
QString params = profile.attribute("args");
+
+ if (replaceVorbisCodec && params.contains("acodec=vorbis")) {
+ // replace vorbis with libvorbis
+ params = params.replace("vorbis", "libvorbis");
+ }
+ if (replaceLibfaacCodec && params.contains("acodec=aac")) {
+ // replace libfaac with aac
+ params = params.replace("aac", "libfaac");
+ }
+
QString category = profile.attribute("category", i18n("Custom"));
QString dest = profile.attribute("destinationid");
QString prof_extension = profile.attribute("extension");
if (!gname.isNull()) {
metagroupName = gname.firstChild().nodeValue();
metagroupId = gname.toElement().attribute("id");
- if (!metagroupName.isEmpty() && !m_view.destination_list->contains(metagroupName)) {
+
+ if (!metagroupName.isEmpty() && m_view.destination_list->findData(metagroupId) == -1) {
if (metagroupId == "dvd") icon = KIcon("media-optical");
else if (metagroupId == "audioonly") icon = KIcon("audio-x-generic");
else if (metagroupId == "websites") icon = KIcon("applications-internet");
profileName = profileElement.attribute("name");
standard = profileElement.attribute("standard");
params = profileElement.attribute("args");
+
+ if (replaceVorbisCodec && params.contains("acodec=vorbis")) {
+ // replace vorbis with libvorbis
+ params = params.replace("vorbis", "libvorbis");
+ }
+ if (replaceLibfaacCodec && params.contains("acodec=aac")) {
+ // replace libfaac with aac
+ params = params.replace("aac", "libfaac");
+ }
+
prof_extension = profileElement.attribute("extension");
if (!prof_extension.isEmpty()) extension = prof_extension;
item = new QListWidgetItem(profileName, m_view.size_list);
else {
delete current;
slotCheckJob();
+ checkRenderStatus();
}
}
}
+void RenderWidget::slotStartCurrentJob()
+{
+ QTreeWidgetItem *current = m_view.running_jobs->currentItem();
+ if (current && current->data(1, Qt::UserRole + 2).toInt() == WAITINGJOB)
+ startRendering(current);
+ m_view.start_job->setEnabled(false);
+}
+
void RenderWidget::slotCheckJob()
{
bool activate = false;
QTreeWidgetItem *current = m_view.running_jobs->currentItem();
if (current) {
- if (current->data(1, Qt::UserRole + 2).toInt() == RUNNINGJOB)
+ if (current->data(1, Qt::UserRole + 2).toInt() == RUNNINGJOB) {
m_view.abort_job->setText(i18n("Abort Job"));
- else m_view.abort_job->setText(i18n("Remove Job"));
+ m_view.start_job->setEnabled(false);
+ } else {
+ m_view.abort_job->setText(i18n("Remove Job"));
+ m_view.start_job->setEnabled(current->data(1, Qt::UserRole + 2).toInt() == WAITINGJOB);
+ }
activate = true;
}
m_view.abort_job->setEnabled(activate);
QTreeWidgetItem *item;
// List the project scripts
- QStringList scriptFiles = QDir(m_projectFolder + "/scripts").entryList(scriptsFilter, QDir::Files);
+ QStringList scriptFiles = QDir(m_projectFolder + "scripts").entryList(scriptsFilter, QDir::Files);
for (int i = 0; i < scriptFiles.size(); ++i) {
- KUrl scriptpath(m_projectFolder + "/scripts/" + scriptFiles.at(i));
- item = new QTreeWidgetItem(m_view.scripts_list, QStringList() << scriptpath.fileName());
+ KUrl scriptpath(m_projectFolder + "scripts/" + scriptFiles.at(i));
QString target;
+ QString renderer;
+ QString melt;
QFile file(scriptpath.path());
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
while (!file.atEnd()) {
QByteArray line = file.readLine();
if (line.startsWith("TARGET=")) {
- target = QString(line).section("TARGET=", 1);
+ target = QString(line).section("TARGET=", 1).simplified();
target.remove(QChar('"'));
- break;
+ } else if (line.startsWith("RENDERER=")) {
+ renderer = QString(line).section("RENDERER=", 1).simplified();
+ renderer.remove(QChar('"'));
+ } else if (line.startsWith("MELT=")) {
+ melt = QString(line).section("MELT=", 1).simplified();
+ melt.remove(QChar('"'));
}
}
file.close();
}
+ if (target.isEmpty()) continue;
+ item = new QTreeWidgetItem(m_view.scripts_list, QStringList() << QString() << scriptpath.fileName());
+ if (!renderer.isEmpty() && renderer.contains('/') && !QFile::exists(renderer)) {
+ item->setIcon(0, KIcon("dialog-cancel"));
+ item->setToolTip(1, i18n("Script contains wrong command: %1", renderer));
+ item->setData(0, Qt::UserRole, '1');
+ } else if (!melt.isEmpty() && melt.contains('/') && !QFile::exists(melt)) {
+ item->setIcon(0, KIcon("dialog-cancel"));
+ item->setToolTip(1, i18n("Script contains wrong command: %1", melt));
+ item->setData(0, Qt::UserRole, '1');
+ } else item->setIcon(0, KIcon("application-x-executable-script"));
item->setSizeHint(0, QSize(m_view.scripts_list->columnWidth(0), fontMetrics().height() * 2));
- item->setData(0, Qt::UserRole, target.simplified());
- item->setData(0, Qt::UserRole + 1, scriptpath.path());
+ item->setData(1, Qt::UserRole, target.simplified());
+ item->setData(1, Qt::UserRole + 1, scriptpath.path());
}
bool activate = false;
QTreeWidgetItem *script = m_view.scripts_list->topLevelItem(0);
void RenderWidget::slotCheckScript()
{
- bool activate = false;
- QTreeWidgetItemIterator it(m_view.scripts_list);
- if (*it) activate = true;
- m_view.start_script->setEnabled(activate);
- m_view.delete_script->setEnabled(activate);
+ QTreeWidgetItem *item = m_view.scripts_list->currentItem();
+ if (item == NULL) return;
+ m_view.start_script->setEnabled(item->data(0, Qt::UserRole).toString().isEmpty());
+ m_view.delete_script->setEnabled(true);
}
void RenderWidget::slotStartScript()
{
QTreeWidgetItem *item = m_view.scripts_list->currentItem();
if (item) {
- QString destination = item->data(0, Qt::UserRole).toString();
- QString path = item->data(0, Qt::UserRole + 1).toString();
+ QString destination = item->data(1, Qt::UserRole).toString();
+ QString path = item->data(1, Qt::UserRole + 1).toString();
// Insert new job in queue
QTreeWidgetItem *renderItem;
QList<QTreeWidgetItem *> existing = m_view.running_jobs->findItems(destination, Qt::MatchExactly, 1);
{
QTreeWidgetItem *item = m_view.scripts_list->currentItem();
if (item) {
- QString path = item->data(0, Qt::UserRole + 1).toString();
+ QString path = item->data(1, Qt::UserRole + 1).toString();
KIO::NetAccess::del(path + ".mlt", this);
KIO::NetAccess::del(path, this);
parseScriptFiles();
m_view.error_box->setVisible(false);
}
-void RenderWidget::setRenderProfile(const QString &dest, const QString &name)
+void RenderWidget::setRenderProfile(const QString &dest, const QString &name, const QString &url)
{
m_view.destination_list->blockSignals(true);
m_view.format_list->blockSignals(true);
m_view.size_list->blockSignals(true);
+
+ if (!url.isEmpty()) m_view.out_file->setUrl(KUrl(url));
+
for (int i = 0; i < m_view.destination_list->count(); i++) {
if (m_view.destination_list->itemData(i, Qt::UserRole) == dest) {
m_view.destination_list->setCurrentIndex(i);
}
-QMap <QStringList, QStringList> RenderWidget::waitingJobsData()
+bool RenderWidget::startWaitingRenderJobs()
{
+ m_blockProcessing = true;
+ QString autoscriptFile = getFreeScriptName("auto");
+ QFile file(autoscriptFile);
+ if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
+ kWarning() << "////// ERROR writing to file: " << autoscriptFile;
+ KMessageBox::error(0, i18n("Cannot write to file %1", autoscriptFile));
+ return false;
+ }
- 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);
- }
+ QTextStream outStream(&file);
+ outStream << "#! /bin/sh" << "\n" << "\n";
+ 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()) {
+ // Add render process for item
+ const QString params = item->data(1, Qt::UserRole + 3).toStringList().join(" ");
+ outStream << m_renderer << " " << params << "\n";
+ } else {
+ // Script item
+ outStream << item->data(1, Qt::UserRole + 3).toString() << "\n";
+ }
+ }
+ item = m_view.running_jobs->itemBelow(item);
}
- item = m_view.running_jobs->itemBelow(item);
- }*/
- return renderData;
+ // erase itself when rendering is finished
+ outStream << "rm " << autoscriptFile << "\n" << "\n";
+ if (file.error() != QFile::NoError) {
+ KMessageBox::error(0, i18n("Cannot write to file %1", autoscriptFile));
+ file.close();
+ m_blockProcessing = false;
+ return false;
+ }
+ file.close();
+ QFile::setPermissions(autoscriptFile, file.permissions() | QFile::ExeUser);
+ QProcess::startDetached(autoscriptFile, QStringList());
+ return true;
}
-QString RenderWidget::getFreeScriptName()
+QString RenderWidget::getFreeScriptName(const QString &prefix)
{
int ix = 0;
- QString scriptsFolder = m_projectFolder + "/scripts/";
+ 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)) {
+ QString path;
+ while (path.isEmpty() || QFile::exists(path)) {
ix++;
- path = scriptsFolder + i18n("script") + QString::number(ix).rightJustified(3, '0', false) + ".sh";
+ path = scriptsFolder + prefix + 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));
+ const QByteArray startId = KStartupInfo::createNewStartupId();
+ const QString command = KdenliveSettings::defaultplayerapp() + ' ' + item->text(1);
+ KRun::runCommand(command, KdenliveSettings::defaultplayerapp(), KdenliveSettings::defaultplayerapp(), this, startId);
}