From 16e28d660e6c5754dbc5eb8a04d607285e749cd8 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Mon, 19 Dec 2011 01:02:01 +0100 Subject: [PATCH] Proxy: fix unnecessary reload on document load, use nicer graphics for progress and display --- src/projectitem.cpp | 15 +++++++++++--- src/projectlist.cpp | 41 ++++++++++++++++++++++++++++++-------- src/projectlist.h | 48 ++++++++++++++++++++++----------------------- src/renderer.cpp | 2 +- 4 files changed, 70 insertions(+), 36 deletions(-) diff --git a/src/projectitem.cpp b/src/projectitem.cpp index d0b9999e..4767f705 100644 --- a/src/projectitem.cpp +++ b/src/projectitem.cpp @@ -165,8 +165,15 @@ DocClipBase *ProjectItem::referencedClip() void ProjectItem::slotSetToolTip() { - QString tip = ""; + 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(""); switch (m_clipType) { case AUDIO: tip.append(i18n("Audio clip") + "
" + 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 diff --git a/src/projectlist.cpp b/src/projectlist.cpp index 1a25cf3d..47d89c7f 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -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" diff --git a/src/projectlist.h b/src/projectlist.h index 594d59be..8236cfdd 100644 --- a/src/projectlist.h +++ b/src/projectlist.h @@ -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(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); diff --git a/src/renderer.cpp b/src/renderer.cpp index 72b8f46e..a0ff4312 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -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); -- 2.39.2