diff --git a/renderer/renderjob.cpp b/renderer/renderjob.cpp index 13be2397132c0742f91928405572dc09e8a77ca6..7c2448b6e92c82052a170a0e0e636ce97f8975bb 100644 --- a/renderer/renderjob.cpp +++ b/renderer/renderjob.cpp @@ -80,9 +80,18 @@ RenderJob::~RenderJob() { m_logfile.close(); } +void RenderJob::slotAbort(const QString& url) { + if (m_dest == url) slotAbort(); +} + void RenderJob::slotAbort() { qDebug() << "Kdenlive-render: JOBĀ ABORTED BY USER..."; m_renderProcess->kill(); + + if (m_kdenliveinterface) { + m_dbusargs[1] = -3; + m_kdenliveinterface->callWithArgumentList(QDBus::NoBlock, "setRenderingProgress", m_dbusargs); + } if (m_jobUiserver) m_jobUiserver->call("terminate", QString()); if (m_erase) { QFile f(m_scenelist); @@ -173,6 +182,8 @@ void RenderJob::start() { m_dbusargs.append(m_dest); m_dbusargs.append((int) 0); m_kdenliveinterface->callWithArgumentList(QDBus::NoBlock, "setRenderingProgress", m_dbusargs); + connect(m_kdenliveinterface, SIGNAL(abortRenderJob(const QString &)), + this, SLOT(slotAbort(const QString&))); } // Because of the logging, we connect to stderr in all cases. diff --git a/renderer/renderjob.h b/renderer/renderjob.h index 021131b1b43407e9ac39e8b2e94b4c245d8b13e8..3683a96170c48e63f4212477907a8174676ac050 100644 --- a/renderer/renderjob.h +++ b/renderer/renderjob.h @@ -40,6 +40,7 @@ private slots: void slotIsOver(int exitcode, QProcess::ExitStatus status); void receivedStderr(); void slotAbort(); + void slotAbort(const QString& url); private: QString m_scenelist; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index dfb8790fcd4a646039574aa475268897467de041..2e66714e2005a02b8d8f586c71e73458d395ed3a 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1395,6 +1395,7 @@ void MainWindow::slotRenderProject() { if (!m_renderWidget) { m_renderWidget = new RenderWidget(this); connect(m_renderWidget, SIGNAL(doRender(const QString&, const QString&, const QStringList &, const QStringList &, bool, bool, double, double, bool)), this, SLOT(slotDoRender(const QString&, const QString&, const QStringList &, const QStringList &, bool, bool, double, double, bool))); + connect(m_renderWidget, SIGNAL(abortProcess(const QString &)), this, SIGNAL(abortRenderJob(const QString &))); if (m_activeDocument) { m_renderWidget->setProfile(m_activeDocument->mltProfile()); m_renderWidget->setGuides(m_activeDocument->guidesXml(), m_activeDocument->projectDuration()); diff --git a/src/mainwindow.h b/src/mainwindow.h index ba2ca8f9eb4885180cb3dae9740a0ed591c9528d..57d87fe6a9d0057075d4ae33eba54e6b1c283802 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -287,6 +287,9 @@ private slots: void generateClip(); void slotZoneMoved(int start, int end); void slotUpdatePreviewSettings(); + +signals: + Q_SCRIPTABLE void abortRenderJob(const QString &url); }; diff --git a/src/org.kdenlive.MainWindow.xml b/src/org.kdenlive.MainWindow.xml index ac76ad218a9105205dd46ace85916e6f5c1b3e59..e7cdc1078139feb5875eee3639953cf286a20020 100644 --- a/src/org.kdenlive.MainWindow.xml +++ b/src/org.kdenlive.MainWindow.xml @@ -1,6 +1,9 @@ + + + diff --git a/src/renderwidget.cpp b/src/renderwidget.cpp index 2cd538e6bdd886d68ffa7038ed3ab2c54f752271..978ce89978fc3fb0dc19f495f93ec7329b3031a6 100644 --- a/src/renderwidget.cpp +++ b/src/renderwidget.cpp @@ -68,6 +68,7 @@ RenderWidget::RenderWidget(QWidget * parent): QDialog(parent) { connect(m_view.buttonEdit, SIGNAL(clicked()), this, SLOT(slotEditProfile())); connect(m_view.buttonDelete, SIGNAL(clicked()), this, SLOT(slotDeleteProfile())); connect(m_view.buttonStart, SIGNAL(clicked()), this, SLOT(slotExport())); + connect(m_view.abort_job, SIGNAL(clicked()), this, SLOT(slotAbortCurrentJob())); connect(m_view.buttonClose, SIGNAL(clicked()), this, SLOT(hide())); connect(m_view.buttonClose2, SIGNAL(clicked()), this, SLOT(hide())); connect(m_view.out_file, SIGNAL(textChanged(const QString &)), this, SLOT(slotUpdateButtons())); @@ -645,6 +646,10 @@ void RenderWidget::setRenderJob(const QString &dest, int progress) { // Rendering crashed existing.at(0)->setIcon(0, KIcon("dialog-close")); existing.at(0)->setData(1, Qt::UserRole, 0); + } else if (progress == -3) { + // User aborted job + existing.at(0)->setIcon(0, KIcon("dialog-close")); + existing.at(0)->setData(1, Qt::UserRole, 100); } else existing.at(0)->setData(1, Qt::UserRole, progress); return; } @@ -657,8 +662,17 @@ void RenderWidget::setRenderJob(const QString &dest, int progress) { // Rendering crashed item->setIcon(0, KIcon("dialog-close")); item->setData(1, Qt::UserRole, 0); + } else if (progress == -3) { + // User aborted job + item->setIcon(0, KIcon("dialog-close")); + item->setData(1, Qt::UserRole, 100); } else item->setData(1, Qt::UserRole, progress); } +void RenderWidget::slotAbortCurrentJob() { + QTreeWidgetItem *current = m_view.running_jobs->currentItem(); + if (current) emit abortProcess(current->text(0)); +} + #include "renderwidget.moc" diff --git a/src/renderwidget.h b/src/renderwidget.h index f2d44d7121ba5aeea4779bfbb31b31408e8e96a7..24e82aa1b4b9d1710d74b56f209b3972aa6d2c70 100644 --- a/src/renderwidget.h +++ b/src/renderwidget.h @@ -87,6 +87,7 @@ private slots: void slotCheckEndGuidePosition(); void showInfoPanel(); void slotUpdateExperimentalRendering(); + void slotAbortCurrentJob(); private: Ui::RenderWidget_UI m_view; @@ -97,6 +98,7 @@ private: signals: void doRender(const QString&, const QString&, const QStringList &, const QStringList &, bool, bool, double, double, bool); + void abortProcess(const QString &url); };