[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kdenlive] src: Only set proxy on a clip when it is successfully created
From:       Jean-Baptiste Mardelle <jb () kdenlive ! org>
Date:       2016-06-30 22:33:02
Message-ID: E1bIkW6-0006lY-WC () code ! kde ! org
[Download RAW message or body]

Git commit d52d16923d3f794335544669db20d35d75913d55 by Jean-Baptiste Mardelle.
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 = new QAction(i18n("Cancel Current Clip Jobs"), this);
     m_discardCurrentClipJobs->setCheckable(false);
+    m_discardPendingJobs = 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(slotSetJobCount(int)));
     connect(m_discardCurrentClipJobs, SIGNAL(triggered()), m_jobManager, \
                SLOT(slotDiscardClipJobs()));
     connect(m_cancelJobs, SIGNAL(triggered()), m_jobManager, \
SLOT(slotCancelJobs())); +    connect(m_discardPendingJobs, SIGNAL(triggered()), \
m_jobManager, SLOT(slotCancelPendingJobs()));  connect(m_jobManager, \
SIGNAL(updateJobStatus(QString,int,int,QString,QString,QString)), this, \
SLOT(slotUpdateJobStatus(QString,int,int,QString,QString,QString)));  
     connect(m_jobManager, \
SIGNAL(gotFilterJobResults(QString,int,int,stringMap,stringMap)), this, \
SLOT(slotGotFilterJobResults(QString,int,int,stringMap,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 = m_rootFolder->clip(id);
     if (clip) {
         QDomDocument doc;
+        clip->setProducerProperty(QStringLiteral("kdenlive:proxy"), path);
         QDomElement xml = 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 item  */
-    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, \
AbstractClipJob::JOBTYPE type)  m_jobList.at(i)->setStatus(JobAborted);
         }
     }
+    updateJobCount();
 }
 
 bool JobManager::hasPendingJob(const QString &clipId, AbstractClipJob::JOBTYPE type)
@@ -121,40 +122,47 @@ void JobManager::slotCheckJobProcess()
     m_jobMutex.lock();
     int count = 0;
     for (int i = 0; i < m_jobList.count(); ++i) {
-        if (m_jobList.at(i)->status() == JobWorking || m_jobList.at(i)->status() == \
JobWaiting) +        if (m_jobList.at(i)->status() == JobWorking || \
m_jobList.at(i)->status() == JobWaiting) {  count ++;
-        else {
+        } else {
             // remove finished jobs
             AbstractClipJob *job = 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::run(this, \
&JobManager::slotProcessJobs));  }
 
+void JobManager::updateJobCount()
+{
+    int count = 0;
+    for (int i = 0; i < m_jobList.count(); ++i) {
+        if (m_jobList.at(i)->status() == JobWaiting || m_jobList.at(i)->status() == \
JobWorking) +            count ++;
+    }
+    // Set jobs count
+    emit jobCount(count);
+}
 
 void JobManager::slotProcessJobs()
 {
     while (!m_jobList.isEmpty() && !m_abortAllJobs) {
         AbstractClipJob *job = NULL;
-        int count = 0;
         m_jobMutex.lock();
-        for (int i = 0; i < m_jobList.count(); ++i) {
+        int i = 0;
+        for (; i < m_jobList.count(); ++i) {
             if (m_jobList.at(i)->status() == JobWaiting) {
-                if (job == NULL) {
-                    m_jobList.at(i)->setStatus(JobWorking);
-                    job = m_jobList.at(i);
-                }
-                count++;
+                job = m_jobList.at(i);
+                job->setStatus(JobWorking);
+                break;
             }
-            else if (m_jobList.at(i)->status() == JobWorking)
-                count ++;
         }
-        // Set jobs count
-        emit jobCount(count);
+        if (i > 0) {
+            updateJobCount();
+        }
         m_jobMutex.unlock();
 
         if (job == NULL) {
@@ -163,7 +171,6 @@ void JobManager::slotProcessJobs()
         QString destination = job->destination();
         // Check if the clip is still here
         ProjectClip *currentClip = m_bin->getBinClip(job->clipId());
-        //ProjectItem *processingItem = getItemById(job->clipId());
         if (currentClip == 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 == 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, AbstractClipJob \
*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 = 0; i < m_jobList.count(); ++i) {
+        if (m_jobList.at(i)->status() == JobWaiting) {
+            // discard this job
+            m_jobList.at(i)->setStatus(JobAborted);
+        }
+    }
+    updateJobCount();
+}
+
 void JobManager::slotCancelJobs()
 {
     m_abortAllJobs = 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 = 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/proxyclipjob.cpp
index 2aabd74..d702b25 100644
--- a/src/project/jobs/proxyclipjob.cpp
+++ b/src/project/jobs/proxyclipjob.cpp
@@ -288,10 +288,12 @@ QHash <ProjectClip *, AbstractClipJob *> \
                ProxyJob::prepareJob(Bin *bin, QList <P
             item->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"), QString());
         if (QFileInfo(path).size() > 0) {
             // Proxy already created
             item->setJobStatus(AbstractClipJob::PROXYJOB, JobDone);
-            bin->gotProxy(id);
+            bin->gotProxy(id, path);
             continue;
         }
         QString sourcePath = item->url().toLocalFile();


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic