From: Jean-Baptiste Mardelle Date: Wed, 19 May 2010 21:56:31 +0000 (+0000) Subject: Improve reloading of externally modified clips (wait for 1.5 second before reloading... X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=856f46341a3659ec6b5ccc4696b4c0bf358e6b9b;p=kdenlive Improve reloading of externally modified clips (wait for 1.5 second before reloading, replace thumb by a "reload" icon) svn path=/trunk/kdenlive/; revision=4456 --- diff --git a/src/clipmanager.cpp b/src/clipmanager.cpp index f4dce647..cedf7fe9 100644 --- a/src/clipmanager.cpp +++ b/src/clipmanager.cpp @@ -44,9 +44,11 @@ ClipManager::ClipManager(KdenliveDoc *doc) : { m_clipIdCounter = 1; m_folderIdCounter = 1; + m_modifiedTimer.setInterval(1500); connect(&m_fileWatcher, SIGNAL(dirty(const QString &)), this, SLOT(slotClipModified(const QString &))); connect(&m_fileWatcher, SIGNAL(deleted(const QString &)), this, SLOT(slotClipMissing(const QString &))); connect(&m_fileWatcher, SIGNAL(created(const QString &)), this, SLOT(slotClipAvailable(const QString &))); + connect(&m_modifiedTimer, SIGNAL(timeout()), this, SLOT(slotProcessModifiedClips())); } ClipManager::~ClipManager() @@ -65,20 +67,21 @@ void ClipManager::clear() m_folderIdCounter = 1; m_folderList.clear(); m_audioThumbsQueue.clear(); + m_modifiedClips.clear(); } void ClipManager::checkAudioThumbs() { if (!KdenliveSettings::audiothumbnails()) { - if (!m_generatingAudioId.isEmpty()) { - DocClipBase *clip = getClipById(m_generatingAudioId); - if (clip) clip->slotClearAudioCache(); - } + if (!m_generatingAudioId.isEmpty()) { + DocClipBase *clip = getClipById(m_generatingAudioId); + if (clip) clip->slotClearAudioCache(); + } m_audioThumbsQueue.clear(); m_generatingAudioId.clear(); - return; + return; } - + for (int i = 0; i < m_clipList.count(); i++) { m_audioThumbsQueue.append(m_clipList.at(i)->getId()); } @@ -500,12 +503,34 @@ QDomElement ClipManager::groupsXml() const void ClipManager::slotClipModified(const QString &path) { - // kDebug() << "// CLIP: " << path << " WAS MODIFIED"; + //kDebug() << "// CLIP: " << path << " WAS MODIFIED"; const QList list = getClipByResource(path); for (int i = 0; i < list.count(); i++) { DocClipBase *clip = list.at(i); - if (clip != NULL) emit reloadClip(clip->getId()); + if (clip != NULL) { + QString id = clip->getId(); + if (!m_modifiedClips.contains(id)) + emit modifiedClip(id); + m_modifiedClips[id] = QTime::currentTime(); + } + } + if (!m_modifiedTimer.isActive()) m_modifiedTimer.start(); +} + +void ClipManager::slotProcessModifiedClips() +{ + if (!m_modifiedClips.isEmpty()) { + QMapIterator i(m_modifiedClips); + while (i.hasNext()) { + i.next(); + if (QTime::currentTime().msecsTo(i.value()) <= -1500) { + emit reloadClip(i.key()); + m_modifiedClips.remove(i.key()); + break; + } + } } + if (m_modifiedClips.isEmpty()) m_modifiedTimer.stop(); } void ClipManager::slotClipMissing(const QString &path) diff --git a/src/clipmanager.h b/src/clipmanager.h index 943d6a56..fe214673 100644 --- a/src/clipmanager.h +++ b/src/clipmanager.h @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -103,9 +104,12 @@ public slots: void updatePreviewSettings(); private slots: + /** A clip was externally modified, monitor for more changes and prepare for reload */ void slotClipModified(const QString &path); void slotClipMissing(const QString &path); void slotClipAvailable(const QString &path); + /** Check the list of externally modified clips, and process them if they were not modified in the last 1500 milliseconds */ + void slotProcessModifiedClips(); private: // Private attributes /** the list of clips in the document */ @@ -120,9 +124,14 @@ private: // Private attributes int m_folderIdCounter; QString m_generatingAudioId; KDirWatch m_fileWatcher; + /** Timer used to reload clips when they have been externally modified */ + QTimer m_modifiedTimer; + /** List of the clip IDs that need to be reloaded after being externally modified */ + QMap m_modifiedClips; signals: void reloadClip(const QString &); + void modifiedClip(const QString &); void missingClip(const QString &); void availableClip(const QString &); void checkAllClips(); diff --git a/src/documentchecker.cpp b/src/documentchecker.cpp index 2bd6f7e0..0496e61a 100644 --- a/src/documentchecker.cpp +++ b/src/documentchecker.cpp @@ -105,8 +105,8 @@ bool DocumentChecker::hasMissingClips() for (int i = 0; i < trans.count(); i++) { QString luma = getProperty(trans.at(i).toElement(), "luma"); if (!luma.isEmpty()) { - if (!luma.startsWith('/')) luma.prepend(root); - if (!QFile::exists(luma) && !missingLumas.contains(luma)) { + if (!luma.startsWith('/')) luma.prepend(root); + if (!QFile::exists(luma) && !missingLumas.contains(luma)) { missingLumas.append(luma); } } diff --git a/src/projectlist.cpp b/src/projectlist.cpp index 6fcbd91a..5fb48f09 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -395,6 +395,14 @@ void ProjectList::slotReloadClip(const QString &id) } } +void ProjectList::slotModifiedClip(const QString &id) +{ + ProjectItem *item = getItemById(id); + if (item) { + item->setData(0, Qt::DecorationRole, KIcon("view-refresh").pixmap(m_listView->iconSize())); + } +} + void ProjectList::slotMissingClip(const QString &id) { ProjectItem *item = getItemById(id); @@ -1165,6 +1173,7 @@ void ProjectList::setDocument(KdenliveDoc *doc) m_listView->blockSignals(false); m_toolbar->setEnabled(true); connect(m_doc->clipManager(), SIGNAL(reloadClip(const QString &)), this, SLOT(slotReloadClip(const QString &))); + connect(m_doc->clipManager(), SIGNAL(modifiedClip(const QString &)), this, SLOT(slotModifiedClip(const QString &))); connect(m_doc->clipManager(), SIGNAL(missingClip(const QString &)), this, SLOT(slotMissingClip(const QString &))); connect(m_doc->clipManager(), SIGNAL(availableClip(const QString &)), this, SLOT(slotAvailableClip(const QString &))); connect(m_doc->clipManager(), SIGNAL(checkAllClips()), this, SLOT(updateAllClips())); diff --git a/src/projectlist.h b/src/projectlist.h index a4ad6b1c..6b38f01a 100644 --- a/src/projectlist.h +++ b/src/projectlist.h @@ -237,6 +237,8 @@ private slots: void slotProcessNextThumbnail(); void slotCheckForEmptyQueue(); void slotPauseMonitor(); + /** A clip was modified externally, change icon so that user knows it */ + void slotModifiedClip(const QString &id); void slotMissingClip(const QString &id); void slotAvailableClip(const QString &id); //void slotShowMenu(const QPoint &pos);