]> git.sesse.net Git - kdenlive/commitdiff
Start caching of project tree thumbnails for faster project opening
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 13 Dec 2008 01:39:37 +0000 (01:39 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 13 Dec 2008 01:39:37 +0000 (01:39 +0000)
svn path=/branches/KDE4/; revision=2780

src/docclipbase.cpp
src/docclipbase.h
src/kdenlivedoc.cpp
src/kdenlivedoc.h
src/mainwindow.cpp
src/projectitem.cpp
src/projectitem.h
src/projectlist.cpp
src/projectlist.h

index bc8c4d193b8a57fdc8b3291d86840c6a51882691..c5c64e2eeaebad58b75ecd7cb293b61cb2278691 100644 (file)
@@ -548,6 +548,14 @@ void DocClipBase::getFileHash(const QString &url) {
     }
 }
 
+QString DocClipBase::getClipHash() const {
+    QString hash;
+    if (m_clipType == SLIDESHOW) hash = QCryptographicHash::hash(m_properties.value("resource").toAscii().data(), QCryptographicHash::Md5);
+    else if (m_clipType == COLOR) hash = QCryptographicHash::hash(m_properties.value("colour").toAscii().data(), QCryptographicHash::Md5);
+    else hash = m_properties.value("file_hash");
+    return hash;
+}
+
 void DocClipBase::setProperty(const QString &key, const QString &value) {
     m_properties.insert(key, value);
     if (key == "resource") {
index bc850231e23cf2ccb81f41ac633996c2bf147cd9..8e83242e9e43753d4ba81a32d969704a88aa017e 100644 (file)
@@ -113,34 +113,11 @@ Q_OBJECT public:
     void setProducer(Mlt::Producer *producer);
     Mlt::Producer *producer(int track = -1);
 
-    /*virtual DocClipAVFile *toDocClipAVFile() {
-    return 0;
-    }
-
-    virtual DocClipTextFile *toDocClipTextFile() {
-        return 0;
-    }
-
-    virtual bool isDocClipTextFile() const {
-        return false;
-    }
-
-    virtual bool isDocClipVirtual() const {
-        return false;
-    }
-
-    virtual DocClipVirtual *toDocClipVirtual() {
-        return 0;
-    }*/
-
     /** Returns true if this clip is a project clip, false otherwise. Overridden in DocClipProject,
      * where it returns true. */
     bool isProjectClip() const {
         return false;
     }
-    // Appends scene times for this clip to the passed vector.
-    /* virtual void populateSceneTimes(QList < GenTime >
-     &toPopulate) const = 0;*/
 
     /** Reads in the element structure and creates a clip out of it.*/
     // Returns an XML document that describes part of the current scene.
@@ -188,6 +165,7 @@ Q_OBJECT public:
     /** Free cache data */
     void slotClearAudioCache();
     void askForAudioThumbs();
+    QString getClipHash() const;
 
 private:   // Private attributes
     /** The name of this clip */
index 816f7b368425a135d61e69e1b1082d90f47caf06..77899a60e334f0aea8e280e4f54ad5bf01ac6e67 100644 (file)
@@ -169,7 +169,6 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup
     if (m_fps == 30000.0 / 1001.0) m_timecode.setFormat(30, true);
     else m_timecode.setFormat((int) m_fps);
 
-
     connect(m_autoSaveTimer, SIGNAL(timeout()), this, SLOT(slotAutoSave()));
 }
 
@@ -1195,7 +1194,7 @@ void KdenliveDoc::addClipInfo(QDomElement elem, QString clipId) {
             kDebug() << attrname << " = " << attributes.item(i).nodeValue();
         }
         clip->setProperties(properties);
-        emit addProjectClip(clip);
+        emit addProjectClip(clip, false);
     }
 }
 
@@ -1348,5 +1347,10 @@ QString KdenliveDoc::getTracksInfo() const {
     return result;
 }
 
