]> git.sesse.net Git - kdenlive/commitdiff
Proxy: fix unnecessary reload on document load, use nicer graphics for progress and...
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 19 Dec 2011 00:02:01 +0000 (01:02 +0100)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 19 Dec 2011 00:02:01 +0000 (01:02 +0100)
src/projectitem.cpp
src/projectlist.cpp
src/projectlist.h
src/renderer.cpp

index d0b9999ec99b11dbc1fd9cdf2803d3d4535d8e68..4767f705231dd98c8b8a0b83d15c0e3d7dbe0d10 100644 (file)
@@ -165,8 +165,15 @@ DocClipBase *ProjectItem::referencedClip()
 
 void ProjectItem::slotSetToolTip()
 {
-    QString tip = "<b>";
+    QString tip;
     if (m_clip->isPlaceHolder()) tip.append(i18n("Missing") + " | ");
+    if (isProxyRunning()) {
+        tip.append(i18n("Building proxy clip") + " | ");
+    }
+    else if (hasProxy()) {
+        tip.append(i18n("Proxy clip") + " | ");
+    }
+    tip.append("<b>");
     switch (m_clipType) {
     case AUDIO:
         tip.append(i18n("Audio clip") + "</b><br />" + clipUrl().path());
@@ -200,7 +207,6 @@ void ProjectItem::slotSetToolTip()
         tip.append(i18n("Unknown clip"));
         break;
     }
-
     setToolTip(0, tip);
 }
 
@@ -256,7 +262,10 @@ void ProjectItem::setProperties(const QMap < QString, QString > &attributes, con
 void ProjectItem::setProxyStatus(PROXYSTATUS status, int progress)
 {
     if (progress > 0) setData(0, ProxyRole, progress);
-    else setData(0, ProxyRole, status);
+    else {
+        setData(0, ProxyRole, status);
+        slotSetToolTip();
+    }
 }
 
 bool ProjectItem::hasProxy() const
index 1a25cf3d7beff7871f39738f8bffb50ffb380320..47d89c7f7c5eba8f8f26b7c1c2460f3285fb4a7a 100644 (file)
@@ -1115,8 +1115,6 @@ void ProjectList::slotAddClip(DocClipBase *clip, bool getProperties)
         item = new ProjectItem(m_listView, clip);
     }
     if (item->data(0, DurationRole).isNull()) item->setData(0, DurationRole, i18n("Loading"));
-    QString proxy = clip->getProperty("proxy");
-    if (!proxy.isEmpty() && proxy != "-") slotCreateProxy(clip->getId());
     connect(clip, SIGNAL(createProxy(const QString &)), this, SLOT(slotCreateProxy(const QString &)));
     connect(clip, SIGNAL(abortProxy(const QString &, const QString &)), this, SLOT(slotAbortProxy(const QString, const QString)));
     if (getProperties) {
@@ -1131,9 +1129,10 @@ void ProjectList::slotAddClip(DocClipBase *clip, bool getProperties)
         resetThumbsProducer(clip);
         m_render->getFileProperties(e, clip->getId(), m_listView->iconSize().height(), true);
     }
-    else if (item->hasProxy() && !item->isProxyRunning()) {
+    // WARNING: code below triggers unnecessary reload of all proxy clips on document loading... is it useful in some cases?
+    /*else if (item->hasProxy() && !item->isProxyRunning()) {
         slotCreateProxy(clip->getId());
-    }
+    }*/
     
     KUrl url = clip->fileURL();
 #ifdef NEPOMUK
@@ -1249,7 +1248,10 @@ void ProjectList::getCachedThumbnail(ProjectItem *item)
             KIO::NetAccess::del(KUrl(cachedPixmap), this);
             requestClipThumbnail(item->clipId());
         }
