From: Jean-Baptiste Mardelle Date: Sat, 13 Dec 2008 14:55:09 +0000 (+0000) Subject: Cache timeline thumbnails for faster project opening, should solve: X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=010c83463c93a1cbf2658cced5d93b6d49a38bbc;p=kdenlive Cache timeline thumbnails for faster project opening, should solve: http://www.kdenlive.org:80/mantis/view.php?id=274 http://www.kdenlive.org:80/mantis/view.php?id=275 svn path=/branches/KDE4/; revision=2784 --- diff --git a/src/clipitem.cpp b/src/clipitem.cpp index dcff6614..b270a8c7 100644 --- a/src/clipitem.cpp +++ b/src/clipitem.cpp @@ -427,14 +427,22 @@ void ClipItem::slotThumbReady(int frame, QPixmap pix) { } } -void ClipItem::slotSetStartThumb(QPixmap pix) { +void ClipItem::slotSetStartThumb(const QPixmap pix) { m_startPix = pix; } -void ClipItem::slotSetEndThumb(QPixmap pix) { +void ClipItem::slotSetEndThumb(const QPixmap pix) { m_endPix = pix; } +QPixmap ClipItem::startThumb() const { + return m_startPix; +} + +QPixmap ClipItem::endThumb() const { + return m_endPix; +} + void ClipItem::slotGotAudioData() { audioThumbReady = true; if (m_clipType == AV) { diff --git a/src/clipitem.h b/src/clipitem.h index a17bf785..98bd1c01 100644 --- a/src/clipitem.h +++ b/src/clipitem.h @@ -101,6 +101,8 @@ public: GenTime cropDuration() const; int hasEffect(const QString &tag, const QString &id) const; bool checkKeyFrames(); + QPixmap startThumb() const; + QPixmap endThumb() const; protected: //virtual void mouseMoveEvent(QGraphicsSceneMouseEvent * event); @@ -157,10 +159,12 @@ private slots: void animate(qreal value); void slotSetStartThumb(QImage img); void slotSetEndThumb(QImage img); - void slotSetStartThumb(QPixmap pix); - void slotSetEndThumb(QPixmap pix); void slotThumbReady(int frame, QPixmap pix); +public slots: + void slotSetStartThumb(const QPixmap pix); + void slotSetEndThumb(const QPixmap pix); + signals: void getThumb(int, int); void prepareAudioThumb(double, int, int, int); diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index 1699aaa7..78c0ca31 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -1374,7 +1374,7 @@ void CustomTrackView::addTrack(TrackInfo type, int ix) { setSceneRect(0, 0, sceneRect().width(), m_tracksHeight * m_document->tracksCount()); verticalScrollBar()->setMaximum(m_tracksHeight * m_document->tracksCount()); QTimer::singleShot(300, this, SIGNAL(trackHeightChanged())); - viewport()->update(); + //setFixedHeight(50 * m_tracksCount); } @@ -2781,15 +2781,76 @@ void CustomTrackView::slotUpdateAllThumbs() { QList itemList = items(); //if (itemList.isEmpty()) return; ClipItem *item; + QString thumbBase = m_document->projectFolder().path() + "/thumbs/"; for (int i = 0; i < itemList.count(); i++) { if (itemList.at(i)->type() == AVWIDGET) { item = static_cast (itemList.at(i)); + if (item->clipType() != COLOR) { + // Check if we have a cached thumbnail + if (item->clipType() == IMAGE || item->clipType() == TEXT || item->clipType() == AUDIO) { + QString thumb = thumbBase + item->baseClip()->getClipHash() + "_0.png"; + if (QFile::exists(thumb)) { + QPixmap pix(thumb); + item->slotSetStartThumb(pix); + item->slotSetEndThumb(pix); + } + } else { + QString startThumb = thumbBase + item->baseClip()->getClipHash() + '_'; + QString endThumb = startThumb; + startThumb.append(QString::number(item->cropStart().frames(m_document->fps())) + ".png"); + endThumb.append(QString::number((item->cropStart() + item->cropDuration()).frames(m_document->fps()) - 1) + ".png"); + if (QFile::exists(startThumb)) { + QPixmap pix(startThumb); + item->slotSetStartThumb(pix); + } + if (QFile::exists(endThumb)) { + QPixmap pix(endThumb); + item->slotSetEndThumb(pix); + } + } + } item->refreshClip(); qApp->processEvents(); } } + viewport()->update(); } +void CustomTrackView::saveThumbnails() { + QList itemList = items(); + ClipItem *item; + QString thumbBase = m_document->projectFolder().path() + "/thumbs/"; + for (int i = 0; i < itemList.count(); i++) { + if (itemList.at(i)->type() == AVWIDGET) { + item = static_cast (itemList.at(i)); + if (item->clipType() != COLOR) { + // Check if we have a cached thumbnail + if (item->clipType() == IMAGE || item->clipType() == TEXT || item->clipType() == AUDIO) { + QString thumb = thumbBase + item->baseClip()->getClipHash() + "_0.png"; + if (!QFile::exists(thumb)) { + QPixmap pix(item->startThumb()); + pix.save(thumb); + } + } else { + QString startThumb = thumbBase + item->baseClip()->getClipHash() + '_'; + QString endThumb = startThumb; + startThumb.append(QString::number(item->cropStart().frames(m_document->fps())) + ".png"); + endThumb.append(QString::number((item->cropStart() + item->cropDuration()).frames(m_document->fps()) - 1) + ".png"); + if (!QFile::exists(startThumb)) { + QPixmap pix(item->startThumb()); + pix.save(startThumb); + } + if (!QFile::exists(endThumb)) { + QPixmap pix(item->endThumb()); + pix.save(endThumb); + } + } + } + } + } +} + + void CustomTrackView::slotInsertTrack(int ix) { kDebug() << "// INSERTING TRK: " << ix; QDialog d(parentWidget()); diff --git a/src/customtrackview.h b/src/customtrackview.h index 4df54f43..1608e47e 100644 --- a/src/customtrackview.h +++ b/src/customtrackview.h @@ -104,6 +104,7 @@ public: ClipItem *getActiveClipUnderCursor(bool allowOutsideCursor = false) const; void deleteTimelineTrack(int ix, TrackInfo trackinfo); void changeTimelineTrack(int ix, TrackInfo trackinfo); + void saveThumbnails(); public slots: void setCursorPos(int pos, bool seek = true); diff --git a/src/kdenlivedoc.cpp b/src/kdenlivedoc.cpp index 32814f36..c46fe5ac 100644 --- a/src/kdenlivedoc.cpp +++ b/src/kdenlivedoc.cpp @@ -1387,6 +1387,5 @@ void KdenliveDoc::cachePixmap(const QString &fileId, const QPixmap &pix) const { pix.save(m_projectFolder.path() + "/thumbs/" + fileId + ".png"); } - #include "kdenlivedoc.moc" diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index d7cd6a71..69c24e9d 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -988,6 +988,9 @@ bool MainWindow::saveFileAs(const QString &outputFileName) { QDomDocument currentSceneList = m_projectMonitor->sceneList(); if (m_activeDocument->saveSceneList(outputFileName, currentSceneList) == false) return false; + + // Save timeline thumbnails + m_activeTimeline->projectView()->saveThumbnails(); m_activeDocument->setUrl(KUrl(outputFileName)); if (m_activeDocument->m_autosave == NULL) { m_activeDocument->m_autosave = new KAutoSaveFile(KUrl(outputFileName), this);