From: Jean-Baptiste Mardelle Date: Sat, 13 Dec 2008 01:39:37 +0000 (+0000) Subject: Start caching of project tree thumbnails for faster project opening X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=db3a514547826b7d83b336f0bd93eed7c25c6b3c;p=kdenlive Start caching of project tree thumbnails for faster project opening svn path=/branches/KDE4/; revision=2780 --- diff --git a/src/docclipbase.cpp b/src/docclipbase.cpp index bc8c4d19..c5c64e2e 100644 --- a/src/docclipbase.cpp +++ b/src/docclipbase.cpp @@ -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") { diff --git a/src/docclipbase.h b/src/docclipbase.h index bc850231..8e83242e 100644 --- a/src/docclipbase.h +++ b/src/docclipbase.h @@ -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 */ diff --git a/src/kdenlivedoc.cpp b/src/kdenlivedoc.cpp index 816f7b36..77899a60 100644 --- a/src/kdenlivedoc.cpp +++ b/src/kdenlivedoc.cpp @@ -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" diff --git a/src/kdenlivedoc.h b/src/kdenlivedoc.h index 774838a9..66693c23 100644 --- a/src/kdenlivedoc.h +++ b/src/kdenlivedoc.h @@ -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&); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index f4f28149..dd160b45 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -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 &))); diff --git a/src/projectitem.cpp b/src/projectitem.cpp index 3e79b65c..fe25876e 100644 --- a/src/projectitem.cpp +++ b/src/projectitem.cpp @@ -133,6 +133,11 @@ void ProjectItem::setProperties(QMap 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); diff --git a/src/projectitem.h b/src/projectitem.h index d71500b1..fc396115 100644 --- a/src/projectitem.h +++ b/src/projectitem.h @@ -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; diff --git a/src/projectlist.cpp b/src/projectlist.cpp index 17b247da..0bdbba1b 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -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: "<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) { diff --git a/src/projectlist.h b/src/projectlist.h index 8f2984dc..759ac857 100644 --- a/src/projectlist.h +++ b/src/projectlist.h @@ -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);