]> git.sesse.net Git - kdenlive/blobdiff - src/clipmanager.cpp
Allow to add image sequence through the usual "add clip" dialog
[kdenlive] / src / clipmanager.cpp
index f4dce6475b974bb258cda5e9143fd0dad83dd630..2e9367b9eb84c2842bbac02a76daab5c0baad67e 100644 (file)
@@ -36,6 +36,8 @@
 
 #include <QGraphicsItemGroup>
 
+#include <KFileMetaInfo>
+
 ClipManager::ClipManager(KdenliveDoc *doc) :
         QObject(),
         m_audioThumbsQueue(),
@@ -44,9 +46,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 +69,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());
     }
@@ -289,6 +294,14 @@ void ClipManager::slotAddClipList(const KUrl::List urls, const QString group, co
                 prod.setAttribute("type", (int) IMAGE);
                 prod.setAttribute("in", 0);
                 prod.setAttribute("out", m_doc->getFramePos(KdenliveSettings::image_duration()) - 1);
+                // Read EXIF metadata for JPEG
+                if (type->is("image/jpeg")) {
+                    KFileMetaInfo metaInfo(file.path(), QString("image/jpeg"), KFileMetaInfo::TechnicalInfo);
+                    const QHash<QString, KFileMetaInfoItem> metaInfoItems = metaInfo.items();
+                    foreach(const KFileMetaInfoItem& metaInfoItem, metaInfoItems) {
+                        prod.setAttribute("meta.attr." + metaInfoItem.name().section("#", 1), metaInfoItem.value().toString());
+                    }
+                }
             } else if (type->is("application/x-kdenlivetitle")) {
                 // opening a title file
                 QDomDocument txtdoc("titledocument");
@@ -303,7 +316,7 @@ void ClipManager::slotAddClipList(const KUrl::List urls, const QString group, co
                     if (out > 0)
                         prod.setAttribute("out", out);
                     else
-                        prod.setAttribute("out", m_doc->getFramePos(KdenliveSettings::image_duration()) - 1);
+                        prod.setAttribute("out", m_doc->getFramePos(KdenliveSettings::title_duration()) - 1);
                 } else
                     txtfile.close();
             }
@@ -321,6 +334,22 @@ void ClipManager::slotAddClipFile(const KUrl url, const QString group, const QSt
     slotAddClipList(KUrl::List(url), group, groupId);
 }
 
+void ClipManager::slotAddXmlClipFile(const QString name, const QDomElement xml, const QString group, const QString &groupId)
+{
+    QDomDocument doc;
+    doc.appendChild(doc.importNode(xml, true));
+    QDomElement prod = doc.documentElement();
+    prod.setAttribute("type", (int) PLAYLIST);
+    uint id = m_clipIdCounter++;
+    prod.setAttribute("id", QString::number(id));
+    prod.setAttribute("name", name);
+    if (!group.isEmpty()) {
+        prod.setAttribute("groupname", group);
+        prod.setAttribute("groupid", groupId);
+    }
+    AddClipCommand *command = new AddClipCommand(m_doc, doc.documentElement(), QString::number(id), true);
+    m_doc->commandStack()->push(command);
+}
 
 void ClipManager::slotAddColorClipFile(const QString name, const QString color, QString duration, const QString group, const QString &groupId)
 {
@@ -500,12 +529,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)