Git commit d52d16923d3f794335544669db20d35d75913d55 by Jean-Baptiste Mardel= le. Committed on 30/06/2016 at 22:32. Pushed by mardelle into branch 'master'. Only set proxy on a clip when it is successfully created Add option to discard pending jobs Fix bin job counter CCBUG: 364941 M +6 -1 src/bin/bin.cpp M +2 -1 src/bin/bin.h M +39 -18 src/project/jobs/jobmanager.cpp M +4 -0 src/project/jobs/jobmanager.h M +3 -1 src/project/jobs/proxyclipjob.cpp http://commits.kde.org/kdenlive/d52d16923d3f794335544669db20d35d75913d55 diff --git a/src/bin/bin.cpp b/src/bin/bin.cpp index c6ce2d8..d5d8f78 100644 --- a/src/bin/bin.cpp +++ b/src/bin/bin.cpp @@ -444,8 +444,11 @@ Bin::Bin(QWidget* parent) : m_cancelJobs->setCheckable(false); m_discardCurrentClipJobs =3D new QAction(i18n("Cancel Current Clip Job= s"), this); m_discardCurrentClipJobs->setCheckable(false); + m_discardPendingJobs =3D new QAction(i18n("Cancel Pending Jobs"), this= ); + m_discardPendingJobs->setCheckable(false); m_jobsMenu->addAction(m_cancelJobs); m_jobsMenu->addAction(m_discardCurrentClipJobs); + m_jobsMenu->addAction(m_discardPendingJobs); m_infoLabel->setMenu(m_jobsMenu); m_infoLabel->setAction(infoAction); = @@ -977,6 +980,7 @@ void Bin::setDocument(KdenliveDoc* project) connect(m_jobManager, SIGNAL(jobCount(int)), m_infoLabel, SLOT(slotSet= JobCount(int))); connect(m_discardCurrentClipJobs, SIGNAL(triggered()), m_jobManager, S= LOT(slotDiscardClipJobs())); connect(m_cancelJobs, SIGNAL(triggered()), m_jobManager, SLOT(slotCanc= elJobs())); + connect(m_discardPendingJobs, SIGNAL(triggered()), m_jobManager, SLOT(= slotCancelPendingJobs())); connect(m_jobManager, SIGNAL(updateJobStatus(QString,int,int,QString,Q= String,QString)), this, SLOT(slotUpdateJobStatus(QString,int,int,QString,QS= tring,QString))); = connect(m_jobManager, SIGNAL(gotFilterJobResults(QString,int,int,strin= gMap,stringMap)), this, SLOT(slotGotFilterJobResults(QString,int,int,string= Map,stringMap))); @@ -2092,11 +2096,12 @@ void Bin::slotShowJobLog() d.exec(); } = -void Bin::gotProxy(const QString &id) +void Bin::gotProxy(const QString &id, const QString &path) { ProjectClip *clip =3D m_rootFolder->clip(id); if (clip) { QDomDocument doc; + clip->setProducerProperty(QStringLiteral("kdenlive:proxy"), path); QDomElement xml =3D clip->toXml(doc, true); if (!xml.isNull()) m_doc->getFileProperties(xml, id, 150, true); } diff --git a/src/bin/bin.h b/src/bin/bin.h index b5dd303..19c4b16 100644 --- a/src/bin/bin.h +++ b/src/bin/bin.h @@ -426,7 +426,7 @@ public: const QString getDocumentProperty(const QString &key); = /** @brief A proxy clip was just created, pass it to the responsible i= tem */ - void gotProxy(const QString &id); + void gotProxy(const QString &id, const QString &path); = /** @brief Get the document's renderer frame size */ const QSize getRenderSize(); @@ -693,6 +693,7 @@ private: QMenu *m_jobsMenu; QAction *m_cancelJobs; QAction *m_discardCurrentClipJobs; + QAction *m_discardPendingJobs; SmallJobLabel *m_infoLabel; /** @brief The info widget for failed jobs. */ BinMessageWidget *m_infoMessage; diff --git a/src/project/jobs/jobmanager.cpp b/src/project/jobs/jobmanager.= cpp index eadb240..2130ec5 100644 --- a/src/project/jobs/jobmanager.cpp +++ b/src/project/jobs/jobmanager.cpp @@ -90,6 +90,7 @@ void JobManager::discardJobs(const QString &id, AbstractC= lipJob::JOBTYPE type) m_jobList.at(i)->setStatus(JobAborted); } } + updateJobCount(); } = bool JobManager::hasPendingJob(const QString &clipId, AbstractClipJob::JOB= TYPE type) @@ -121,40 +122,47 @@ void JobManager::slotCheckJobProcess() m_jobMutex.lock(); int count =3D 0; for (int i =3D 0; i < m_jobList.count(); ++i) { - if (m_jobList.at(i)->status() =3D=3D JobWorking || m_jobList.at(i)= ->status() =3D=3D JobWaiting) + if (m_jobList.at(i)->status() =3D=3D JobWorking || m_jobList.at(i)= ->status() =3D=3D JobWaiting) { count ++; - else { + } else { // remove finished jobs AbstractClipJob *job =3D m_jobList.takeAt(i); job->deleteLater(); --i; } } - emit jobCount(count); m_jobMutex.unlock(); + emit jobCount(count); if (m_jobThreads.futures().isEmpty() || m_jobThreads.futures().count()= < KdenliveSettings::proxythreads()) m_jobThreads.addFuture(QtConcurrent::r= un(this, &JobManager::slotProcessJobs)); } = +void JobManager::updateJobCount() +{ + int count =3D 0; + for (int i =3D 0; i < m_jobList.count(); ++i) { + if (m_jobList.at(i)->status() =3D=3D JobWaiting || m_jobList.at(i)= ->status() =3D=3D JobWorking) + count ++; + } + // Set jobs count + emit jobCount(count); +} = void JobManager::slotProcessJobs() { while (!m_jobList.isEmpty() && !m_abortAllJobs) { AbstractClipJob *job =3D NULL; - int count =3D 0; m_jobMutex.lock(); - for (int i =3D 0; i < m_jobList.count(); ++i) { + int i =3D 0; + for (; i < m_jobList.count(); ++i) { if (m_jobList.at(i)->status() =3D=3D JobWaiting) { - if (job =3D=3D NULL) { - m_jobList.at(i)->setStatus(JobWorking); - job =3D m_jobList.at(i); - } - count++; + job =3D m_jobList.at(i); + job->setStatus(JobWorking); + break; } - else if (m_jobList.at(i)->status() =3D=3D JobWorking) - count ++; } - // Set jobs count - emit jobCount(count); + if (i > 0) { + updateJobCount(); + } m_jobMutex.unlock(); = if (job =3D=3D NULL) { @@ -163,7 +171,6 @@ void JobManager::slotProcessJobs() QString destination =3D job->destination(); // Check if the clip is still here ProjectClip *currentClip =3D m_bin->getBinClip(job->clipId()); - //ProjectItem *processingItem =3D getItemById(job->clipId()); if (currentClip =3D=3D NULL) { job->setStatus(JobDone); continue; @@ -193,7 +200,7 @@ void JobManager::slotProcessJobs() emit updateJobStatus(job->clipId(), job->jobType, JobDone); //TODO: replace with more generic clip replacement framework if (job->jobType =3D=3D AbstractClipJob::PROXYJOB) { - m_bin->gotProxy(job->clipId()); + m_bin->gotProxy(job->clipId(), destination); } if (job->addClipToProject()) { emit addClip(destination); @@ -268,7 +275,9 @@ void JobManager::launchJob(ProjectClip *clip, AbstractC= lipJob *job, bool runQueu = m_jobList.append(job); clip->setJobStatus(job->jobType, JobWaiting, 0, job->statusMessage()); - if (runQueue) slotCheckJobProcess(); + if (runQueue) { + slotCheckJobProcess(); + } } = void JobManager::slotDiscardClipJobs() @@ -284,6 +293,18 @@ void JobManager::slotDiscardClipJobs() discardJobs(id); } = +void JobManager::slotCancelPendingJobs() +{ + QMutexLocker lock(&m_jobMutex); + for (int i =3D 0; i < m_jobList.count(); ++i) { + if (m_jobList.at(i)->status() =3D=3D JobWaiting) { + // discard this job + m_jobList.at(i)->setStatus(JobAborted); + } + } + updateJobCount(); +} + void JobManager::slotCancelJobs() { m_abortAllJobs =3D true; @@ -292,7 +313,7 @@ void JobManager::slotCancelJobs() } m_jobThreads.waitForFinished(); m_jobThreads.clearFutures(); - = + //TODO: undo job cancelation ? not sure it's necessary /*QUndoCommand *command =3D new QUndoCommand(); command->setText(i18np("Cancel job", "Cancel jobs", m_jobList.count())= ); diff --git a/src/project/jobs/jobmanager.h b/src/project/jobs/jobmanager.h index d8fab81..ebc51e5 100644 --- a/src/project/jobs/jobmanager.h +++ b/src/project/jobs/jobmanager.h @@ -103,6 +103,8 @@ public slots: void slotDiscardClipJobs(); /** @brief Discard all running jobs. */ void slotCancelJobs(); + /** @brief Discard all pending jobs. */ + void slotCancelPendingJobs(); = private: /** @brief A pointer to the project's bin. */ @@ -117,6 +119,8 @@ private: bool m_abortAllJobs; /** @brief Create a proxy for a clip. */ void createProxy(const QString &id); + /** @brief Update job count in info widget. */ + void updateJobCount(); = signals: void addClip(const QString); diff --git a/src/project/jobs/proxyclipjob.cpp b/src/project/jobs/proxyclip= job.cpp index 2aabd74..d702b25 100644 --- a/src/project/jobs/proxyclipjob.cpp +++ b/src/project/jobs/proxyclipjob.cpp @@ -288,10 +288,12 @@ QHash ProxyJob::pr= epareJob(Bin *bin, QList

setJobStatus(AbstractClipJob::PROXYJOB, JobCrashed, -1, = i18n("Failed to create proxy, empty path.")); continue; } + // Reset proxy path until it is really created + item->setProducerProperty(QStringLiteral("kdenlive:proxy"), QStrin= g()); if (QFileInfo(path).size() > 0) { // Proxy already created item->setJobStatus(AbstractClipJob::PROXYJOB, JobDone); - bin->gotProxy(id); + bin->gotProxy(id, path); continue; } QString sourcePath =3D item->url().toLocalFile();