]> git.sesse.net Git - kdenlive/commitdiff
Improve reloading of externally modified clips (wait for 1.5 second before reloading...
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 19 May 2010 21:56:31 +0000 (21:56 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 19 May 2010 21:56:31 +0000 (21:56 +0000)
svn path=/trunk/kdenlive/; revision=4456

src/clipmanager.cpp
src/clipmanager.h
src/documentchecker.cpp
src/projectlist.cpp
src/projectlist.h

index f4dce6475b974bb258cda5e9143fd0dad83dd630..cedf7fe98c7e1b60e580b9d49de1b961fe952e1b 100644 (file)
@@ -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 <DocClipBase *> 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<QString, QTime> 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)
index 943d6a56e7c6ac3736593f5a4252b986e5879efa..fe214673835f2a56af23782e9c800e56cb8d279e 100644 (file)
@@ -29,6 +29,7 @@
 #include <qdom.h>
 #include <QPixmap>
 #include <QObject>
+#include <QTimer>
 
 #include <KUrl>
 #include <KUndoStack>
@@ -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 <QString, QTime> m_modifiedClips;
 
 signals:
     void reloadClip(const QString &);
+    void modifiedClip(const QString &);
     void missingClip(const QString &);
     void availableClip(const QString &);
     void checkAllClips();
index 2bd6f7e033deb56314728f298f62706b0d0e3dd0..0496e61ae6dfdb8e20912d0350f52166b923f5be 100644 (file)
@@ -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);
             }
         }
index 6fcbd91a9fe0887418245ede1526ca611f7a967d..5fb48f090eb8a31478e86ee0f5616378f1430aef 100644 (file)
@@ -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()));
index a4ad6b1cfb62e948f96d26fd14d84c0a98201011..6b38f01a7b8d02446dd0857e73625f7b9a3278b1 100644 (file)
@@ -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);