+void KdenliveDoc::cachePixmap(const QString &fileId, const QPixmap &pix) const {
+    pix.save(m_projectFolder.path() + "/thumbs/" + fileId + ".png");
+}
+
+
 #include "kdenlivedoc.moc"
 
index 774838a9dbf30b58de6362ba8ab45075b4088f06..66693c235b1764141083bf12d82fd0d2bb284b5d 100644 (file)
@@ -115,6 +115,7 @@ Q_OBJECT public:
     QString getTracksInfo() const;
     void switchTrackVideo(int ix, bool hide);
     void switchTrackAudio(int ix, bool hide);
+    void cachePixmap(const QString &fileId, const QPixmap &pix) const;
 
 private:
     KUrl m_url;
@@ -160,7 +161,7 @@ private slots:
     void slotAutoSave();
 
 signals:
-    void addProjectClip(DocClipBase *);
+    void addProjectClip(DocClipBase *, bool getInfo = true);
     void addProjectFolder(const QString, const QString &, bool, bool edit = false);
     void signalDeleteProjectClip(const QString &);
     void updateClipDisplay(const QString&);
index f4f28149768b730e04ca44d0fb8d70ff472059d8..dd160b45692feeea401ec6586fb49d63644db2f9 100644 (file)
@@ -1312,7 +1312,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) { //cha
 
 
             disconnect(m_activeDocument, SIGNAL(guidesUpdated()), this, SLOT(slotGuidesUpdated()));
-            disconnect(m_activeDocument, SIGNAL(addProjectClip(DocClipBase *)), m_projectList, SLOT(slotAddClip(DocClipBase *)));
+            disconnect(m_activeDocument, SIGNAL(addProjectClip(DocClipBase *, bool)), m_projectList, SLOT(slotAddClip(DocClipBase *, bool)));
             disconnect(m_activeDocument, SIGNAL(addProjectFolder(const QString, const QString &, bool, bool)), m_projectList, SLOT(slotAddFolder(const QString, const QString &, bool, bool)));
             disconnect(m_activeDocument, SIGNAL(signalDeleteProjectClip(const QString &)), m_projectList, SLOT(slotDeleteClip(const QString &)));
             disconnect(m_activeDocument, SIGNAL(updateClipDisplay(const QString &)), m_projectList, SLOT(slotUpdateClip(const QString &)));
@@ -1364,7 +1364,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) { //cha
     connect(m_projectMonitor, SIGNAL(renderPosition(int)), trackView, SLOT(moveCursorPos(int)));
     connect(m_projectMonitor, SIGNAL(zoneUpdated(QPoint)), trackView, SLOT(slotSetZone(QPoint)));
     connect(m_projectMonitor, SIGNAL(durationChanged(int)), trackView, SLOT(setDuration(int)));
-    connect(doc, SIGNAL(addProjectClip(DocClipBase *)), m_projectList, SLOT(slotAddClip(DocClipBase *)));
+    connect(doc, SIGNAL(addProjectClip(DocClipBase *, bool)), m_projectList, SLOT(slotAddClip(DocClipBase *, bool)));
     connect(doc, SIGNAL(addProjectFolder(const QString, const QString &, bool, bool)), m_projectList, SLOT(slotAddFolder(const QString, const QString &, bool, bool)));
     connect(doc, SIGNAL(signalDeleteProjectClip(const QString &)), m_projectList, SLOT(slotDeleteClip(const QString &)));
     connect(doc, SIGNAL(updateClipDisplay(const QString &)), m_projectList, SLOT(slotUpdateClip(const QString &)));
index 3e79b65c23e0596554a90704a68035e3824e0fc8..fe25876e06be04a49dfe879cb8114e1e89f21d9d 100644 (file)
@@ -133,6 +133,11 @@ void ProjectItem::setProperties(QMap <QString, QString> props) {
     m_clip->setProperties(props);
 }
 
+QString ProjectItem::getClipHash() const {
+    if (m_clip == NULL) return QString();
+    return m_clip->getClipHash();
+}
+
 void ProjectItem::setProperty(const QString &key, const QString &value) {
     if (m_clip == NULL) return;
     m_clip->setProperty(key, value);
index d71500b1ea01a2f570df9267387f771488e5ac0f..fc396115575efbd86868da560ade8645751ee019 100644 (file)
@@ -63,6 +63,7 @@ public:
     void clearProperty(const QString &key);
     const QString groupName() const;
     void setGroupName(const QString name);
+    QString getClipHash() const;
 
 private:
     QString m_groupname;
index 17b247dae712ad9e0e05af37e2153f144670a1f6..0bdbba1b97a9808fcb8ae7501808fd57da1e2ecd 100644 (file)
@@ -360,6 +360,7 @@ void ProjectList::slotAddClip(DocClipBase *clip, bool getProperties) {
 }
 
 void ProjectList::requestClipInfo(const QDomElement xml, const QString id) {
+    kDebug() << " PRG LIST REQUEST CLP INFO: " << id;
     m_infoQueue.insert(id, xml);
     listView->setEnabled(false);
     if (m_infoQueue.count() == 1) QTimer::singleShot(300, this, SLOT(slotProcessNextClipInQueue()));
@@ -404,7 +405,11 @@ void ProjectList::updateAllClips() {
                 }
                 requestClipInfo(clip->toXML(), clip->getId());
             } else {
-                requestClipThumbnail(item->clipId());
+                QString cachedPixmap = m_doc->projectFolder().path() + "/thumbs/" + item->getClipHash() + ".png";
+                if (QFile::exists(cachedPixmap)) {
+                    //kDebug()<<"// USING CACHED PIX: "<<cachedPixmap;
+                    item->setIcon(0, QPixmap(cachedPixmap));
+                } else requestClipThumbnail(item->clipId());
                 item->changeDuration(item->referencedClip()->producer()->get_playtime());
             }
             item->setData(1, UsageRole, QString::number(item->numReferences()));
@@ -598,6 +603,7 @@ void ProjectList::slotRefreshClipThumbnail(ProjectItem *item, bool update) {
         if (clip->clipType() == AUDIO) pix = KIcon("audio-x-generic").pixmap(QSize(width, height));
         else pix = item->referencedClip()->thumbProducer()->extractImage(item->referencedClip()->getClipThumbFrame(), width, height);
         item->setIcon(0, pix);
+        m_doc->cachePixmap(item->getClipHash(), pix);
         if (update) emit projectModified();
         if (!m_thumbnailQueue.isEmpty()) QTimer::singleShot(300, this, SLOT(slotProcessNextThumbnail()));
     }
@@ -615,7 +621,10 @@ void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Produce
 
 void ProjectList::slotReplyGetImage(const QString &clipId, int pos, const QPixmap &pix, int w, int h) {
     ProjectItem *item = getItemById(clipId);
-    if (item) item->setIcon(0, pix);
+    if (item) {
+        item->setIcon(0, pix);
+        m_doc->cachePixmap(item->getClipHash(), pix);
+    }
 }
 
 ProjectItem *ProjectList::getItemById(const QString &id) {
index 8f2984dc08c2d1e1c80c1660545b5fc1d7b761d1..759ac857bbccd7c99b40dd13f5a3626842566160 100644 (file)
@@ -117,7 +117,7 @@ public slots:
     void setDocument(KdenliveDoc *doc);
     void slotReplyGetImage(const QString &clipId, int pos, const QPixmap &pix, int w, int h);
     void slotReplyGetFileProperties(const QString &clipId, Mlt::Producer *producer, const QMap < QString, QString > &properties, const QMap < QString, QString > &metadata);
-    void slotAddClip(DocClipBase *clip, bool getProperties = true);
+    void slotAddClip(DocClipBase *clip, bool getProperties);
     void slotDeleteClip(const QString &clipId);
     void slotUpdateClip(const QString &id);
     void slotRefreshClipThumbnail(const QString &clipId, bool update = true);