}
}
+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") {
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.
/** Free cache data */
void slotClearAudioCache();
void askForAudioThumbs();
+ QString getClipHash() const;
private: // Private attributes
/** The name of this clip */
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()));
}
kDebug() << attrname << " = " << attributes.item(i).nodeValue();
}
clip->setProperties(properties);
- emit addProjectClip(clip);
+ emit addProjectClip(clip, false);
}
}
return result;
}
+void KdenliveDoc::cachePixmap(const QString &fileId, const QPixmap &pix) const {
+ pix.save(m_projectFolder.path() + "/thumbs/" + fileId + ".png");
+}
+
+
#include "kdenlivedoc.moc"
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;
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&);
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 &)));
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 &)));
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);
void clearProperty(const QString &key);
const QString groupName() const;
void setGroupName(const QString name);
+ QString getClipHash() const;
private:
QString m_groupname;
}
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()));
}
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()));
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()));
}
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) {
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);