]> git.sesse.net Git - kdenlive/blobdiff - src/projectitem.cpp
Small fixes to clip job progress bar
[kdenlive] / src / projectitem.cpp
index 4f6ab88a7e14d68ed2d41135e2f7e575dbdd6dc2..c26f5ce94b8f330be69914175ce0948c2cc336c3 100644 (file)
 #include <QFile>
 
 const int DurationRole = Qt::UserRole + 1;
-const int ProxyRole = Qt::UserRole + 5;
+const int JobProgressRole = Qt::UserRole + 5;
+const int JobTypeRole = Qt::UserRole + 6;
+const int JobStatusMessage = Qt::UserRole + 7;
 const int itemHeight = 38;
 
-ProjectItem::ProjectItem(QTreeWidget * parent, DocClipBase *clip) :
+ProjectItem::ProjectItem(QTreeWidget * parent, DocClipBase *clip, QSize pixmapSize) :
         QTreeWidgetItem(parent, PROJECTCLIPTYPE),
         m_clip(clip),
-        m_clipId(clip->getId())
+        m_clipId(clip->getId()),
+        m_pixmapSet(false)
 {
-    buildItem();
+    buildItem(pixmapSize);
 }
 
-ProjectItem::ProjectItem(QTreeWidgetItem * parent, DocClipBase *clip) :
+ProjectItem::ProjectItem(QTreeWidgetItem * parent, DocClipBase *clip, QSize pixmapSize) :
         QTreeWidgetItem(parent, PROJECTCLIPTYPE),
         m_clip(clip),
-        m_clipId(clip->getId())
+        m_clipId(clip->getId()),
+        m_pixmapSet(false)
         
 {
-    buildItem();
+    buildItem(pixmapSize);
 }
 
-void ProjectItem::buildItem()
+void ProjectItem::buildItem(QSize pixmapSize)
 {
     setSizeHint(0, QSize(itemHeight * 3, itemHeight));
     if (m_clip->isPlaceHolder()) setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDropEnabled);
@@ -58,6 +62,19 @@ void ProjectItem::buildItem()
     QString name = m_clip->getProperty("name");
     if (name.isEmpty()) name = KUrl(m_clip->getProperty("resource")).fileName();
     m_clipType = (CLIPTYPE) m_clip->getProperty("type").toInt();
+    switch(m_clipType) {
+       case AUDIO:
+           setData(0, Qt::DecorationRole, KIcon("audio-x-generic").pixmap(pixmapSize));
+           m_pixmapSet = true;
+           break;
+       case IMAGE:
+       case SLIDESHOW:
+           setData(0, Qt::DecorationRole, KIcon("image-x-generic").pixmap(pixmapSize));
+           break;
+       default:
+           setData(0, Qt::DecorationRole, KIcon("video-x-generic").pixmap(pixmapSize));
+    }
+    
     setText(0, name);
     setText(1, m_clip->description());
     GenTime duration = m_clip->duration();
@@ -78,6 +95,17 @@ ProjectItem::~ProjectItem()
 {
 }
 
+bool ProjectItem::hasPixmap() const
+{
+    return m_pixmapSet;
+}
+
+void ProjectItem::setPixmap(const QPixmap p)
+{
+    m_pixmapSet = true;
+    setData(0, Qt::DecorationRole, p);
+}
+
 //static
 int ProjectItem::itemDefaultHeight()
 {
@@ -105,15 +133,6 @@ int ProjectItem::clipMaxDuration() const
     return m_clip->getProperty("duration").toInt();
 }
 
-QStringList ProjectItem::names() const
-{
-    QStringList result;
-    result.append(text(0));
-    result.append(text(1));
-    result.append(text(2));
-    return result;
-}
-
 QDomElement ProjectItem::toXml() const
 {
     return m_clip->toXML();
@@ -165,8 +184,16 @@ DocClipBase *ProjectItem::referencedClip()
 
 void ProjectItem::slotSetToolTip()
 {
-    QString tip = "<b>";
+    QString tip;
     if (m_clip->isPlaceHolder()) tip.append(i18n("Missing") + " | ");
+    QString jobInfo = data(0, JobStatusMessage).toString();
+    if (!jobInfo.isEmpty()) {
+        tip.append(jobInfo + " | ");
+    }
+    if (hasProxy() && data(0, JobTypeRole).toInt() != PROXYJOB) {
+        tip.append(i18n("Proxy clip") + " | ");
+    }
+    tip.append("<b>");
     switch (m_clipType) {
     case AUDIO:
         tip.append(i18n("Audio clip") + "</b><br />" + clipUrl().path());
@@ -200,7 +227,6 @@ void ProjectItem::slotSetToolTip()
         tip.append(i18n("Unknown clip"));
         break;
     }
-
     setToolTip(0, tip);
 }
 
@@ -253,27 +279,48 @@ void ProjectItem::setProperties(const QMap < QString, QString > &attributes, con
     }
 }
 
-void ProjectItem::setProxyStatus(PROXYSTATUS status)
+void ProjectItem::setJobStatus(JOBTYPE jobType, CLIPJOBSTATUS status, int progress, const QString &statusMessage)
 {
-    setData(0, ProxyRole, status);
+    setData(0, JobTypeRole, jobType);
+    if (progress > 0) setData(0, JobProgressRole, qMin(100, progress));
+    else {
+        setData(0, JobProgressRole, status);
+        if ((status == JOBABORTED || status == JOBCRASHED  || status == JOBDONE) || !statusMessage.isEmpty())
+            setData(0, JobStatusMessage, statusMessage);
+        slotSetToolTip();
+    }
+}
+
+void ProjectItem::setConditionalJobStatus(CLIPJOBSTATUS status, JOBTYPE requestedJobType)
+{
+    if (data(0, JobTypeRole).toInt() == requestedJobType) {
+        setData(0, JobProgressRole, status);
+    }
 }
 
 bool ProjectItem::hasProxy() const
 {
     if (m_clip == NULL) return false;
-    if (m_clip->getProperty("proxy").isEmpty() || m_clip->getProperty("proxy") == "-" || data(0, ProxyRole).toInt() == PROXYCRASHED) return false;
+    if (m_clip->getProperty("proxy").size() < 2 || data(0, JobProgressRole).toInt() == JOBCRASHED) return false;
     return true;
 }
 
 bool ProjectItem::isProxyReady() const
 {
-     return (data(0, ProxyRole).toInt() == PROXYDONE);
+     return (data(0, JobProgressRole).toInt() == JOBDONE);
+}
+
+bool ProjectItem::isJobRunning() const
+{
+    int s = data(0, JobProgressRole).toInt();
+    if (s == JOBWAITING || s == JOBWORKING || s > 0) return true;
+    return false;
 }
 
 bool ProjectItem::isProxyRunning() const
 {
-    PROXYSTATUS s = (PROXYSTATUS) data(0, ProxyRole).toInt();
-    if (s == PROXYWAITING || s == CREATINGPROXY) return true;
+    int s = data(0, JobProgressRole).toInt();
+    if ((s == JOBWORKING || s > 0) && data(0, JobTypeRole).toInt() == (int) PROXYJOB) return true;
     return false;
 }