]> git.sesse.net Git - kdenlive/commitdiff
Cache timeline thumbnails for faster project opening, should solve:
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 13 Dec 2008 14:55:09 +0000 (14:55 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 13 Dec 2008 14:55:09 +0000 (14:55 +0000)
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

src/clipitem.cpp
src/clipitem.h
src/customtrackview.cpp
src/customtrackview.h
src/kdenlivedoc.cpp
src/mainwindow.cpp

index dcff6614a45e25e0f5f52085b9c8f9e90b50448c..b270a8c7c0f878b8e671708437baceab76586142 100644 (file)
@@ -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) {
index a17bf785bf2122d42fc6c28861f601e221c3c5a0..98bd1c010df6760dc38ccd132b0b686407d31098 100644 (file)
@@ -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);
index 1699aaa7662afe7746b4c76bbd7b959709d3842f..78c0ca31c8a6d911c02019eb2c92681994e4293a 100644 (file)
@@ -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<QGraphicsItem *> 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 <ClipItem *>(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<QGraphicsItem *> 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 <ClipItem *>(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());
index 4df54f43e974ae01466d9662d5a5390dfa3b4f18..1608e47e579c9b580e9406ecc6105fdb166a6623 100644 (file)
@@ -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);
index 32814f369b8ce35533dbae7e3ff13d5d12fd396d..c46fe5acd3b6fe5a194846fb0fb44e8a3a7e1305 100644 (file)
@@ -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"
 
index d7cd6a71d4f0f12eea39e3a7f82dc3b874a44c19..69c24e9dce2897faf7846e4cbfeabf079ed864cc 100644 (file)
@@ -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);