-        else item->setData(0, Qt::DecorationRole, pix);
+        else {
+            processThumbOverlays(item, pix);
+            item->setData(0, Qt::DecorationRole, pix);
+        }
     }
     else {
         requestClipThumbnail(item->clipId());
@@ -1334,7 +1336,9 @@ void ProjectList::updateAllClips(bool displayRatioChanged, bool fpsChanged, QStr
                         xml.removeAttribute("proxy_out");
                     }
                     if (!replace) replace = xml.attribute("replace") == "1";
-                    if (replace) resetThumbsProducer(clip);
+                    if (replace) {
+                        resetThumbsProducer(clip);
+                    }
                     m_render->getFileProperties(xml, clip->getId(), m_listView->iconSize().height(), replace);
                 }
                 else if (clip->isPlaceHolder()) {
@@ -1351,8 +1355,9 @@ void ProjectList::updateAllClips(bool displayRatioChanged, bool fpsChanged, QStr
                     }
                 }
             } else {              
-                if (displayRatioChanged)
+                if (displayRatioChanged) {
                     requestClipThumbnail(clip->getId());
+                }
                 else if (item->data(0, Qt::DecorationRole).isNull()) {
                     getCachedThumbnail(item);
                 }
@@ -1818,7 +1823,10 @@ void ProjectList::slotRefreshClipThumbnail(QTreeWidgetItem *it, bool update)
 
         if (!pix.isNull() || !img.isNull()) {
             monitorItemEditing(false);
-            if (!img.isNull()) pix = QPixmap::fromImage(img);
+            if (!img.isNull()) {
+                pix = QPixmap::fromImage(img);
+                processThumbOverlays(item, pix);
+            }
             it->setData(0, Qt::DecorationRole, pix);
             monitorItemEditing(true);
             
@@ -2005,6 +2013,7 @@ void ProjectList::slotReplyGetImage(const QString &clipId, const QImage &img)
     ProjectItem *item = getItemById(clipId);
     if (item && !img.isNull()) {
         QPixmap pix = QPixmap::fromImage(img);
+        processThumbOverlays(item, pix);
         monitorItemEditing(false);
         item->setData(0, Qt::DecorationRole, pix);
         monitorItemEditing(true);
@@ -2869,4 +2878,20 @@ QStringList ProjectList::expandedFolders() const
     return result;
 }
 
+void ProjectList::processThumbOverlays(ProjectItem *item, QPixmap &pix)
+{
+    if (item->hasProxy()) {
+        QPainter p(&pix);
+        QColor c = QPalette().base().color();
+        c.setAlpha(160);
+        QBrush br(c);
+        p.setBrush(br);
+        p.setPen(Qt::NoPen);
+        QRect r(1, 1, 10, 10);
+        p.drawRect(r);
+        p.setPen(QPalette().text().color());
+        p.drawText(r, Qt::AlignCenter, i18nc("The first letter of Proxy, used as abbreviation", "P"));
+    }
+}
+
 #include "projectlist.moc"
index 594d59be72cecaba9a246e8b5a98371699932f2c..8236cfdd99a1e479adeabe0301146a99e6dfdf3e 100644 (file)
@@ -91,7 +91,7 @@ class ItemDelegate: public QStyledItemDelegate
 public:
     ItemDelegate(QAbstractItemView* parent = 0): QStyledItemDelegate(parent) {
     }
-
+    
     /*void drawFocus(QPainter *, const QStyleOptionViewItem &, const QRect &) const {
     }*/
 
@@ -108,7 +108,8 @@ public:
             }
             const int textMargin = style->pixelMetric(QStyle::PM_FocusFrameHMargin) + 1;
             QPixmap pixmap = qVariantValue<QPixmap>(index.data(Qt::DecorationRole));
-            painter->drawPixmap(r1.left() + textMargin, r1.top() + (r1.height() - pixmap.height()) / 2, pixmap);
+            QPoint pixmapPoint(r1.left() + textMargin, r1.top() + (r1.height() - pixmap.height()) / 2);
+            painter->drawPixmap(pixmapPoint, pixmap);
             int decoWidth = pixmap.width() + 2 * textMargin;
 
             QFont font = painter->font();
@@ -118,7 +119,7 @@ public:
             r1.adjust(decoWidth, 0, 0, -mid);
             QRect r2 = option.rect;
             r2.adjust(decoWidth, mid, 0, 0);
-            painter->drawText(r1, Qt::AlignLeft | Qt::AlignBottom , index.data().toString());
+            painter->drawText(r1, Qt::AlignLeft | Qt::AlignBottom, index.data().toString());
             font.setBold(false);
             painter->setFont(font);
             QString subText = index.data(DurationRole).toString();
@@ -129,21 +130,21 @@ public:
             painter->drawText(r2, Qt::AlignLeft | Qt::AlignVCenter , subText, &bounding);
             
             int proxy = index.data(Qt::UserRole + 5).toInt();
-            if (proxy != 0) {
-                QRectF txtBounding;
+            if (proxy != 0 && proxy != PROXYDONE) {
                 QString proxyText;
-                QBrush brush;
                 QColor color;
                 if (proxy > 0) {
-                    proxyText = i18n("Proxy %1\%", proxy);
-                    brush = option.palette.highlight();
-                    color = option.palette.color(QPalette::HighlightedText);
-                    
-                }
-                else if (proxy == PROXYDONE) {
-                    proxyText = i18n("Proxy");
-                    brush = option.palette.mid();
-                    color = option.palette.color(QPalette::WindowText);
+                    // Draw proxy progress bar
+                    color = option.palette.alternateBase().color();
+                    painter->setPen(Qt::NoPen);
+                    color.setAlpha(180);
+                    painter->setBrush(QBrush(color));
+                    QRect progress(pixmapPoint.x() + 1, pixmapPoint.y() + pixmap.height() - 5, pixmap.width() - 2, 4);
+                    painter->drawRect(progress);
+                    painter->setBrush(option.palette.text());
+                    progress.adjust(1, 1, 0, -1);
+                    progress.setWidth((pixmap.width() - 4) * proxy / 100);
+                    painter->drawRect(progress);
                 }
                 else {
                     switch (proxy)  {
@@ -157,16 +158,13 @@ public:
                         default:
                             proxyText = i18n("Proxy crashed");
                     }
-                    brush = option.palette.highlight();
-                    color = option.palette.color(QPalette::HighlightedText);
+                    QRectF txtBounding = painter->boundingRect(r2, Qt::AlignRight | Qt::AlignVCenter, " " + proxyText + " ");
+                    painter->setPen(Qt::NoPen);
+                    painter->setBrush(option.palette.highlight());
+                    painter->drawRoundedRect(txtBounding, 2, 2);
+                    painter->setPen(option.palette.highlightedText().color());
+                    painter->drawText(txtBounding, Qt::AlignHCenter | Qt::AlignVCenter , proxyText);
                 }
-               
-                txtBounding = painter->boundingRect(r2, Qt::AlignRight | Qt::AlignVCenter, " " + proxyText + " ");
-                painter->setPen(Qt::NoPen);
-                painter->setBrush(brush);
-                painter->drawRoundedRect(txtBounding, 2, 2);
-                painter->setPen(option.palette.highlightedText().color());
-                painter->drawText(txtBounding, Qt::AlignHCenter | Qt::AlignVCenter , proxyText);
             }
             
             painter->restore();
@@ -238,6 +236,8 @@ public:
     QStringList expandedFolders() const;
     /** @brief Deselect all clips in project tree. */
     void clearSelection();
+    /** @brief Print required overlays over clip thumb (proxy, stabilized,...). */
+    void processThumbOverlays(ProjectItem *item, QPixmap &pix);
 
 public slots:
     void setDocument(KdenliveDoc *doc);
index 72b8f46e428cb2f6a44103a9a933d83646c8d085..a0ff4312f8ad1c4e7cc738db423f71ca7ce26c43 100644 (file)
@@ -783,9 +783,9 @@ void Render::processFileProperties()
                 Mlt::Frame *frame = producer->get_frame();
                 if (frame && frame->is_valid()) {
                     QImage img = KThumb::getFrame(frame, imageWidth, fullWidth, info.imageHeight);
-                    delete frame;
                     emit replyGetImage(info.clipId, img);
                 }
+                if (frame) delete frame;
             }
             m_processingClipId.clear();
             emit replyGetFileProperties(info.clipId, producer, stringMap(), stringMap(), info.replaceProducer);